## Graphing retweets with Python and GraphViz

On the microblogging site twitter, a blog post is called an update, or informally, a tweet. When someone copies a tweet and posts it to their twitter feed, it’s called a retweet. Sometimes opinions are retweeted by those who share them, other times it’s information, and other times it’s silly memes. This evening, a local friend of mine on twitter started a meme by saying “tweet.” and asking for a retweet. One person who retweeted it got his message retweeted.

I know I’m not the first person to graph retweets, but being curious as to what this particular graph would look like, I decided to do a graph in Python as a programming exercise. I did it using a GraphViz library. The code is here:

```import pydot

graph = pydot.Dot('rt', graph_type='digraph')
tweeps = ('tysoncrosbie',
('phxreguy',
('sbowerman',
('phxwebguy', 'leaky_tiki'),
'refriedchicken')),
'vhgill',
'Yartibise')

def first_flat(tree):
if isinstance(tree, tuple):
return first_flat(tree[0])
else:
return tree

def find_edges(tree):
if isinstance(tree, tuple):
source = tree[0]
for dest in tree[1:]:
find_edges(dest)

find_edges(tweeps)
graph.write_png('rt_graph.png')
```

The code takes a nested list structure (a tree) and produces edges from it, which can be graphed by GraphViz. It uses pydot, a GraphViz library for Python. Here is the resulting image:

Observations:

• Python doesn’t have a built-in list flattening function. This was irritating. Ruby’s is Array#flatten. It would have been so much nicer to have been able to grab the first element of a flattened list rather than write the first_flat function or copy/paste a list-flattening function from the Internet.
• pydot is really simple to use. I liked how it could produce a png file. I was planning just to have it create a dot file and then use GraphViz to create a png, but when I saw the write_png function I decided to just use that.
• GraphViz has reasonable defaults. It produced a nice-looking graph on the first try. I think that’s a big part of why GraphViz is as popular as it is.

I was hoping to have a little more to show for tomorrow’s Python Interest Group meeting, but this will have to do!

## vim: remapping cc to ?

I used to dread having to search backward in vim, because that meant scrunching my right pinky and ring finger next to each other to hit ?. So I remapped it. I used cc because I don’t use cc to change lines—I use S for that (it does the same thing). It’s much easier for me to hit cc than to hit ?, and since c is in the bottom row along with the / key it’s not hard for me to remember to use it.

The remapping is simple:

`map cc ?`.

After mapping this, I realized that the downside to having a funky vim setup is that I can’t have someone else who knows vim type in my window very easily. I am thinking of making pair and unpair commands that turn off and on my funky keymaps, respectively. Rather than duplicate the mapping code, I’ll just call unpair in my .vimrc file.

I am still using MacVim with my enter key mapped to escape. I use shift-enter or enter followed by o to insert multiple lines. I switched back to the normal setup for a while before realizing that the number of one-line inserts I make far outweighs the number of multiline inserts I make. I have found that is the best way for me not to have to reach for the esc key (I use ctrl all the time and have my caps lock key mapped to ctrl, so mapping caps lock to esc was out of the question).

I have ctrl-J and ctrl-K mapped to insert blank lines, and use them whenever I can remember to do so. I took the code from the Vim Tips Wiki, and switched the Ctrl for Alt in the remappings, so Ctrl inserts and Alt deletes. I use the command for inserting more than to deleting because I find it easy enough to just go down a line and hit dd than to remember to use a custom remapping.

## Pursuing my interests through goals

Roughly two years after reading Snow Crash, I finally started reading Cryptonomicon. I’m really enjoying it so far. I can’t help but feel a little bit angry with myself for not reading it sooner, though. I really enjoyed Snow Crash, but after I finished reading it I didn’t immediately start on another Neal Stephenson book, but instead started on a book by another author. The other book wasn’t as exciting as Snow Crash, and it took me more time to read, and when I finally got done with it I had moved on to a different group of books, forgetting how much I enjoyed Snow Crash.

A couple of weeks ago, having lost interest in another book I was reading, I started carrying Snow Crash around with me. Two days ago I started reading it a second time. After I finished the first chapter, my interest in Neal Stephenson was re-kindled, and I picked up a copy of Cryptonomicon. And I am really enjoying it, and it’s helping me deal with stress.

I learned a couple of lessons from this experience:

• I shouldn’t rely on passion alone to drive me to pursue my passions. Few, if any, pursuits are immune to distraction. Setting specific goals is important even when it’s for something I really want to do.
• It doesn’t take long to rekindle a passion. If I’m feeling bored, and there’s something I remembered really wanting to do, but am considering putting off to pursue other interests, I can just try getting back into it for a short while. If my excitement returns, I can pursue that, rather than try to do other things I’m only mildly interested in. If not, I’ve only spent a small amount of time on it.

There’s no silver bullet to motivation, but it’s comforting to know that I’ve got a couple more tools in my motivational tool box.

## A brief journey back into to emacs-land

In an earlier post, I said that I am no longer going to deny myself the pleasure of dabbling in different editors. It was my interpretation of the “use one editor; use it well” mantra I got from the pragmatic programmers. It was probably a misinterpretation of it. They also would recommend using the best tool for the job, and how can you know what the best tool for the job is without learning about all the alternatives? And, in the case of text editors, it’s practically impossible to know every one of them well enough to judge which is best.

One day I was feeling frustrated with vim, so I fired up emacs. I wanted to remind myself of one thing it has that vim lacks—the ability to view/edit a single buffer in multiple frames. Pretty nifty, really. If you’re unfamiliar with the terminology, in Emacs a frame is a top-level window (think JFrame), and a window is a split within a frame, or the whole frame if it isn’t split. In MacVim, each frame has its own vim instance with its own set of buffers, so you can’t view the same buffer in two different frames, which would be nice for having a big frame and a frame that can sit alongside other windows. In emacs it works without a hitch.

While I was in emacs, I noticed something else I like about it—the scratch buffer. In vim there’s a blank buffer that shows up when you start it, but it seems like vim would rather pretend it’s not there. If you delete a buffer, it closes any window (i. e. split view) that is associated with it, unless there is only one window in the frame, in which case it grudgingly shows the scratch buffer (or the last buffer if there’s another buffer still open).

I can think a couple of things that I gained from this experience. First, I can see that there are other developers who can sympathize with my experiences. If I ever get frustrated with vim, I can take refuge in the emacs community. Same for when I got frustrated with emacs and became a vimmer. Second, I was able to take the scratch concept and apply it to another part of my computing experience. I created a directory in my home directory called “scratch”. It’s going to be my new temporary working directory. I had one called sandbox but the name never quite felt right and I never got in the habit of using it.

I don’t know which editor I’ll be using a year from now. But for now, it’s vim, for the most part. I do want to try out SLIME and see how viable Viper-mode (vim emulation in emacs) is, though.