Break down what people mean so that you can learn from the specifics

People are vague. You are vague. I am vague. We say things without digging into the details; we often use the first word that comes to mind. This makes sense — otherwise, we’d spend all our time clarifying.

You can learn a lot from digging into things and making them more specific. (… she writes, self-conscious about the use of the vaguest word of all: “things.”)

I’m fascinated by the challenge of understanding what people mean. I realized this while looking at it from two different directions:

  • When someone give an excuse like “It takes too much time,” what’s the excuse behind the excuse, and how can we address that?
  • When someone gives a compliment like “Thank you for sharing an inspiring post,” what kind of inspiring was it, and how can I get better at that?

Let me start with the example of inspiration, because it’s something I want to translate into concrete feedback and action. I thought about the different responses I have to things that inspire me.

2015-01-14 Understanding different types of inspiration -- index card #inspiration #breakdown

2015-01-14 Understanding different types of inspiration – index card #inspiration #breakdown

  • Idea: Inspiration might mean coming across something I didn’t even know I wanted. Now that I know it’s possible, I can work toward it. (This happens a lot with Emacs, which is why I like reading Planet Emacsen)
  • Clarity: Seeing other people who have reached my goals (or who’ve travelled further down the path) helps me understand those goals better. What do I really want? What are some ways I can get there? I can see that more clearly thanks to other people who have illuminated the path. (Talking to executives helped me realize I don’t want to be one.)
  • Alternatives: Inspiration can help me see different ways of doing something. For example, I looked at ways other people coloured their sketchnotes and picked several techniques to try.
  • Beginning: Inspiration can show me that something is less intimidating than I thought it was. It can help me figure out a good place to start and give me the courage to do it. Programming tutorials help me get through the initial challenges of a new framework.
  • Action: Inspiration can move me to act on something. I already know it’s a good idea and I’ve been meaning to do it, but sometimes I need that extra push. Comments with questions and suggestions help me a lot.
  • Perseverance: Sometimes I can feel lost or discouraged. Remembering that other people have dealt with bigger challenges helps me address my anxiety, focus on my goals or my progress, and keep going. Anecdotes are easy to find.
  • Hero worship: I often come across stuff that looks so awesome, I don’t think I could ever do anything like it. This is the type of “inspiration” we tend to get bombarded with. This is the least useful kind of inspiration, I think. It takes a little work to transform it into the kind of inspiration I can use: I need to reflect on what part of it resonates with and how I can incorporate a little of that into my life.

In what ways do I want to inspire others? How can I get better at that?

  • I like inspiring with ideas, playing with what’s possible. I can get better at that by sharing more of these little tweaks.
  • I think out loud in order to help people with clarity. I sketch out the reasons and consequences of my choices so that other people can learn without necessarily having to make all those choices themselves.
  • I explore and summarize alternatives so that people can use that to figure out what might fit them. I can get better at that by researching what other people have done, generating a few new ideas (possibly by combining other ideas), and testing things out so that I can share my experiences.
  • I break things down to help people with beginning. This is why I like addressing the “Yeah, but…”s, the excuses, the things that get in people’s way. This is also why I like sharing ideas, because that can help pull people forward.
  • I’d love to get better at moving people to action. I haven’t given this as much thought yet, but I think it’s the most important.
  • I don’t have much to share in terms of perseverance. I’ve been very lucky.
  • I definitely don’t want to be in the region of hero worship. It creates too much distance and can shut down action.

Breaking a general statement down into more specific statements helps me learn a lot. I ask myself: “What would I or someone say that captures a different aspect of this?” and I write that down. When I split off different aspects, I can understand those aspects better, and I can understand the whole thing better too.

This technique is good to use for excuses, too.

2015-01-14 Breaking down excuses -- index card #excuses #breakdown

2015-01-14 Breaking down excuses – index card #excuses #breakdown

I’m getting better at catching myself when I give an excuse, drilling down with “Why?” and splitting it out into different excuses. (I guess, thanks to my parents’ patience, my inner toddler never stopped asking questions.) Then I can check if those excuses match what’s getting in my way, or if they don’t resonate with me.

A technique I often use is to imagine other people giving those excuses, since sometimes my mind is perfectly willing to ascribe weakness to others even when it gets defensive about itself. ;)

I like sharing these excuses because that might help other people get over theirs. It’s often easier to recognize one of your excuses instead of trying to articulate it yourself. “That’s it! That’s what’s getting in my way!” you might say. Or even if you don’t find something that completely fits, you might find something close, and then you can ask yourself: “What’s missing here?”

For example, what does it mean when someone says something “takes too much time”? What’s really getting in their way? Here are some ideas I came up with:

2015-01-14 What does it mean when something takes too much time -- index card #excuses #breakdown

2015-01-14 What does it mean when something takes too much time – index card #excuses #breakdown

“Too much time” is too vague to address. On the other hand, if you think something takes too much time because you’re trying to do something complicated, you might be able to ask yourself: “What do I really need? Can I get away with doing something simpler?” and then reduce the task to something small enough for you to get started with.

Break things down. Find the statement behind the statement or the excuse behind the excuse, and you’ll have more to work with. Instead of getting frustrated because you can’t come up with one specific answer, come up with lots of them, and then see if you recognize yourself in any of them. Almost there, but not quite? Come up with more answers, maybe combining aspects of the ones you already have. This will not only help you understand yourself, but also understand others–and help others understand themselves and you.

If you find my posts inspiring, would you consider helping me understand more about what kind of inspiration you get and how I can get better at it? If you’re reading this because you recognize one of your excuses in it, would you mind figuring out what your more specific reasons are and what could address them? I’d love to hear from you in the comments below. Thanks!

Experimental Emacs Hangout 2015-02-18

In which we talked about Hydra (0:11), Helm (0:22), packages (0:25), Quelpa/quse-package (0:29), EWW (0:30), Org Mode (0:40), global-flycheck-mode (0:51), widget, TRAMP (1:15), conferences/hangouts (1:26), more Hydra (1:28), Emacs Lisp (1:32), command-history (1:35), Emacs (1:38), plans for getting better (1:44), latexmk (1:49), and other things. (Times are approximate.)

Other questions/comments:

  • Not a question, but I just learned about command-history. Which is a great way to whip up a function. I’m amazed that I just discovered it. – Jonathan Hill
  • I saw something in 24.4 change log about a notification system. Could that maybe solve your problem? – Mitchell Hunter
  • On Air viewers cannot see Sasha due to Sridhar presenting. – Marc Tamsky
  • Anyone using tabs? – Levi Strope

The next Emacs Hangout will be on March 18, 2015, at 8 PM Toronto time (12 midnight GMT) https://plus.google.com/u/0/events/cbj3rg26d8j9ifaiff5uq00ncr4

Want to get notified about upcoming hangouts? You can sign up for notifications at http://eepurl.com/bbi-Ir . We’ll experiment with starting off with a mini-workshop/demo of Org tasks and agenda (or maybe Helm, if that’s more interesting).

Text chat:

JJ Asghar 8:01 PM Russell: http://blog.binchen.org/posts/notes-on-using-gnus.html
Sridhar Ratnakumar 8:01 PM http://www.srid.ca/emacs/
Michael Hoffman 8:03 PM hi sorry i need to hook up my camera
Jason Lewis 8:04 PM https://marmalade-repo.org/packages/winner-mode-enable
Michael Hoffman 8:05 PM brb tech issues
Michael Hoffman 8:07 PM sorry guys looks like my mic isn’t going to work without a reboot sure, thanks so much
Michael Hoffman 8:08 PM can someone repost that gmail/gnus link? that sounded awesome
Sridhar Ratnakumar 8:08 PM http://blog.binchen.org/posts/notes-on-using-gnus.html
Michael Hoffman 8:09 PM thanks Sridhar
Bob Erb 8:09 PM ace-jump-mode
Michael Hoffman 8:12 PM I find `guide-key-mode` very helpful for remembering keybindings as well
Sridhar Ratnakumar 8:13 PM https://github.com/abo-abo/hydra
Michael Hoffman 8:14 PM Sacha can you increase your font siz e? thanks
Michael Hoffman 8:19 PM that’s just an example this is my guide-key setup (require-package guide-key guide-key) (setq guide-key/guide-key-sequence ‘(“C-x” “C-c”)) (setq guide-key/recursive-key-sequence-flag t) (setq guide-key/idle-delay 0.7)
Sridhar Ratnakumar 8:20 PM pretty useful
Michael Hoffman 8:20 PM I don’t see any reason why not to set it up for everything C-x if you set it up with an idle-delay of 0.7 or something then it usually won’t bother you unless you can’t remember
JJ Asghar 8:23 PM ;; i need tab complete (define-key helm-map (kbd “<tab>”) ‘helm-execute-persistent-action)
Sridhar Ratnakumar 8:23 PM thx
JJ Asghar 8:23 PM
Sridhar Ratnakumar 8:23 PM (we are talking about https://github.com/emacs-helm )
Michael Hoffman 8:25 PM has anyone tried the eww web browser it’s definitely a curiosity more than a useful thing
Russell Black 8:25 PM I agree
Michael Hoffman 8:25 PM although i can see cases where it would be useful i keep my .emacs in version control
me 8:26 PM I’ve tried eww a little bit, but I haven’t quite gotten the hang of using it.
Michael Hoffman 8:26 PM i set up a macro to require or install a package
Jacob MacDonald 8:26 PM https://github.com/jaccarmac/quse-package
me 8:26 PM Mostly I just use browse-url to open things in Chrome
Michael Hoffman 8:27 PM ;; XXX: seems to hang when trying to (package-install) at compile time? (defmacro require-package (feature &optional package) “Require FEATURE or `package-install` PACKAGE. Default PACKAGE is FEATURE.” ;; for debugging (message “(require-package %s %s)” feature package) (let ((package (or package feature))) ; XXX: can I have a macro produce multiple forms instead of nesting like this? `(eval-and-compile (eval-when-compile (unless (or (require ‘,feature nil t) (fboundp ‘flycheck-byte-compile-dest-file)) ; don’t run within flycheck (package-install ‘,package))) (require ‘,feature nil t)))) WARNING: does not always work i gotta run guys, this has been great thanks so much sacha
Jacob MacDonald 8:28 PM See ya!
me 8:28 PM Bye, Michael! Oops, missed him
Jacob MacDonald 8:29 PM https://github.com/jaccarmac/dot-emacs-dot-d
me 8:30 PM Hi Howard!
Jacob MacDonald 8:31 PM I used Conkerer for a few months to get the Emacs experience with a decent frontend for JS, etc.
Sridhar Ratnakumar 8:32 PM eww renders images fine; but the layout is not correct
Russell Black 8:32 PM I have to run to an appointment. Thanks guys!
Howard Abrams 8:33 PM Never renders perfectly,. but if you are selective in what you are browsing, it is useful for things like programming documentation that fails to supply a info version.
[email protected] 8:33 PM jittery audio. reconnecting..
[email protected] 8:34 PM i can’t hear anyone
Sod Oscarfono 8:39 PM how about time tracking sacha?
Sridhar Ratnakumar 8:39 PM how many people here already use org-mode?
Jacob MacDonald 8:39 PM I use it primarily for literate programming and a little for note taking.
Sod Oscarfono 8:39 PM i love org-mode! couldn’t live without it
Bob Erb 8:40 PM couldn’t live w/o org-capture – allows mind like water
Sod Oscarfono 8:41 PM sorry no mic or camera here, but that is exactly what i needed thanks Sridhar!
me 8:45 PM Yay!
Sridhar Ratnakumar 8:45 PM Pomodoro org-pomodor
Sod Oscarfono 8:47 PM great stuff thanks Sridhar!
Jacob MacDonald 8:52 PM I’m interested in getting my config to work across multiple OSs. The “correct ” thing to do is to (defvar variable) i believe
Sridhar Ratnakumar 8:52 PM I’m yet to use emacs for git
Jacob MacDonald 8:52 PM It’s like any other linter, you have to prioritize the messages.
Sridhar Ratnakumar 8:53 PM anyone using Emacs 25? apparently supports concurrency
Jacob MacDonald 8:53 PM I build Emacs from Git, so that’s … fun Look at the use-package source .
Bob Erb 8:57 PM (when (memq window-system ‘(mac ns)) (exec-path-from-shell-initialize))
Sod Oscarfono 8:57 PM i just stick to nix based systems so that saves me any hassle there
Sod Oscarfono 9:04 PM you seasoned professionals maybe already know this but i recently discovered the ability to export org to open office docs and pdfs from org: C-c C-e o for open office C-c C-e p for pdf.
Jason Lewis 9:05 PM @sridhar, magit is really nice for using git from emacs
Sridhar Ratnakumar 9:06 PM http://www.srid.ca/emacs/ is generated from C-c C-e h h
Sod Oscarfono 9:10 PM hahaha… there’s an app for that -itis!
Bob Erb 9:11 PM there’s a mode for that
Jacob MacDonald 9:18 PM I’m out. Thanks for the great discussion! I hope to have more to contribute in the future.
Sod Oscarfono 9:18 PM do you key forward also in bash?
Sridhar Ratnakumar 9:18 PM Howard – what font do you use in Emacs, per the screenshot in http://www.howardism.org/Technical/Emacs/literate-devops.html ?
Jason Lewis 9:19 PM https://github.com/adobe-fonts/source-code-pro
Sod Oscarfono 9:25 PM workflow/project and time management/ literate programming. maybe a session where we scrutinize/optimise init files ? we spoke a bit about it already but its always good
Sod Oscarfono 9:30 PM i concur.. thanks sacha
Sod Oscarfono 9:32 PM cut and paste ninja over here.. hahaha
Jason Lewis 9:33 PM I’ve still not managed to make the jump to writing much lisp hope to one day
Bob Erb 9:34 PM URL for Sacha’s book?
me 9:34 PM http://sachachua.com/read-lisp-tweak-emacs
Jason Lewis 9:35 PM cool nice tip thanks
Zachary Kanfer 9:36 PM http://emacsnyc.org/videos.html#2014-06
Howard Abrams 9:40 PM http://www.howardism.org/Technical/Emacs/tao-of-emacs.html
Sod Oscarfono 9:40 PM for those who like sublime style layout i use the graphene starter kit which i think bundles “projectile” … i think.. bad memory sorry… anyways it is now my must have next to org-mode
Sod Oscarfono 9:41 PM i show those people org-mode and that usually gets them interseted
me 9:41 PM Sod: Nice!
Sod Oscarfono 9:42 PM for me the prospect of never having to change screens… ie buffers at will
Sod Oscarfono 9:43 PM yea and just being able to fire up a familiar environment on other systems is super pro
Bob Erb 9:46 PM Cat!
Sod Oscarfono 9:46 PM i’m currently experimenting with desktop publishing from emacs
Zachary Kanfer 9:48 PM my init file: https://bitbucket.org/zck/.emacs.d
Sod Oscarfono 9:48 PM org-mode to pdf to bypass creative cloud / scribus.. but learning latex also. ah thats what i needed to hear cheers jason for sure.. i’m glad i stopped by maybe we also look at where is emacs deficient? can we collaborate on a tool, a bug or whatever. good idea. or we spit out our command history for ideas
Jonathan Hill 9:53 PM I missed all the great suggestions.
Bob Erb 9:56 PM Thank you, Sacha.
Sod Oscarfono 9:56 PM thank you all so much
Jason Lewis 9:57 PM thanks Sacha! bye
Zachary Kanfer 9:57 PM bye! Thanks again, Sacha!

Windows: Pipe output to your clipboard, or how I’ve been using NodeJS and Org Mode together

It’s not easy being on Windows instead of one of the more scriptable operating systems out there, but I stay on it because I like the drawing programs. Cygwin and Vagrant fill enough gaps to keep me mostly sane. (Although maybe I should work up the courage to dual-boot Windows 8.1 and a Linux distribution, and then get my ScanSnap working.)

Anyway, I’m making do. Thanks to Node and the abundance of libraries available through NPM, Javascript is shaping up to be a surprisingly useful scripting language.

After I used the Flickr API library for Javascript to cross-reference my Flickr archive with my blog posts, I looked around for other things I could do with it. photoSync occasionally didn’t upload new pictures I added to its folders (or at least, not as quickly as I wanted). I wanted to replace photoSync with my own script that would:

  • upload the picture only if it doesn’t already exist,
  • add tags based on the filename,
  • add the photo to my Sketchbook photoset,
  • move the photo to the “To blog” folder, and
  • make it easy for me to refer to the Flickr image in my blog post or index.

The flickr-with-uploads library made it easy to upload images and retrieve information, although the format was slightly different from the Flickr API library I used previously. (In retrospect, I should’ve checked the Flickr API documentation first – there’s an example upload request right on the main page. Oh well! Maybe I’ll change it if I feel like rewriting it.)

I searched my existing photos to see if a photo with that title already existed. If it did, I displayed an Org-style list item with a link. If it didn’t exist, I uploaded it, set the tags, added the item to the photo set, and moved it to the folder. Then I displayed an Org-style link, but using a plus character instead of a minus character, taking advantage of the fact that both + and – can be used for lists in Org.

While using console.log(...) to display these links in the terminal allowed me to mark and copy the link, I wanted to go one step further. Could I send the links directly to Emacs? I looked into getting org-protocol to work, but I was having problems figuring this out. (I solved those problems; details later in this post.)

What were some other ways I could get the information into Emacs aside from copying and pasting from the terminal window? Maybe I could put text directly into the clipboard. The node-clipboard package didn’t build for me and I couldn’t get node-copy-paste to work either,about the node-copy-paste README told me about the existence of the clip command-line utility, which worked for me.

On Windows, clip allows you to pipe the output of commands into your clipboard. (There are similar programs for Linux or Mac OS X.) In Node, you can start a child process and communicate with it through pipes.

I got a little lost trying to figure out how to turn a string into a streamable object that I could set as the new standard input for the clip process I was going to spawn, but the solution turned out to be much simpler than that. Just write(...) to the appropriate stream, and call end() when you’re done.

Here’s the relevant bit of code that takes my result array and puts it into my clipboard:

var child = cp.spawn(‘clip’); child.stdin.write(result.join(“\n”)); child.stdin.end();

Of course, to get to that point, I had to revise my script. Instead of letting all the callbacks finish whenever they wanted, I needed to be able to run some code after everything was done. I was a little familiar with the async library, so I used that. I copied the output to the clipboard instead of displaying it so that I could call it easily using ! (dired-do-shell-command) and get the output in my clipboard for easy yanking elsewhere, although I could probably change my batch file to pipe the result to clip and just separate the stderr stuff. Hmm. Anyway, here it is!

See this on Github

/**
 * Upload the file to my Flickr sketchbook and then move it to
 * Dropbox/Inbox/To blog. Save the Org Mode links in the clipboard. -
 * means the photo already existed, + means it was uploaded.
 */

var async = require('async');
var cp = require('child_process');
var fs = require('fs');
var glob = require('glob');
var path = require('path');
var flickr = require('flickr-with-uploads');
var secret = require("./secret");
var SKETCHBOOK_PHOTOSET_ID = '72157641017632565';
var BLOG_INBOX_DIRECTORY = 'c:\\sacha\\dropbox\\inbox\\to blog\\';
var api = flickr(secret.flickrOptions.api_key,
                 secret.flickrOptions.secret,
                 secret.flickrOptions.access_token,
                 secret.flickrOptions.access_token_secret);
var result = [];

function getTags(filename) {
  var tags = [];
  var match;
  var re = new RegExp('#([^ ]+)', 'g');
  while ((match = re.exec(filename)) !== null) {
    tags.push(match[1]);
  }
  return tags.join(' ');
}
// assert(getTags("foo #bar #baz qux") == "bar baz");

function checkIfPhotoExists(filename, doesNotExist, existsFunction, done) {
  var base = path.basename(filename).replace(/.png$/, '');
  api({method: 'flickr.photos.search',
       user_id: secret.flickrOptions.user_id,
       text: base},
      function(err, response) {
        var found = undefined;
        if (response && response.photos[0].photo) {
          for (var i = 0; i < response.photos[0].photo.length; i++) {
            if (response.photos[0].photo && response.photos[0].photo[i]['$'].title == base) {
              found = i; break;
            }            
          }
        }
        if (found !== undefined) {
          existsFunction(response.photos[0].photo[found], done);
        } else {
          doesNotExist(filename, done);
        }
      });
}

function formatExistingPhotoAsOrg(photo, done) {
  var title = photo['$'].title;
  var url = 'https://www.flickr.com/photos/'
        + photo['$'].owner
        + '/' + photo['$'].id;
  result.push('- [[' + url + '][' + title + ']]');
  done();
}

function formatAsOrg(response) {
  var title = response.photo[0].title[0];
  var url = response.photo[0].urls[0].url[0]['_'];
  result.push('+ [[' + url + '][' + title + ']]');
}

function uploadImage(filename, done) {
  api({
    method: 'upload',
    title: path.basename(filename.replace(/.png$/, '')),
    is_public: 1,
    hidden: 1,
    safety_level: 1,
    photo: fs.createReadStream(filename),
    tags: getTags(filename.replace(/.png$/, ''))
  }, function(err, response) {
    if (err) {
      console.log('Could not upload photo: ', err);
      done();
    } else {
      var newPhoto = response.photoid[0];
      async.parallel(
        [
          function(done) {
            api({method: 'flickr.photos.getInfo',
                 photo_id: newPhoto}, function(err, response) {
                   if (response) { formatAsOrg(response); }
                   done();
                 });
          },
          function(done) {
            api({method: 'flickr.photosets.addPhoto',
                 photoset_id: SKETCHBOOK_PHOTOSET_ID,
                 photo_id: newPhoto}, function(err, response) {
                   if (!err) {
                     moveFileToBlogInbox(filename, done);
                   } else {
                     console.log('Could not add ' + filename + ' to Sketchbook');
                     done();
                   }
                 });
          }],
        function() {
          done();
        });
    }
  });
}

function moveFileToBlogInbox(filename, done) {
  fs.rename(filename, BLOG_INBOX_DIRECTORY + path.basename(filename),
            function(err) {
              if (err) { console.log(err); }
              done();
            });
}

var arguments = process.argv.slice(2);
async.each(arguments, function(item, done) {
  if (item.match('\\*')) {
    glob.glob(item, function(err, files) {
      if (!files) return;
      async.each(files, function(file, done) {
        checkIfPhotoExists(file, uploadImage, formatExistingPhotoAsOrg, done);
      }, function() {
        done();
      });
    });
  } else {
    checkIfPhotoExists(item, uploadImage, formatExistingPhotoAsOrg, done);
  }
}, function(err) {
  console.log(result.join("\n"));
  var child = cp.spawn('clip');
  child.stdin.write(result.join("\n"));
  child.stdin.end();
});

Wheeee! Hooray for automation. I made a Windows batch script like so:

up.bat

node g:\code\node\flickr-upload.js %*

and away I went. Not only did I have a handy way to process images from the command line, I could also mark the files in Emacs Dired with m, then type ! to execute my up command on the selected images. Mwahaha!

Anyway, I thought I’d write it up in case other people were curious about using Node to code little utilities, filling the clipboard in Windows, or getting data back into Emacs (sometimes the clipboard is enough).

Back to org-protocol, since I was curious about it. With (require 'org-protocol) (server-start), emacsclient org-protocol://store-link:/foo/bar worked when I entered it at the command prompt. I was having a hard time getting it to work under Node, but eventually I figured out that:

  • I needed to pass -n as one of the arguments to emacsclient so that it would return right away.
  • The : after store-link is important! I was passing org-protocol://store-link/foo/bar and wondering why it opened up a file called bar. org-protocol://store-link:/foo/bar was what I needed.

I only just figured out that last bit while writing this post. Here’s a small demonstration program:

var cp = require('child_process');
var child = cp.execFile('emacsclient', ['-n', 'org-protocol://store-link:/foo/bar']);

Yay!

2015-01-13 Using Node as a scripting tool -- index card #javascript #nodejs #coding #scripting

2015-01-13 Using Node as a scripting tool – index card #javascript #nodejs #coding #scripting

Learning from people

I have a friend who’s focusing on learning how to ask better questions. Actually, he realized his goal is probably to ask more questions in the first place, since even simple questions (“Where did you come from?”) can lead to interesting stories.

It got me curious about getting better at learning from people. I think this will help me learn about the stuff that I can’t find in books because:

  • New things often aren’t in books
  • There’s a lot of tacit knowledge that’s difficult to capture
  • Sometimes I don’t understand something well enough to research it
  • Talking to people can help me come across things I didn’t know to ask about

2015-01-20 Asking better questions -- index card #asking

2015-01-20 Asking better questions – index card #asking

I think getting better at asking questions and learning from people involves figuring out:

  • what to ask about (spotting opportunities or following curiosities)
  • who to ask
  • how to build rapport
  • how to pick the right time/place/sequence
  • how to frame the question (level of detail, phrasing, etc.)
  • how to follow up

So that gives me specific things to focus on in terms of learning from others and trying things out myself.

I’ve been thinking about two aspects of learning from people: working with mentors/coaches/trainers, and having casual conversations with other people.

2015-01-24 Imagining awesomeness at learning from people -- index card #learning #people

2015-01-24 Imagining awesomeness at learning from people – index card #learning #people

Mentors/coaches/trainers

I’ve been lucky to have many mentors (both formal and informal) who helped me learn how to navigate organizations, find opportunities, build skills, and so on. But I haven’t been as deliberate about learning as I could have been. I periodically consider finding a coach for my writing or coding, but haven’t taken the leap.

I’ve heard from people who weren’t sure if therapy was working out for them; they couldn’t evaluate their progress. I think I’m hesitant for similar reasons. I’m uncertain about choosing candidates, asking useful questions, evaluating the results, and balancing the value and the opportunity cost.

This is precisely the sort of situation for which an opportunity fund is useful, because it pushes me to Just Try Things Out. I’m slowly warming up to that idea, hence all the blog posts thinking out loud.

Here are some areas I’m considering:

2015-01-19 Imagining an editing experiment -- index card #delegation #writing #editing

2015-01-19 Imagining an editing experiment – index card #delegation #writing #editing

For example, an editing experiment might help me develop a better mental model of an editor, forcing me to search for more specific vocubulary (down with “stuff”!), testing to see if something I’ve written makes sense, and checking for gaps.

2015-01-24 How can I learn from observation feedback -- index card #learning #people

2015-01-24 How can I learn from observation feedback – index card #learning #people

In addition to directly asking for specific help, I might learn a lot from general observation. A friend suggested Atul Gawande’s Better for its approach to learning: a surgeon inviting other surgeons to observe him and give feedback, even though this technique was mostly used by people with less experience. It makes sense to do that even when you’re more experienced, and it’s probably even more useful because people can swap tips or explain things they unconsciously do.

Other people

2015-01-24 Mixed feelings about learning from people -- index card #learning #people

2015-01-24 Mixed feelings about learning from people – index card #learning #people

I noticed that I have a strong bias towards online conversations instead of offline ones. Sure, online conversations might be lower-bandwidth or not as nuanced. But blog posts and comments expand the conversations to include other people, and it’s easier to follow up on threads of ideas. I think this preference is among the reasons why, compared to several years ago, I now spend much less time going to parties or meetups. Instead, I focus on writing and connecting online.

But I get plenty of writing time already, so maybe I should mix more offline conversations into my life. This would follow the principle that I shouldn’t always do what’s fun and easy. It makes sense to develop skills and routines in other areas as well. For example, I can imagine getting better at cultivating acquaintances through shared activities like cooking at Hacklab and hosting board game afternoons. I can test and refine several quick stories for small talk, which frees me up to focus on learning more about the other person through questions. It’s like the way foreign language learners can boost their feeling of fluency by anticipating common questions (“Where are you from?” “What do you do?”) and practising answers to those.

I think that getting better at asking questions and learning from people starts mostly from getting to know people as individuals. What makes them different? What’s interesting about their lives? There’s always something to find. The next step after that is to gradually build the acquaintance or the friendship through things like lunches or get-togethers. It makes sense to open my world so that I can come across good people. I enjoy their company, I grow in helping out, and I learn from the conversations with them and the mental models of them.

More thoughts

2015-01-25 Learning from people -- index card #learning #people

Thinking about this, I realized that I’m not bad at learning from people. I’m pretty good at learning from books, blogs, and online conversations, which is why I rely on those so much. But there are some aspects of learning from people that I can improve, and I can play around with those without cutting too much into the time I spend learning in other ways.

Org Mode: Reusing the date from file-datetree-prompt

Update 2015-02-17: Or you can just use %t in your org-capture-templates, as Seth Mason points out in the comments… =)

How can you get Org Mode to create and schedule entries within a year-month-day outline structure? You can define an org-capture-templates with the keyword file+datetree+prompt. This lets you specify a date for your entry, and Org will create the entry in a hierarchy organized by year, month, and day.

If you’d like to display the entry in your agenda, you’ll also need an active timestamp of the form <yyyy-mm-dd>. Fortunately, you can reuse the date you specified at the initial prompt to create the datetree entry. Looking at org-capture.el will show you that the org-capture function refers to the org-read-date-final-answer, which is set to whatever string you entered at the date prompt. For example, if you entered 18, then org-read-date-final-answer will be set to 18. You can use org-read-date to convert this back to a yyyy-mm-dd-style date.

How do you use this in org-capture-templates? You can use the %(...) syntax for calling an Emacs Lisp expression, like so:

(setq org-capture-templates '(
  ;; other entries go here
  ("s" "Journal entry with date, scheduled" entry
   (file+datetree+prompt "~/personal/journal.org")
    "* %^{Title}\n<%(org-read-date nil nil org-read-date-final-answer)>\n%i\n%?\n")))

Here’s sample output from that capture template:

* 2015
** 2015-12 December
*** 2015-12-31 Thursday
**** End of the year party!
<2015-12-31>

Thanks to Sean Miller for the nudge to think about this!

Sketched Book: Take Charge of Your Talent: Three Keys to Thriving in Your Career, Organization, and Life – Don Maruska, Jay Perry (2013)

Don Maruska and Jay Perry’s Take Charge of Your Talent: Three Keys to Thriving in Your Career, Organization, and Life (2013) has plenty of tips for developing your skills and taking charge of your career. I’ve sketched the key points of the book below to make it easier to remember and share. Click on the image for a larger version that you can print if you want.

2014-12-25 Sketched Book - Take Charge of Your Talent - Three Keys to Thriving in Your Career, Organization, and Life - Don Maruska and Jay Perry

I liked the chapter on reflecting on your talents through a structured conversation with someone who can reflect back not only your words but also your feelings and hopes. Sometimes we don’t see the patterns in our thoughts until someone points it out to us. The questions are also good for personal reflection, and I’m looking forward to using them in my planning.

Sometimes people ask me to help them figure out what they want to do. Other books I’ve read about coaching tend to be pretty high-level, but this one gives concrete advice, including some notes anticipating potential responses or difficulties.

I also liked the chapters on creating tangible assets and sharing them with other people. That’s been a great learning- and career-booster for me, and I hope other people will try it out as well.

Among other things, the book also suggests listing at least one hundred resources (people, places, things, skills, …). Forced-length lists are great for creativity because you dig deeper than your surface answers, often coming across surprises. When you review your list, think about ways that you could make even better use of those resources. The book also suggests taking a look at your top 10 resources and working towards 100% use of them, which will be an interesting challenge. The third related exercise is to combine different resources so that you can break through obstacles or come up with interesting mash-ups – forced association, another great creativity technique. I like this reminder to apply creativity so that you can recognize and make the most of your resources, which allows you to MacGyver your way to growth.

Want the book? You can buy it from Amazon (affiliate link) or check out their website at .

Like this sketch? Check out sketchedbooks.com for more. Feel free to share – it’s under the Creative Commons Attribution License, like the rest of my blog.

Enjoy!