<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title>Hairy Sun</title>
  <link href="http://hairysun.com/atom.xml" rel="self"/>
  <link href="http://hairysun.com/"/>
  <updated>2013-04-02T08:12:43-06:00</updated>
  <id>http://hairysun.com/</id>
  <author>
    <name>Matt Harrison</name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title>Oh (Ergonomic) Keyboard, Where Are Thou?</title>
    <link href="http://hairysun.com/blog/2013/04/02/oh-ergonomic-keyboard/"/>
    <updated>2013-04-02T07:26:00-06:00</updated>
    <id>http://hairysun.com/blog/2013/04/02/oh-ergonomic-keyboard</id>
    <content type="html">&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt; I have found the perfect keyboard (for me) that has the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ergonomic&lt;/li&gt;
&lt;li&gt;Mechanical Switches&lt;/li&gt;
&lt;li&gt;Split&lt;/li&gt;
&lt;li&gt;Matrix&lt;/li&gt;
&lt;li&gt;Thumb keys&lt;/li&gt;
&lt;li&gt;Programmable&lt;/li&gt;
&lt;li&gt;Open Source (Bonus)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;img class=&quot;center&quot; src=&quot;http://hairysun.com/images/ergodox/finished.jpg&quot;&gt;&lt;/p&gt;

&lt;p&gt;(My new keyboard on my standing desk stand (raised by Logitech box to correct ergonomic height). Old unicomp in background)&lt;/p&gt;

&lt;h3&gt;I’ve become a keyboard snob&lt;/h3&gt;

&lt;p&gt;After building my first computer some moons ago, I soon became interested in ergonomic designs. Perhaps the fact that they were different from normal keyboards was what drew me to them initially. Which led me to ponder-why would anyone want a keyboard that is shaped differently than a normal keyboard? That led to me learning about RSI and ergonomics. I started off with a cheaper logictech keyboard that I found at Software and Stuff. I purchased a keyboard for use at work. Surely if I was going to make my living typing code I should invest in my equipment to protect myself. Besides, how would I throw a frisbee and play ultimate if I had carpal tunnels?&lt;/p&gt;

&lt;iframe src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hairysuncom-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B0000642RX&quot; style=&quot;width:120px;height:240px;float:right&quot; scrolling=&quot;no&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;


&lt;p&gt;Time passed and I picked up a used MS ergonomic keyboard. It seemed pretty good other than the arrow keys were arranged in a cross pattern. (Why change that yet leave everything else in the same position? It boggles the mind). I seemed satisfied and life went on.&lt;/p&gt;

&lt;p&gt;Eventually I picked up an MS 4000. It was available and the local office store and felt decent enough when trying it out in the store. It worked fine (or seemed to). Until I started looking into keyboards more. I learned about switches. Each key has its own switch that activates it. The best switches were mechanical buckling key switches. They had a distinct tactile “click” when the press of the finger activated the key. This was supposed to provide for more ergonomic typing because your finger didn’t try to crush the key, but rather could feel when it was activated. They also made a cool sound. And if you typed fast enough it was like having a little machine gun. (The sound also corresponded to the mechanical activation, so you could base your finger movements on that as well). Another great feature about BS keyboards was that they seemed to last forever. As I looked into them many people had IBM Model M keyboards from the 80’s that were still going strong. I had already destroyed the switches on one keyboard and had just figured that keyboards were disposable. (Which was a sad thought because it seemed like every “ergonomic” keyboard at the time had limited runs, so you never knew what your next keyboard would be).&lt;/p&gt;

&lt;iframe src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hairysuncom-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B000A6PPOK&quot; style=&quot;width:120px;height:240px;float:right&quot; scrolling=&quot;no&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;


&lt;p&gt;Hmmm, but there weren’t any buckling spring keyboards in ergonomic designs. Wrong! IBM actually produced an ergonomic version, the M15, for a short time in the 90’s. The only problem was they didn’t sell well and they stopped producing them. Of course since they were BS switches they should still be around. Ebay to the rescue. Sadly it appeared that every other ergo keyboard geek had the same idea as me. The price for these rare keyboards if they ever do reach Ebay is pushing $1500! (There just happens to be one on ebay right now with a buy-it-now price of $1249, that’s a steal!) I love my fingers and wrists but apparently not that much. But BS springs intrigued me. Plus I was using ThinkPads as my main workhouse and came to appreciate the track point in the middle of the keyboard. I could mouse around without taking my fingers off of the home row.&lt;/p&gt;

&lt;p&gt;It just so happened that the company that bought IBM’s BS equipment and processes, Unicomp, also continued to make a BS keyboard with a trackpoint. Another key event of that time was that a key on my MS 4000 also went out. And after reading about BS switches I became very sensitive to typing on my “ergonomic” keyboard. (Finding out about BS switches was like reading “The Elements of Typographic Style”, once you know about kerning and ligatures you look for them everywhere. It’s hard to unlearn that factoid). I became very apparent that hitting the wider keys on the left edge with my pinky was a great pain. I believe this was because the keys are so wide that the keycaps are rubbing against the mechanism during depression causing binding and lockup. Due to that I would press them even harder, which is bad, and even worse for pinky fingers.&lt;/p&gt;

&lt;p&gt;I figured if the current ergo designs have crappy keys, maybe BS switches are good enough and picked up a Unicomp Endura Pro. I was pretty happy with that keyboard. (My only gripe is that the buttons for the trackpoint aren’t BS and so they become worse over time or even stop working). But I loved the switch mechanism. It was probably half in my mind (Stockholm Syndrome) and half due to the crappiness of the switches on the MS 4000. If I ever had a keyboard that was in an ergonomic shape it would have to have high quality switches.&lt;/p&gt;

&lt;iframe src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hairysuncom-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B000LVJ9W8&quot; style=&quot;width:120px;height:240px;float:right&quot; scrolling=&quot;no&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;


&lt;p&gt;In the subsequent years I read about Kinesis, Maltron, and eventually Truly Ergonomic brands of keyboards. These companies were the only companies offering “ergonomic” designs in keyboards with mechanical switches. (None had BS switches, but they used Cherry brand switches, which many like because Cherry’s don’t just come in one style like BS switches-loud and tactile. Cherry’s have different switches that fill in a matrix with different values for activation force, tactility (or lack thereof), and loud (or not). Cherry Blue’s are supposed to be the equivalent of BS switches (or similar enough). The mechanical mechanism on these switches should be smooth and last for years, instead of months.&lt;/p&gt;

&lt;iframe src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hairysuncom-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B000YLB1KI&quot; style=&quot;width:120px;height:240px;float:right&quot; scrolling=&quot;no&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;


&lt;p&gt;An interesting feature that I loved about these nicer ergonomic keyboards was that they used a “matrix” layout. If you look at any modern keyboard you will note that it slants up and to the left. If you think about that, it doesn’t make sense that both hands go up and to the left. Shouldn’t one hand do that and the other hand go in the opposite direction? And I haven’t even gotten to actual layout of the keys. Both of these “features” are hold-overs from days gone past of typewriters, where layout was designed to limit typing speed as to not jam the mechanism. In a modern age, where we have ergonomics yet also want to type fast shouldn’t we drop the legacy features of days past completely? Apparently not. Most keyboards still adopt the slanted layout. But the ergonomic keyboards I mentioned do not. Conforming to century old norms for keyboard layout has led to a lack of innovation in keyboards.&lt;/p&gt;

&lt;p&gt;But all of these ergonomic keyboards had a glaring problem. They were “ergonomic” but hard coded the ergonomics! Similar to using a “magic number” in programming, they had physical plastic cases that forced (or assumed) the typist to conform to their ideal of button positioning and distance between hands. That seemed restrictive and silly. There were actually split keyboards that existed. Each hand was separate, but they all had crappy rubber dome switches and/or non-matrix layout!&lt;/p&gt;

&lt;iframe src=&quot;http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=hairysuncom-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B0016A0RLA&quot; style=&quot;width:120px;height:240px;float:right&quot; scrolling=&quot;no&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;


&lt;h3&gt;What to do?&lt;/h3&gt;

&lt;p&gt;I ended up surfing across a forum for keyboard enthusiasts, http://geekhack.org/. One day in the ergonomic keyboard subsection there was a post. This was in October 2011. The post had renderings of a cool looking programmable, split, matrix style keyboard that would cost around $400. Pricy, but it had most of the features I wanted. Fast forward a year and a half later. After hacking/compromise of geekhack, (continued discussion continued on http://deskthority.com/), lack of community members interested in organizing a group buy, and http://massdrop.com/ stepping in to organize a group buy, I finally had a kit to build a keyboard. Fast forward a long night after than and I had my keyboard. It cost $240 and took about six hours to assemble (having never really soldered before myself).&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;center&quot; src=&quot;http://hairysun.com/images/ergodox/standing_desk.jpg&quot;&gt;&lt;/p&gt;

&lt;p&gt;(Device in action at my standing desk (plastic still has wraps on it))&lt;/p&gt;

&lt;h3&gt;Features include:&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Mechanical switches&lt;/strong&gt; I purchased Cherry Blue switches which are both tactile and non-quiet to emulate my buckling spring switches (my co-workers have yet to complain about my BS switches). They are rated at 50 million presses, which should outlast me. Having broken a couple rubber dome switches this was important. Also I appreciate that they are smooth and consistent, which has not been my experience with rubber dome switches. Once you go mechanical rubber dome keyboards feel chintzy. (The Lenovo and Apple laptop keyboards are pretty decent though).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ergonomic&lt;/strong&gt; A tenet of most ergo designs is that your hands are allowed to come to a natural position, rather than forced to fit into the confines of a keyboard based on a century old typing device. Check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Columnar Layout&lt;/strong&gt; Rather than a normal staggered layout like most keyboards, the ErgoDox has a columnar layout. Your fingers on both hands don’t naturally point up and to the left, and your keyboard shouldn’t either. (This might take some getting used to. Some columnar layouts put the number 2 above “Q” rather than one because your muscle memory seems to hit that better. I’ve just tweaked the configuration of my layout to try that scheme). &lt;a href=&quot;https://www.massdrop.com/ext/ergodox/?referer=6EHVXG&amp;amp;hash=84841273e0abc3fcae97de45d025581a&quot;&gt;Here&amp;#8217;s my current configuration&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Split Halves&lt;/strong&gt; This was a biggie to me. Again, the Maltron, Kinesis, and TrulyErgonomic all look like they are decent keyboards, yet they hard-code the distance between the hands. With split halves I have 3 degrees of freedom for each half and can create infinite combinations. As the standing desk vs sitting all day debate is raging, I think there is a middle ground. Common sense seems to indicate that variety is probably better than either end of this dichotomy. You should probaly stand, walk, and sit during the day. Wouldn’t it be nice if you could position your hands close together for a time, and then spread them out further apart? Most keyboards don’t allow that. I’ll probably get some sculpy (maybe 3d printing) and experiment with stands for tenting and other angles of the keyboard. (The similar to the stand accessory for the Kinesis Freestyle2).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thumb Keys&lt;/strong&gt; Humans have opposable thumbs. Yet most people only use one thumb to type on one key. That seems to be a huge waste. Many of the more modern keyboards (Maltron, Kinesis, and TrulyErgonomic) have keys for the thumbs. This is probably the root of the cause for a steeper learning curve for these keyboards. Because many of the keys are moved under the thumb (and away from the fingers that normally depress them) it can make typing a chore until muscle memory is built. But I believe there should be big dividends after that time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Programmable&lt;/strong&gt; The folks at Massdrop created a nice little web application to create layouts for the keyboard. One cool feature is that these layouts can be “stacked”. You could create a layout for qwerty, dvorak, and colemak. You can let the keys under the thumbs be optimized to your desires. I’m still messing around with key configuration as I’m getting used to the keyboard.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;center&quot; src=&quot;http://hairysun.com/images/ergodox/solder.jpg&quot;&gt;&lt;/p&gt;

&lt;p&gt;(It took me about 5 hours to put this thing together. I&amp;#8217;d appreciate a LinkedIn recommendation for my soldering skillz)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Source&lt;/strong&gt; This applies to software and hardware. The firmware is on GitHub. The designs are in the open. Even though it took a commercial company to step up and organize the group buy, one could produce their own keyboard using the existing plans. Because I physically built this keyboard, I feel like I have some semblance of understanding of what is going on at the hardware level and could “fix” a problem with a switch or short should it arise (say a drink was spilled into the keyboard). I’m not sure that is the case with most keyboards out there today.&lt;/p&gt;

&lt;p&gt;Yes, it is the most expensive keyboard I’ve ever purchased. But it is cheaper than both Maltron and Kinesis and costs about the same as the Truly Ergonomic. But I feel it is a better keyboard than all of those. I also flip that cost issue around and say it is an investment in tooling that should pay dividends. Also if the ergonomic benefits hold out, it is an investment in my body. Surely my wrists and hands are worth $240, which is about half of the cost of the original estimate.&lt;/p&gt;

&lt;h3&gt;Future Plans&lt;/h3&gt;

&lt;p&gt;Right now I’ve only used the keyboard for one full day at work. I’m tracking the commands I do in emacs. After a couple days of recording the commands I’ll examine what I’m doing and see if it makes sense to create a layer with emacs specific chords. I’m more cognizant of my finger movements, both when they migrate off the home row and with my thumbs. I’m trying to figure out what optimizations I could make to my layout. Since all the keys were the same, I threw on some bandaids the indicate hand position (yep need to order two more keycaps).&lt;/p&gt;

&lt;p&gt;I’ll be honest. It is harder to type of right now.&lt;/p&gt;

&lt;p&gt;One thought I’m having is geeking all out. Considering that many musicians can play a guitar and a bass guitar differently, I’m wondering if I should treat this keyboard as a new “instrument”. Rather than slightly tweaking the normal “QWERTY” layout, perhaps I should try MALT or Colemak. Considering that when I’m using the thumb keys it does feel like a different instrument perhaps it would be easier to make the mental switch between normal keyboards and my geeked out keyboard. Another nicety is that the keyboard itself contains the mappings. So if I use the ErgoDox on another machine I’ll get my mappings. Which is not the case if I’m using DVORAK on my normal laptop, but then switch to my wife’s where she’s using the standard QWERTY layout. Thoughts on this?&lt;/p&gt;

&lt;p&gt;I realize many just do not care. A keyboard is a keyboard is a keyboard. For those I’m sorry you suffered through this post. For the rest, realize the the keyboard is currently the biggest interface we have with computers. If we can interact more efficiently and ergonomically isn’t that a noble effort?&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;center&quot; src=&quot;http://hairysun.com/images/ergodox/package.jpg&quot;&gt;&lt;/p&gt;

&lt;p&gt;(the package from Massdrop)&lt;/p&gt;

&lt;p&gt;Full Disclosure. I have no affiliation with Massdrop (other than they are located near my Alma mater). They delivered me a great product. They are planning on doing another run of these soon. If you are interested follow them, or follow me on twitter. I’ll probably tweet about any new group buys they do.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>PyCon Preview: Functional Python and Comprehensions</title>
    <link href="http://hairysun.com/blog/2013/01/09/pycon-preview-functional-python-and-comprehensions/"/>
    <updated>2013-01-09T23:46:00-07:00</updated>
    <id>http://hairysun.com/blog/2013/01/09/pycon-preview-functional-python-and-comprehensions</id>
    <content type="html">&lt;p&gt;PyCon is right around the corner, and I am lucky to be able to deliver two tutorials this year. For our Utah Python meeting in January, I will be going over a portion of the &lt;a href=&quot;https://us.pycon.org/2013/schedule/presentation/6/&quot;&gt;Hands-on Intermediate Python&lt;/a&gt; Tutorial. People seem to enjoy this tutorial, and since I&amp;#8217;ve been trying to read up on Clojure a bit, I thought I&amp;#8217;d expand the functional section ever so slightly.&lt;/p&gt;

&lt;p&gt;If you are in town, Needle.com is hosting and providing food starting at 6:30. Otherwise you will have to sign up for the tutorial at PyCon. &lt;a href=&quot;http://hairysun.com/downloads/functional-comp.pdf&quot;&gt;Here are slides from the Functional portion&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to &lt;a href=&quot;http://twitter.com/__mharrison__&quot;&gt;follow me on twitter&lt;/a&gt;, or leave comments. Cheers!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Advice to My Younger Self</title>
    <link href="http://hairysun.com/blog/2012/10/11/advice-to-my-younger-self/"/>
    <updated>2012-10-11T06:33:00-06:00</updated>
    <id>http://hairysun.com/blog/2012/10/11/advice-to-my-younger-self</id>
    <content type="html">&lt;p&gt;Every time I see an intern or new junior programmer I fight off the
urge to give the the advice I wish someone had given me. So rather
than sound preachy, I&amp;#8217;m going to pretend that I&amp;#8217;m from the movie
&lt;em&gt;Frequency&lt;/em&gt; and give advice to my younger self. In that movie (released
in 2000), one of the characters is fore-warned to invest in an oddly
named company&amp;#8212;Yahoo.&lt;/p&gt;

&lt;p&gt;In a similar vein, I would tell my older brother not to just be a
designated driver for a fellow student named Sergei, but actually take
interest in his research and his novel idea, PageRank. Rather than
work for Big Blue, go help Sergei crawl the web, and when I graduate
two years later, convince me to do the same. Or have more faith in
that Apple recruiting event you went to in 1998. Believe that the
network effect of Windows can be shattered.&lt;/p&gt;

&lt;p&gt;Those are silly fantasies because hindsight is 20/20.  Being in the
exact right place at the right time is different than being in the
close to right place at the right time. It is hard to predict where
lightning strikes. But it is possible to have multiple lightning rods
up, rather than insulating yourself from them.&lt;/p&gt;

&lt;p&gt;During the last few months of my schooling, life was very exciting. We
were in a huge bubble and didn&amp;#8217;t know it. People were dropping out of
school to work for well paying jobs. I even interviewed at a
company with the express intent of dropping out with a semester left
to work.&lt;/p&gt;

&lt;p&gt;During this time a buddy and I had just won the competition for best
Senior Project. We had created a colloborative browsing engine, that
let you surf the web and chat with your friends in real time about
it. And during the day of the show, real VC&amp;#8217;s actually showed interest
our &amp;#8220;product&amp;#8221;. Companies with similar products interviewed us to join
their teams, we even pitched VC&amp;#8217;s (who claimed that our solution being
based on MySQL and not Oracle would never work). By having something of
value we were in demand.&lt;/p&gt;

&lt;p&gt;In the end being disenchanted with VC&amp;#8217;s we went off to work for
companies while intending to moonlight on the project. I went off to
work at an &amp;#8220;Enterprise&amp;#8221; Search company. My buddy was off to Apple. I
believe Apple&amp;#8217;s stock was around $10 at that time. At this point those
silly fantasies bother me and I kick myself. They come in and state
that some existing companies can be more exciting than startups. I
didn&amp;#8217;t buy it at the time.&lt;/p&gt;

&lt;p&gt;Working at a search startup was cool. A lot of my co-workers were PhD
types and I loved soaking in their knowledge. Along the way I would
slowly learn two axioms of programmers. (Or I should have learned
these and wish that someone just sat down and said them):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Programmers are lazy&lt;/li&gt;
&lt;li&gt;Programmers want control&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Of course programmers are lazy, they make computers do their work for
them. They also have a tendency to do the least amount of work
possible and once they become comfortable in their situation they are
like a raft floating down a big river. Occasionally they need to row
hard to change their position, but if the river is cooperating they
only need little course correction. It can be a nice little rut to be
in, especially if lightning struck you and you decided to take
interest in Sergei&amp;#8217;s project or think that Steve Jobs could actually
turn around this floundering company. On the other hand, most startups
fail, and a rut can be a tractor beam that leads to the Death Star of
complacency or job loss.&lt;/p&gt;

&lt;p&gt;Programmers, in addition to being lazy, are prideful, arrogant snobs,
who love certain tools and programs for no apparent reasons and love
to force others to accept these beliefs. Or they are just lazy and go
with the flow. They want to control the search space, or re-create a
company that had been reduced to nothing by a north eastern
monopoly. Programmers want to reinvent the wheel themselves. Part of
this is a desire to understand all aspects of a system. Part of it is
arrogance. Harnessing Open Source enables you to lazily control the
system.&lt;/p&gt;

&lt;p&gt;During this time of the heyday of Slashdot, I was installing Gentoo
and playing with Python outside of work. I would read about the ongoings of
user groups and the cool things they would do with such
technologies. Said user groups happened to be in my backyard, but
rather than being an active participant, I would just read about their
events after the fact. Perhaps this was due to my introverted nature,
or perhaps because I&amp;#8217;m a lazy programmer.&lt;/p&gt;

&lt;p&gt;During this time the bubble collapsed. My company started going
through round after round of layoffs. Perhaps because I was a good
engineer (but probably more likely because I was cheap relative to all
the PhD&amp;#8217;s), at every round (I believe there were 7 or so), my job
ceased to exist. But (due to my mad skills (or my relative
cheapness)), a new opening within the company occured with every
layoff. And I took them, going down with the sinking ship. I had
officially entered the rut.&lt;/p&gt;

&lt;p&gt;Had I put in the extra effort to get involved with the local user
groups, I&amp;#8217;m convinced that I would have not been in this rut for very
long. I&amp;#8217;ve seen many people expand their careers via user groups.&lt;/p&gt;

&lt;p&gt;So barring wishful thinking about working at a once in a lifetime
company, my advice to my past self would be to get involved
earlier. If you put forth a little effort getting involved in your
community (and networking at the same time) you will have the
opportunity to have more control.&lt;/p&gt;

&lt;p&gt;My advice? Get yourself out there. Blog, attend gatherings, tweet
(when it is invented), contribute back. Sitting around in your rut
only insulates you.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>How to Set Up a Goaltimate Field</title>
    <link href="http://hairysun.com/blog/2012/09/04/how-to-set-up-a-goaltimate-field/"/>
    <updated>2012-09-04T07:07:00-06:00</updated>
    <id>http://hairysun.com/blog/2012/09/04/how-to-set-up-a-goaltimate-field</id>
    <content type="html">&lt;p&gt;I continue to prefer Goaltimate for groups of 13 or less. It&amp;#8217;s a great game, one gets lots of touches and newbies, seasoned folks can play together. I think it improves new ultimate players throws better than ultimate does. It&amp;#8217;s great for warming up. We usually play until we have enough for ultimate. People continue to be skeptical before playing, and the majority comment something like this after playing:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;That&amp;#8217;s a lot more fun than I thought it would be&lt;/p&gt;&lt;/blockquote&gt;




&lt;blockquote&gt;&lt;p&gt;That&amp;#8217;s cool. Where did you get the hoop?&lt;/p&gt;&lt;/blockquote&gt;




&lt;blockquote&gt;&lt;p&gt;I prefer this to ultimate&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Ok, only a few say the last one, but they have said it. Then there&amp;#8217;s the group of people who won&amp;#8217;t give goaltimate a chance. They&amp;#8217;ll either sit out and wait til there&amp;#8217;s 10 people and then want to jump to full field 5 on 5 ultimate, or they&amp;#8217;ll play grudgingly. There seems to be another small group of people who believe that goaltimate is too hard on their bodies (knees and ankles) who also won&amp;#8217;t play unless they&amp;#8217;ve got 5 other people begging them to. But I&amp;#8217;m digressing.&lt;/p&gt;

&lt;p&gt;A complaint I&amp;#8217;ve heard is that it takes too long to set up goaltimate. I don&amp;#8217;t think that&amp;#8217;s valid. (With the aluminum hoops it&amp;#8217;s even quicker). A field can be set up in about 2 minutes. Here&amp;#8217;s how:&lt;/p&gt;

&lt;h2&gt;How to set up a Goaltimate field&lt;/h2&gt;

&lt;h1&gt;Step 1: Find a good field&lt;/h1&gt;

&lt;p&gt;A benefit of goaltimate is that it can be played in smaller areas. I&amp;#8217;ve played inside in basketball courts. Can&amp;#8217;t do that with ultimate. Also, nice large grassy areas tend to get chewed up quickly. But smaller ones not so much. So you can usually play goaltimate on a better field (often it&amp;#8217;s right next to the ultimate field).&lt;/p&gt;

&lt;h1&gt;Step 2: Step up the hoop stakes&lt;/h1&gt;

&lt;p&gt;Because the hoop is fixed in size, it&amp;#8217;s important that it be set up the correct distance of 18 feet. Here&amp;#8217;s an easy way to do it. If you got a pvc set (with 8 pieces) connect 4 of them. That will be 16 feet long, so stick a foot on each side and you&amp;#8217;ve pretty much got 18 feet. If you&amp;#8217;ve got the nicer aluminum poles, find the middle and mark it with a sharpie. Here&amp;#8217;s an illustration that should make it pretty clear.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://hairysun.com/images/goaltimate/step1.png&quot; title=&quot;[Stakes]&quot; &gt;&lt;/p&gt;

&lt;p&gt;Setting up the pole is a two person job. (As is taking it down). Have a person on both ends of the pole and put both ends on the stakes at the same time. People seem to be wary of making the pole bend, but it will do it.&lt;/p&gt;

&lt;h1&gt;Step 3: Goal line cones&lt;/h1&gt;

&lt;p&gt;The goal line cones are set inline with the hoop, 3 feet away from each stake, making them 24 feet apart from each other.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://hairysun.com/images/goaltimate/step2.png&quot; title=&quot;[Goal cones]&quot; &gt;&lt;/p&gt;

&lt;h1&gt;Step 4: Back goal cone&lt;/h1&gt;

&lt;p&gt;From the hoop take 8 paces back (I&amp;#8217;m assuming your paces are 3 feet), and drop a cone. Note that the depth of the goal is the same as the width of the front cones. It seems that some like shallow endzones (perhaps the intent is to make the goal actually be a semi circle, which it is not). The full endzone opens things up a little and allows for more endzone throw possibilities. Here&amp;#8217;s an image:(The rest of the images are top down) (Note that the regulation field image (the circular one) doesn&amp;#8217;t have the endzone scaled correctly)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://hairysun.com/images/goaltimate/step3.png&quot; title=&quot;[Back cone]&quot; &gt;&lt;/p&gt;

&lt;h1&gt;Step 5: Finish the goal cones&lt;/h1&gt;

&lt;p&gt;From the back cone I work my way around with 3 more cones on each side.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://hairysun.com/images/goaltimate/step4.png&quot; title=&quot;[Goal cones]&quot; &gt;&lt;/p&gt;

&lt;p&gt;Continue in the 2/1 pacing around.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://hairysun.com/images/goaltimate/step5.png&quot; title=&quot;[Goal cones]&quot; &gt;&lt;/p&gt;

&lt;p&gt;One last time&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://hairysun.com/images/goaltimate/step6.png&quot; title=&quot;[Goal cones]&quot; &gt;&lt;/p&gt;

&lt;h1&gt;Step 6: Make the &amp;#8220;crease&amp;#8221; (optional)&lt;/h1&gt;

&lt;p&gt;If your players tend to goaltend a lot and don&amp;#8217;t like the 3 second rule (or just step out if front of the hoop and poach there), you can make the crease in front. The rules specify that you can&amp;#8217;t hang out in the area 1 yard in front of the goal either.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://hairysun.com/images/goaltimate/step7.png&quot; title=&quot;[Crease cones]&quot; &gt;&lt;/p&gt;

&lt;h1&gt;Step 7: Set up clear/2 point line&lt;/h1&gt;

&lt;p&gt;From here on out I&amp;#8217;m no longer &amp;#8220;regulation&amp;#8221;. I&amp;#8217;ve never seen a circular field in the different games I&amp;#8217;ve played at. Most are either rectangular or boundless. When we play indoors, we play rectangular (obviously), and we play without boundaries outside.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://hairysun.com/images/goaltimate/step8.png&quot; title=&quot;[Clear cones]&quot; &gt;&lt;/p&gt;

&lt;p&gt;Regulation calls for a clear line of 30 yards that arcs out from the hoop. And then a 2 point line (that is parallel to the goal line) at 20 yards out. Again we normally just set up four cones about 20 yards back for a clear/2 point line. The distance of 20 yards can be tweaked depending on energy levels, number of players or field size.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://hairysun.com/images/goaltimate/FieldDimensions.gif&quot; title=&quot;[Complete field]&quot; &gt;&lt;/p&gt;

&lt;p&gt;Another (non-regulation) tweak that we add is a cone about 10 feet behind the endzone. This is the &amp;#8220;no-clear&amp;#8221; area. If the disc ends up behind it on a turnover, you don&amp;#8217;t need to clear. Some people are confused in that they think they can clear it there as well. NO! If they pick it up behind the cone, then they are cleared, otherwise the only way to clear is the normal clear line.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s another illustration with dashed lines indicating what the cones are meant to&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://hairysun.com/images/goaltimate/step9.png&quot; title=&quot;[Tweaked field]&quot; &gt;&lt;/p&gt;

&lt;h1&gt;Other tweaks&lt;/h1&gt;

&lt;p&gt;We normally play 3 on 3 or 4 on 4. If we&amp;#8217;ve got more people, then we&amp;#8217;ll sub on error. What that means is if you throw an uncatcheable throw, or you drop a catcheable throw, you sub out. This tends to give everyone a pretty fair playing time.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve posted previously about how to make hoops. My original PVC set got a crack once as a player collided with the hoop (must have blended in with the white snow at the time). I&amp;#8217;m a fan of the aluminum hoops (which I also have). They are better in every way; lighter, smaller, easier to store, easier to setup, easier to take down, and more durable. Why weren&amp;#8217;t we using them yesterday you ask? Because my friend who has (permanently borrowed) my PVC set arrived first&amp;#8230;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Real-life Generators and a Peeker too</title>
    <link href="http://hairysun.com/blog/2012/06/28/real-life-generators-and-peeker/"/>
    <updated>2012-06-28T00:20:00-06:00</updated>
    <id>http://hairysun.com/blog/2012/06/28/real-life-generators-and-peeker</id>
    <content type="html">&lt;p&gt;After a long day of manual labor last weekend, I spent a couple minutes &lt;em&gt;relaxing&lt;/em&gt; by converting some PDF&amp;#8217;s to mobi files so my mom could read them on her Kindle. Her Kindle supports PDF, but reading PDF&amp;#8217;s on Kindles (especially of the non-DX eink variety) is a pain. You can zoom into sections, but it isn&amp;#8217;t appropriate for long reading, and the default fonts are too small. One of her favorite features is to bump up the font size on mobi files, especially at night. So I obliged.&lt;/p&gt;

&lt;p&gt;To that end I&amp;#8217;ve created some code that helps in this process&amp;#8212;&lt;a href=&quot;https://github.com/mattharrison/ebookgenerators&quot;&gt;ebookgenerators&lt;/a&gt;. Most readers don&amp;#8217;t care about the process of converting pdf to mobi. How I cleaned up the text might be interesting though. I used a chain of Python generators!&lt;/p&gt;

&lt;p&gt;A few have complained that my Iteration and Generator book doesn&amp;#8217;t have enough real examples. Some form of this blog post will probably end up as a chapter there. So without further ado, here&amp;#8217;s some code.&lt;/p&gt;

&lt;p&gt;A concept I briefly mention in my book is a Peeker class. A peeker can look ahead during iteration. This is useful if deciding the output of an action requires more than one item. Here&amp;#8217;s mine:&lt;/p&gt;

&lt;figure class=&#8217;code&#8217;&gt;&lt;figcaption&gt;&lt;span&gt;Peeker  &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&#8217;line-number&#8217;&gt;1&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;2&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;3&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;4&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;5&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;6&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;7&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;8&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;9&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;10&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;11&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;12&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;13&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;14&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;15&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;16&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;17&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;18&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;19&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;20&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;21&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;22&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;23&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;24&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;25&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;26&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;27&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;28&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;29&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;30&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;31&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#8217;code&#8217;&gt;&lt;pre&gt;&lt;code class=&#8217;python&#8217;&gt;&lt;span class=&#8217;line&#8217;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PeekDone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ne&quot;&gt;Exception&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;k&quot;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Peeker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buffer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;peek&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;sd&quot;&gt;&amp;quot;&amp;quot;&amp;quot; this can raise an exception if peeking off the end. be&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;&lt;span class=&quot;sd&quot;&gt;        aware and handle PeekDone appropriately&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;                &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;ne&quot;&gt;StopIteration&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PeekDone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;Exhausted&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__iter__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;         &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;I use the &lt;code&gt;PeekDone&lt;/code&gt; exception as a sentinel value, rather that returning a special value. Here&amp;#8217;s an example of a generator removing double blank lines from lines of text using &lt;code&gt;Peeker&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=&#8217;code&#8217;&gt;&lt;figcaption&gt;&lt;span&gt;remove_double_returns  &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&#8217;line-number&#8217;&gt;1&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;2&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;3&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;4&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;5&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;6&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;7&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;8&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;9&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;10&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;11&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;12&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;13&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;14&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;15&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#8217;code&#8217;&gt;&lt;pre&gt;&lt;code class=&#8217;python&#8217;&gt;&lt;span class=&#8217;line&#8217;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;remove_double_returns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Peeker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;n&quot;&gt;next_line&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;peek&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PeekDone&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blank&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;next_line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;That could be done by someone fluent in awk in probably two lines. But here&amp;#8217;s one that I wouldn&amp;#8217;t want to touch.&lt;/p&gt;

&lt;figure class=&#8217;code&#8217;&gt;&lt;figcaption&gt;&lt;span&gt;fix_space_in_paragraph  &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&#8217;line-number&#8217;&gt;1&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;2&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;3&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;4&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;5&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;6&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;7&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;8&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;9&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;10&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;11&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;12&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;13&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;14&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;15&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;16&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;17&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;18&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;19&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;20&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;21&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#8217;code&#8217;&gt;&lt;pre&gt;&lt;code class=&#8217;python&#8217;&gt;&lt;span class=&#8217;line&#8217;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;fix_space_in_paragraph&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;sd&quot;&gt;&amp;quot;&amp;quot;&amp;quot; If paragraphs span pages (often) then there could be extra&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;&lt;span class=&quot;sd&quot;&gt;    returns in the paragraphs&#8230;.&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;&lt;span class=&quot;sd&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Peeker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;n&quot;&gt;line2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;peek&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PeekDone&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;n&quot;&gt;line3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;peek&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PeekDone&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line2&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blank&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ends_sentence&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;c&quot;&gt;# don&amp;#39;t use line2 so pop it&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Here&amp;#8217;s a simple generator without &lt;code&gt;Peeker&lt;/code&gt;. I need to ensure that paragraphs have a empty line between them so &lt;code&gt;docutils&lt;/code&gt; does the right thing:&lt;/p&gt;

&lt;figure class=&#8217;code&#8217;&gt;&lt;figcaption&gt;&lt;span&gt;insert_extra_paragraph_line  &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&#8217;line-number&#8217;&gt;1&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;2&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;3&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;4&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;5&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;6&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#8217;code&#8217;&gt;&lt;pre&gt;&lt;code class=&#8217;python&#8217;&gt;&lt;span class=&#8217;line&#8217;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;insert_extra_paragraph_line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ends_paragraph&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;            &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;In the end, using a chain of these generators, I was able to generate three mini-ebooks for my mother before she left for a week-long cruise.&lt;/p&gt;

&lt;p&gt;My scripts for cleaning up the text looked something like this:&lt;/p&gt;

&lt;figure class=&#8217;code&#8217;&gt;&lt;figcaption&gt;&lt;span&gt;script  &lt;/span&gt;&lt;/figcaption&gt;
 &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&#8217;line-number&#8217;&gt;1&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;2&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;3&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;4&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;5&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;6&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;7&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;8&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;9&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;10&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;11&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;12&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;13&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;14&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;15&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;16&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;17&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;18&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;19&lt;/span&gt;
&lt;span class=&#8217;line-number&#8217;&gt;20&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&#8217;code&#8217;&gt;&lt;pre&gt;&lt;code class=&#8217;python&#8217;&gt;&lt;span class=&#8217;line&#8217;&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;ebookgen&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sys&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stdin&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ebookgen&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remove_leading_space&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ebookgen&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remove_dash_page&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ebookgen&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remove_carot_l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ebookgen&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remove_two_spaces&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ebookgen&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remove_double_returns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ebookgen&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;insert_extra_paragraph_line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ebookgen&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;insert_rst_sections&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;span class=&#8217;line&#8217;&gt;    &lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;

</content>
  </entry>
  
  <entry>
    <title>I Would Like Sphinx PDF Generation to Support the LaTeX Memoir Package</title>
    <link href="http://hairysun.com/blog/2012/05/17/i-would-like-sphinx-pdf-generation-to-support-latex-memoir-package/"/>
    <updated>2012-05-17T06:11:00-06:00</updated>
    <id>http://hairysun.com/blog/2012/05/17/i-would-like-sphinx-pdf-generation-to-support-latex-memoir-package</id>
    <content type="html">&lt;p&gt;I would really like to use the same toolset for publishing POD (Print On Demand) books that I use for ebooks. Yet the pdf generation abilities of both docutils and Sphinx seem more focused on pdf &amp;#8220;ebooks&amp;#8221;&amp;#8212;pdf&amp;#8217;s that you would read from a computer&amp;#8212;not pdf&amp;#8217;s that are approriate to create physical books from. I think the solution is &lt;a href=&quot;http://www.ctan.org/tex-archive/macros/latex/contrib/memoir&quot;&gt;to add support for the LaTeX &amp;#8220;memoir&amp;#8221; package&lt;/a&gt; to Sphinx. I&amp;#8217;ll eventually get around to it, but it is not on the top of my stack. To that end I&amp;#8217;ll pay up to $200 (paypal or Amazon gift) to get that support.&lt;/p&gt;

&lt;p&gt;For those not familiar with memoir, here&amp;#8217;s a snippet of the README: &lt;blockquote&gt;&lt;p&gt;Memoir is a flexible class for typesetting poetry, fiction, non-fiction and mathematical works as books, reports, articles or manuscripts. Documents can use 9pt, 10pt, 11pt, 12pt, 14pt, or 17pt as the normal fontsize and, if you have scalable fonts, 20pt, 25pt, 30pt, 36pt, 48pt, or 60pt sizes, or even larger. Many methods are provided to let you create your particular design. The class incorporates over 30 of the more popular packages.&lt;/p&gt;&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;Here are the details. The first person who notifies me of two github repos that meet the following points will get $100:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A github repo containing a Sphinx project that renders out to pdf using the memoir package. The document must have an example of:

&lt;ul&gt;
&lt;li&gt;Half Title Page&lt;/li&gt;
&lt;li&gt;Title Page&lt;/li&gt;
&lt;li&gt;Copyright Page (on verso page)&lt;/li&gt;
&lt;li&gt;Dedication&lt;/li&gt;
&lt;li&gt;Table of Contents&lt;/li&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Chapters (should start on right page)&lt;/li&gt;
&lt;li&gt;An index&lt;/li&gt;
&lt;li&gt;blank pages at the end&lt;/li&gt;
&lt;li&gt;Customizing page size&lt;/li&gt;
&lt;li&gt;The chapers should have an example of:

&lt;ul&gt;
&lt;li&gt;Text spanning multiple pages (lorem ipsum is fine)&lt;/li&gt;
&lt;li&gt;Normal text&lt;/li&gt;
&lt;li&gt;Italicized text&lt;/li&gt;
&lt;li&gt;bold text&lt;/li&gt;
&lt;li&gt;monospace text&lt;/li&gt;
&lt;li&gt;Sections&lt;/li&gt;
&lt;li&gt;footnotes&lt;/li&gt;
&lt;li&gt;a code block&lt;/li&gt;
&lt;li&gt;an admonition&lt;/li&gt;
&lt;li&gt;a long admonition that is longer than a page&lt;/li&gt;
&lt;li&gt;an admonition with a code block inside of it&lt;/li&gt;
&lt;li&gt;a figure&lt;/li&gt;
&lt;li&gt;a table&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A github repo containing a fork of Sphinx that has memoir support. When using this fork with the above project, a suitable pdf should fall out. Numbering of chapters is correct, page numbering is correct (odd on right side), index is correct, etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Ideally most of the book (Table of Contents through Index) would be pure rst (or sphinx rst++). I&amp;#8217;m ok with raw directives on the front matter.&lt;/p&gt;

&lt;p&gt;If you are familiar with LaTeX and Sphinx, this should be pretty straightforward. It would also be a great project for someone interesting in learning those technologies.&lt;/p&gt;

&lt;p&gt;The person who can deliver the above will make me quite happy. But, as I said, I would pay up to $200. The remaining $100 will be appropriated to the developer (or someone else) who sees that this gets pushed upstream into Sphinx proper (ie when I see a bitbucket commit with the changes on the Sphinx project). So the person who files the bug, patch and follows through with any needed tweaks to get this into mainline will get that money. I reserve the right to split up this portion among people as well.&lt;/p&gt;

&lt;p&gt;(I apologize in advance for the github requirement, I prefer that system, so the first deliverable needs to be there. Given that Sphinx prefers bitbucket, you need to play well with them for the second deliverable.)&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Coding Is a Life Skill That Should Be Taught in Elementary School</title>
    <link href="http://hairysun.com/blog/2012/05/16/coding-is-a-life-skill-that-should-be-taught-in-elementary-school/"/>
    <updated>2012-05-16T21:04:00-06:00</updated>
    <id>http://hairysun.com/blog/2012/05/16/coding-is-a-life-skill-that-should-be-taught-in-elementary-school</id>
    <content type="html">&lt;p&gt;&lt;img class=&quot;center&quot; src=&quot;http://hairysun.com/images/ebook-thanks1.jpg&quot;&gt;&lt;/p&gt;

&lt;p&gt;As a seventh grader I had the choice between learning French and Spanish. I choose Spanish because it was practical (or at least my parents convinced me of that), while it seemed that all the cool kids took French. Excuse my French but I think my parents were right&amp;#8212;taking French expecting to actually use it (or have a reason to use it) would be a waste of time. (Sorry to the 2% of my blog visitors to whom that hits home). In fact the same could be said of the two years I took Spanish. I remembered only the colors and my Spanish name, &amp;#8220;Paco&amp;#8221;.&lt;/p&gt;

&lt;p&gt;But taking Spanish for two years twisted my brain enough that I actually took a year of German after (again useless if I were expecting to use it to purchase say a Mercedes). And it was easier this time. When I did become fluent in Spanish three years later, I was grateful that I had learned how to conjugate verbs previously. My uptake was quicker because I had practice. In two months I was dropped off in the middle of Colombia and held my ground ok. (Later my Spanish professor would inform me that speaking in Spanish is insulting in Gringolandia, and I don&amp;#8217;t pull it out too much now. So it was useless.)&lt;/p&gt;

&lt;p&gt;Likewise, the Pascal class I took in High School wasn&amp;#8217;t super practical. I didn&amp;#8217;t even have a machine at home to code Pascal on. I haven&amp;#8217;t coded in Pascal since. Yet the logical manner it taught me to think has been a wonderful life skill. It has even helped me to debug plumbing issues. When a the faucet is clogged, I could just disconnect the pipes connecting the faucet to the wall and start snaking around in the wall. But (given that I have girls around with long hair) it makes sense to start right at the faucet itself and snaking that without even disconnecting any pipes. Less mess, and more time for other less grimey things.&lt;/p&gt;

&lt;p&gt;(Alas learning more about plumbing has helped in other areas as well, such as knowing how to replace a toilet, or stop a leak. It&amp;#8217;s probably a decent life skill to have if you are a homeowner or live in a place with running water.)&lt;/p&gt;

&lt;p&gt;The section I took on Lisp in college was not super practical either. Even then no one programmed in Lisp. Why did I waste that time? Because I have experienced functional constructs, I now appreciate them and see their utility (and even the allure of Clojure). I appreciate list comprehensions, first class functions and the laziness of generators. (If you have read this far in the post you&amp;#8217;ll notice that I also like parentheticals.)&lt;/p&gt;

&lt;p&gt;I had the chance to teach ~80 year old man how to program. He wanted to learn just for the sake of understanding what the little creatures inside of his computer were doing. Waste of time?&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve taught &lt;a href=&quot;https://github.com/mattharrison/epub-for-3rd-graders&quot;&gt;3rd graders how to create ebooks&lt;/a&gt;. That was really an excuse to teach them xml, html, css, typography, fibonacci sequences, image compression, debugging and actually learning how to use a computer for something other than clicking the blue &amp;#8220;e&amp;#8221; and typing in starfall.com. I neglected to inform them that they could have just as easily written their books in Word and exported to HTML. I don&amp;#8217;t feel guilty about that. (Some even wrote thank you cards in both HTML and the rendered output!)&lt;/p&gt;

&lt;p&gt;I have also been able to teach &lt;a href=&quot;https://github.com/mattharrison/ElementaryPython&quot;&gt;3rd graders programming&lt;/a&gt;. They were able to create simple text games with conditionals, functions and looping constructs. Did they create the next 3D shooter? Did they even create a game that they&amp;#8217;d like to play more than once? Mostly not. But they learned a little bit about how computers work. They also learned how to think logically, and how to be specific. (My wife compiler still complains that my English isn&amp;#8217;t specific enough&amp;#8212;too many &amp;#8220;this&amp;#8221; and &amp;#8220;that&amp;#8221;s at line 0. To which her compiler responds &amp;#8220;I have no idea what you are talking about!&amp;#8221;)&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;center&quot; src=&quot;http://hairysun.com/images/ebook-thanks2.jpg&quot;&gt;&lt;/p&gt;

&lt;p&gt;Today, the world still runs on Excel. A poor man&amp;#8217;s database or programming environment. Just today a co-worker asked to help move some data from Excel to a program so more advanced calculations could be performed on the data. There was also an urgency to get rid of the manual labor of tweaking rows and columns. The end user wanted automation and power. (And to be lazy).&lt;/p&gt;

&lt;p&gt;If you have any inclination of working with programmers you should take CS101. You need to have some semblance of understanding of what they need and what you need to help them. Do you feel like a doofus when a car repair person is telling you what you need done to your car? Do you want to get ripped off by the plumber telling you the twenty things he needs to fix?&lt;/p&gt;

&lt;p&gt;How often am I burdened by my (loving) family and neighbors, who knowing that I &amp;#8220;work with computers&amp;#8221; think that that means I can clean the spyware off their XP installation! I imagine that I would not play that beast of burden if others had some understanding of how computers and the internet actually worked.&lt;/p&gt;

&lt;p&gt;Surely a little understanding of what powers the digital aspects of our lives can&amp;#8217;t be too harmful.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Utah Open Source Conference Python Tutorial Materials</title>
    <link href="http://hairysun.com/blog/2012/05/04/utah-open-source-conference-python-tutorial-materials/"/>
    <updated>2012-05-04T21:50:00-06:00</updated>
    <id>http://hairysun.com/blog/2012/05/04/utah-open-source-conference-python-tutorial-materials</id>
    <content type="html">&lt;p&gt;Assignments for UTOS Hands-on Tutorials&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://hairysun.com/downloads/beg_python.zip&quot;&gt;Beginning Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://hairysun.com/downloads/inter_python.zip&quot;&gt;Intermediate Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  
  <entry>
    <title>Indy Python Workshop and UTOS Conference</title>
    <link href="http://hairysun.com/blog/2012/04/13/indy-python-workshop/"/>
    <updated>2012-04-13T07:10:00-06:00</updated>
    <id>http://hairysun.com/blog/2012/04/13/indy-python-workshop</id>
    <content type="html">&lt;p&gt;Today and tomorrow the &lt;a href=&quot;https://openhatch.org/wiki/Indianapolis_Python_Workshop&quot;&gt;Indianapolis Python Workshop&lt;/a&gt; is running. From the website, &amp;#8220;The Indianapolis Python Workshop for women and their friends is a free, hands-on, beginners&amp;#8217; introduction to computer programming.&amp;#8221; This event was inspired by a &lt;a href=&quot;https://openhatch.org/wiki/Boston_Python_Workshop&quot;&gt;similar event in Boston&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;center&quot; src=&quot;https://openhatch.org/w/images/thumb/a/aa/Bpw2-breakout.jpg/300px-Bpw2-breakout.jpg&quot;&gt;&lt;/p&gt;

&lt;p&gt;I love this local effort to empower others by teaching Python. To show my support for the event, I&amp;#8217;m running a promo on my &lt;a href=&quot;http://hairysun.com/books/tread&quot;&gt;Treading on Python&lt;/a&gt;. It will be discounted to $0 during the event as supplementary material.&lt;/p&gt;

&lt;p&gt;For people local to the Rockies, the &lt;a href=&quot;http://conference.utos.org/&quot;&gt;Utah Open Source Conference&lt;/a&gt; is coming up next month. In addition to many awesome talks, I&amp;#8217;ll be giving 2 three hour workshops on Beginning and Intermediate Python. Though not free, the low cost of the event is a great deal considering the quality and quantity of the presentations.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://conference.utos.org/&quot;&gt;&lt;img class=&quot;center&quot; src=&quot;http://conference.utos.org/wp-content/uploads/2012/04/register-now.png&quot;&gt;&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Treading on Python Promotion</title>
    <link href="http://hairysun.com/blog/2012/03/27/treading-on-python-promotion/"/>
    <updated>2012-03-27T07:07:00-06:00</updated>
    <id>http://hairysun.com/blog/2012/03/27/treading-on-python-promotion</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;http://hairysun.com/books/tread/&quot;&gt;Treading on Python&lt;/a&gt; will be on promotion today. If you are a Kindle owner and interested in learning Python, today is your lucky day. If you prefer handouts/cheatsheets &lt;a href=&quot;http://hairysun.com/downloads/BegPythonHandout.pdf&quot;&gt;here&amp;#8217;s another freebie&lt;/a&gt;. Cheers.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>KDP Select for Technical Non-fiction Books Month 2</title>
    <link href="http://hairysun.com/blog/2012/03/26/kdp-select-for-non-technical-books-month-2/"/>
    <updated>2012-03-26T06:42:00-06:00</updated>
    <id>http://hairysun.com/blog/2012/03/26/kdp-select-for-non-technical-books-month-2</id>
    <content type="html">&lt;p&gt;This post describes my efforts at using Amazon KDP select to sell
technical non-fiction books. After some success in my efforts last
month (reaching the top of my sub niche), I can report that I fell
back a few spots but for the most part sales have been steady. As can
been seen in my Amazon sales chart, the rank for my &lt;a href=&quot;http://bit.ly/pytread&quot;&gt;Treading on
Python&lt;/a&gt; book have been semi flat for the past
month. Sales of my &lt;a href=&quot;http://bit.ly/pydec&quot;&gt;Decorator Book&lt;/a&gt; have been similarly
flat. They have been &lt;a href=&quot;http://www.amazon.com/gp/bestsellers/books/285856/ref=pd_zg_hrsr_b_1_5_last&quot;&gt;hovering in rank 8-15&lt;/a&gt;
which is pretty good considering the other books are the standard
Python recommended books or a textbook. Apparently self published
books can do ok, considering my books and that number 1 or 2 is
usually &lt;a href=&quot;http://www.amazon.com/Invent-Computer-Games-Python-Edition/dp/0982106017/ref=zg_bs_285856_2&quot;&gt;Al Sweigart&amp;#8217;s Invent Your Own Computer Games With Python&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;center&quot; src=&quot;http://hairysun.com/images/trend-tread-mar-2012.png&quot; title=&quot;&#8217;Treading on Python Sales Trend&#8217;&quot; &gt;&lt;/p&gt;

&lt;h2&gt;What has happened in the past month?&lt;/h2&gt;

&lt;p&gt;During PyCon I ran a promotion on Treading on Python. The Rasberry Pi
folks picked it up (probably due to Steve Holden&amp;#8217;s tweet) and I
actually had more sales in the UK that in the US that day. (Odd
considering that US is around 8-10X sales of UK in my experience.) Given that sales have been relatively flat, I&amp;#8217;m wondering if I have peaked. Perhaps I have. Though I struggle with efforts to promotion. It seems I&amp;#8217;m labelled as a troll if I try to post anything to reddit programming or hacker news related to my book. Which I find a little odd, because others seem to do so with ease. I can promote through Python channels, which for my more advanced books seems to work, but Treading on Python is aimed at people wanting to learn Python, so promoting through Python channels seems a little less effective there.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m still going to be running a few more promotions for my books. They seemed to have been effective.&lt;/p&gt;

&lt;p&gt;Another challenge has been getting reviews. I think every author struggles with that. (And reviewing is long tail behavior).&lt;/p&gt;

&lt;p&gt;In the meantime I&amp;#8217;ve also silently pushed out my next guide, &lt;a href=&quot;http://bit.ly/pyyield&quot;&gt;Guide to: Learning Iteration and Generators in Python&lt;/a&gt;. This book is not in KDP Select. I&amp;#8217;ll probably put a bundle back up on my site and perhaps BN or Kobo. If you are interested in a review copy let me know.&lt;/p&gt;

&lt;p&gt;To close off this post. I think technical self publishing can be &amp;#8220;successful&amp;#8221;. I&amp;#8217;m not sure that you will retire like fiction writers who hit the jackpot. But I&amp;#8217;m pretty sure that with Amazon&amp;#8217;s 70% (or more if I sell myself), I&amp;#8217;m getting almost as much money as people selling their books for $20-$40 (most of the rest of the people in the Python top 20 list).&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>PyCon 2012 Review</title>
    <link href="http://hairysun.com/blog/2012/03/12/pycon-2012-review/"/>
    <updated>2012-03-12T06:35:00-06:00</updated>
    <id>http://hairysun.com/blog/2012/03/12/pycon-2012-review</id>
    <content type="html">&lt;p&gt;&lt;img class=&quot;center&quot; src=&quot;http://hairysun.com/images/pycondirectory.jpg&quot; title=&quot;&#8217;Professionally done community conference&#8217;&quot; &gt;&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s just a few notes from my PyCon 2012 experience. This was my 7th
PyCon, and though the conference has changed over the years, I think
it is mostly for the better. A general theme of PyCon this year was
data analysis. I&amp;#8217;m probably biased since I&amp;#8217;m doing that at work. In
contrast with previous years, where there seemed to be two Django
tracks running concurrently.&lt;/p&gt;

&lt;p&gt;The quality of the talks has also increased over the years. Most of
the talks I attended appeared to be well rehearsed and pretty well
thought out. Though I did hear some grumbling that many talks could
have gone a little deeper.&lt;/p&gt;

&lt;p&gt;The quality of the food was excellent this year. The quantity less
so. I heard one attendee claim he &amp;#8220;lost 5 pounds during the
conference&amp;#8221;. But herding 2200+ people through the lunch line is no
small task and the team did it with efficiency and ease.&lt;/p&gt;

&lt;p&gt;The layout of the conference was a little confusing. There was a
double indirection between talk locations and the actual
locations. Talks were located in a track. A track was located in (what
appeared to be an arbitrary) room number. Said room number did not
line up with the pre-existing hardcoded conference room numbers and in
some cases conflicted. This caused confusion on the first days of both
tutorials and sessions. With 2200+ people confusion of such type can
be annoying.&lt;/p&gt;

&lt;p&gt;Also the layout of Open Spaces, and the open space signup board was
relegated to a far side of the building that didn&amp;#8217;t get much
traffic. The two BoFs I hosted were poorly attended. Perhaps that is
due to marketing or the subject in general (yes, Python tiling wm&amp;#8217;s
are boring), but there was very small traffic through the open space,
with the exception of the TiP BoF. This BoF was probably larger than
the first PyCon I attended.&lt;/p&gt;

&lt;p&gt;Previous years also had a job board. I told a friend that I would post
a job listing for them. But alas, I never saw the job board this
year. The exhibition hall was perhaps a huge t-shirt dispensing
machine, but no corkboard to post a description on. If you are
interested in changing the world working at a non-profit, ck12.org is
looking to hire.&lt;/p&gt;

&lt;p&gt;The PyCon 5k was a excellent respite from days of sitting and
breathing regurgitated air. The amount of minimalist and even barefoot
shoes relative to the general population leads me to believe that
pythonistas are geeky, enlightened or suffer from Stockholm
Syndrome. I really enjoyed it. During my final tutorial an attendee
pulled out an ultimate disc. It was great to get outside in the
wonderful weather and toss the disc around.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;center&quot; src=&quot;http://hairysun.com/images/pycontut.jpg&quot; title=&quot;All staring intently at facebook&quot; alt=&quot;Facebook&quot;&gt;&lt;/p&gt;

&lt;p&gt;My tutorials were packed. My biggest issue was the influx of people 25
minutes into the first session. Being that it was beginning Python,
that caused a small delay as I helped people get going. It is pretty
satisfying to walk around during the assignment portion helping people
out and realizing that 95% of the people are busy hacking away. They
weren&amp;#8217;t just browsing Facebook or reading email, they were actively
learning Python. One attendee told me it was the best tutorial he had
ever attended, which is nice to hear. I also recieved some more
constructive criticism from others. I&amp;#8217;m always open to feedback, and
if you attended one of my sessions you should fill out the tutorial
survey.&lt;/p&gt;

&lt;p&gt;Yes, Python videos are now up on the web. Some of the content is
there. But the conference is more that the videos. I was talking to
someone who was relating that they had an issue with translation while
they were travelling in Siberia. They did a lazy twitter and got a
response. While we were talking about this a fellow entered the
conversation who was from Russia. Lo and behold he was the lazy web
helper, but the two had NEVER previously met in real life before.&lt;/p&gt;

&lt;p&gt;So yes, PyCon is about the people. And even though there were a lot
this year, it was a great conference.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Not at PyCon? Learn Python Anyway</title>
    <link href="http://hairysun.com/blog/2012/03/07/not-at-pycon-learn-python-anyway/"/>
    <updated>2012-03-07T07:36:00-07:00</updated>
    <id>http://hairysun.com/blog/2012/03/07/not-at-pycon-learn-python-anyway</id>
    <content type="html">&lt;p&gt;PyCon starts today. It&amp;#8217;s great to be back in what used to be my
backyard for PyCon. I love the Bay Area. To celebrate I&amp;#8217;m doing an
Amazon KDP Select Promotion on my &lt;a href=&quot;http://hairysun.com/books/tread&quot;&gt;&lt;em&gt;Treading on Python&lt;/em&gt; book&lt;/a&gt;. During an Amazon &amp;#8220;promotion&amp;#8221;, the price is reduced to
$0.00 for the day!&lt;/p&gt;

&lt;p&gt;This book is aimed at getting programmers quickly bootstrapped on
Python and should correspond quite well with my Beginning Hands-On
Tutorial (go figure). Now I&amp;#8217;m off to register and teach for the day.&lt;/p&gt;

&lt;p&gt;If you are more of the handout/cheatsheet type, you might enjoy the
&lt;a href=&quot;http://hairysun.com/downloads/BegPythonHandout.pdf&quot;&gt;handout for the tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feedback as always is welcome. If you are at PyCon say hi. Cheers.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>PyCon Hands-on Assignments</title>
    <link href="http://hairysun.com/blog/2012/03/06/pycon-hands-on-assignments/"/>
    <updated>2012-03-06T22:09:00-07:00</updated>
    <id>http://hairysun.com/blog/2012/03/06/pycon-hands-on-assignments</id>
    <content type="html">&lt;p&gt;Assigments for PyCon Hands-on Tutorials&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://hairysun.com/downloads/beg_python.zip&quot;&gt;Beginning Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://hairysun.com/downloads/inter_python.zip&quot;&gt;Intermediate Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
  </entry>
  
  <entry>
    <title>Handout for PyCon 2012 Hands-On Python Tutorial</title>
    <link href="http://hairysun.com/blog/2012/03/06/handout-for-pycon-2012-hands-on-python-tutorial/"/>
    <updated>2012-03-06T08:01:00-07:00</updated>
    <id>http://hairysun.com/blog/2012/03/06/handout-for-pycon-2012-hands-on-python-tutorial</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;http://hairysun.com/downloads/BegPythonHandout.pdf&quot;&gt;Here is the latest iteration&lt;/a&gt; of my beginning Python handout. It has gone through a few iterations over the years. It is pretty cool that about 90% of the basics of Python fits on both sides of a legal sized paper.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Amazon KDP Select Non-Fiction Week 3</title>
    <link href="http://hairysun.com/blog/2012/02/20/amazon-kdp-non-fiction-week-3/"/>
    <updated>2012-02-20T21:54:00-07:00</updated>
    <id>http://hairysun.com/blog/2012/02/20/amazon-kdp-non-fiction-week-3</id>
    <content type="html">&lt;p&gt;&lt;img src=&quot;http://hairysun.com/images/promo-rank.png&quot; title=&quot;#1 in Programming&quot; &gt;&lt;/p&gt;

&lt;p&gt;Yesterday was the start of the ultimate test of the promise of Amazon KDP Select. The Kindle Direct Publishing Select program is a 90 day exclusivity commitment to Amazon, in return for some reward. Amazon reports authors finding ~30% increased sales due to enrollment. I&amp;#8217;ve read a bunch of fiction author&amp;#8217;s reports, but none for non-fiction, so I figured it would be a nice experiment. I was previously selling on Barnes and Noble as well as a Epub/Mobi/Pdf bundle on my own site. BN was pretty weak, but my bundle was close to 30%. I figured I could turn it off for a while to experiment.&lt;/p&gt;

&lt;p&gt;I ran a &amp;#8220;promotion&amp;#8221; on one of my books. A promotion for those who are not familiar with Amazon KDP Select is a day where the book is discounted to a price of $0.00. You are allowed five of them when you sign up with Amazon KDP Select. Yes, for the honor of being exclusive to Amazon for 90 days, they give you the ability to sell your book for nothing.&lt;/p&gt;

&lt;p&gt;The idea of a promotion is not new. The idea of free promotion in this world of social media is a little different. I have seen first hand what happens to iPhone apps when they are promoted on such sites. The ideal situation is free loaders (who would normally not buy your digital goods) come in droves and create such a media frenzy that over the next couple of days, those &amp;#8220;lost sales&amp;#8221; turn into marketing gold and you are riding the waves to being the next Indie Developer/Author retiree. Though staying in that short head where the few people who actually make decent money is difficult.&lt;/p&gt;

&lt;p&gt;I have also been on the other side of this. I will admit, I&amp;#8217;m a free loader for Android apps. I visit the Amazon Andriod Market every day just to see what is for free. If the app has good ratings and I think it will be useful now &amp;#8212; or in the future (since I get free updates), I will &amp;#8220;buy&amp;#8221; it. &amp;#8220;Buying it&amp;#8221; doesn&amp;#8217;t force me to actually waste space and download it to one of my android devices. And I&amp;#8217;m a very &amp;#8220;long tail user&amp;#8221; here. I&amp;#8217;m not engaged. I don&amp;#8217;t review or rate the apps. Most of them I haven&amp;#8217;t even bothered to download. But for the chance that I might it the future, I&amp;#8217;ll put it in my Amazon virtual app locker. These days my Kindle Fire is mostly used for Carcassonne (an app that isn&amp;#8217;t even available in Amazon&amp;#8217;s market), though the kids love the normal apps, Angry Birds, Plants vs Zombies, and Where&amp;#8217;s the Water (all Amazon &amp;#8220;purchases&amp;#8221;).&lt;/p&gt;

&lt;p&gt;I can see the appeal of this for fiction where you have potentially mass appeal. I&amp;#8217;m not sure it holds water for non-fiction. Right now my &lt;a href=&quot;http://hairysun.com/books/decorators/&quot;&gt;Guide to: Learning Python Decorators&lt;/a&gt; is #1 in Programming and #275 overall in the &amp;#8220;Free&amp;#8221; Kindle Store. It &amp;#8220;sold&amp;#8221; about 13X more copies during the promotion than it did the other 19 days of the month. It is also possible that I just gave the book away to 90% of the people who might be interested in it. I&amp;#8217;m hoping that maybe I&amp;#8217;ll get a positive review or two out of it. The feedback I&amp;#8217;ve gotten previously from my books has been positive. But I think that the crowd who purchased it was very self selecting. When you discount the price to a freebie, the net widens. It will be interesting to see if the net catches many high value short head readers or not.&lt;/p&gt;

&lt;h2&gt;The Good&lt;/h2&gt;

&lt;p&gt;I actually received useful feedback from online comments. My book is more of an introductory treatise on its subject and does not cover minutiae and corner cases that most people do not run into. I knew this and have two thoughts. One &amp;#8212; I&amp;#8217;m in the process considering how to integrate that content in a way that I like. Two &amp;#8212; said commentor is not in the target audience of this book, they already live this stuff. But that is the hand I am being dealt. I think to &amp;#8220;market&amp;#8221; my book I need endorsement from &amp;#8220;luminaries&amp;#8221;. Yet, they are usually going to endorse something that is appropriate to their level. With my book they are going to pick over every detail, not realizing that the basics that they&amp;#8217;ve lived and breathed for years are confusing and difficult for many to understand.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m still working on creating a physical version of my books. I&amp;#8217;m getting closer. I&amp;#8217;m messing with margin sizes (I like to jot in my non-fiction physical book margins) and formatting of front matter.&lt;/p&gt;

&lt;p&gt;I can&amp;#8217;t complain that I&amp;#8217;m basically in the top position for my genre. Isn&amp;#8217;t that the dream of any self-pubbed writer? I&amp;#8217;m not sure how long it will last. And I&amp;#8217;m curious to see the long term effects of this &amp;#8220;promotion&amp;#8221;.&lt;/p&gt;

&lt;h2&gt;The Bad&lt;/h2&gt;

&lt;p&gt;I did limited marketing. I was away skiing today, so I blogged the night before and tweeted before hitting the slopes. I tried getting it on programming.reddit.com, but am labelled as a troll there, even when I try to give my book away for free. This is somewhat annoying, because any marketing to what I think comprises my target audience is automatically moderated as spam.&lt;/p&gt;

&lt;p&gt;On the flipside, python.reddit.com picked up the book. Sadly they linked to the Amazon page rather that my blog or the book&amp;#8217;s page. (Perhaps that is why prog.reddit moderated down, because of my affliate links &amp;#8230; strange because I get $0 from a $0 sales but I digress).&lt;/p&gt;

&lt;p&gt;Authors often talk about &amp;#8220;platforms&amp;#8221;, which means a different thing for programmers. But author &amp;#8220;platforms&amp;#8221; are the eco-systems around the online presence of their book. They mainly consist of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a book home page&lt;/li&gt;
&lt;li&gt;a blog&lt;/li&gt;
&lt;li&gt;a place to collect email addresses&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I would have preferred that the links during my promotion went to my &amp;#8220;platform&amp;#8221; instead of Amazon&amp;#8217;s. At least they would have understood the backstory and my reasoning behind the promotion in the first place. I can verify that they did not hit mine because my analytics numbers are less than my sales counts. Annoying, but that is the cost of having socially moderated marketing.&lt;/p&gt;

&lt;p&gt;If you are reading this and have less &amp;#8220;trolly&amp;#8221; ways for me to tell you that my book is discounted to a &amp;#8220;free&amp;#8221; price (which includes free lifetime upgrades), pray tell in the comments.&lt;/p&gt;

&lt;p&gt;People don&amp;#8217;t like Amazon, Kindles or Kindle readers (or don&amp;#8217;t have access to them). I received requests asking if I would give them a free pdf of my book. That won&amp;#8217;t happen while I&amp;#8217;m enrolled in KDP Select, being that it is a violation of my contract. Geeks being geeks, they are already discussing the methods to pdf creation, which look sane. I&amp;#8217;d like to further explore this segment of potential &amp;#8220;clients&amp;#8221;. Do they really love pdfs? If so why? Are they ignorant of the many available readers? Are they afraid of being tied into the ebook strangle-hold that Amazon appears to have? Again, I&amp;#8217;m not sure fiction readers care or are this technical, or that their content is important enough that it needs to be in a pdf format for some reason. But these are some of the hurdles that non-fiction writers may have to deal with.&lt;/p&gt;

&lt;h2&gt;The Ugly&lt;/h2&gt;

&lt;p&gt;I also found out this week that some people feel that my book has limited value (I hoped they picked it up when it was priced accordingly). It is not a sentiment that I am entirely unfamiliar with. Having worked very closely with open source (not just as a free time thing, but actually being employed to do so), I&amp;#8217;m aware of &amp;#8220;information wants to be free&amp;#8221; arguments as well as &amp;#8220;people associating non-zero cost with value&amp;#8221;. Many outfits run open source backed by paid solutions to enhance performance, be they software or hardware. But occasionally you rub someone the wrong way.&lt;/p&gt;

&lt;p&gt;So I&amp;#8217;ll say it again. Most of what my books deal with is information that can be found on the web. I&amp;#8217;ve collected, curated, and refined it to a more palatable format (I hope). As do most programming authors. My content has consistently been one of PyCon&amp;#8217;s most popular tutorials. I have no problem with people learning from freely available sources. But many times I would have preferred a well written book on a topic, rather than trying to piece the puzzle together with a bunch of disparate sites.&lt;/p&gt;

&lt;p&gt;Other people have actually written me, thanking me for a concise guide type format to a specific idea. One actually listed a bunch of potential topics. I also have topics that I would be willing to pay for, but am in no way qualified to write.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m wondering if price has something to do with it the gripes. Yet most programming books are expensive and not read. Even more so if they are college &amp;#8220;texts&amp;#8221;. Mine are relatively shorter, cheaper, and hopefully easy to read. Maybe I&amp;#8217;m making a mountain out of a molehill here.&lt;/p&gt;

&lt;p&gt;The tools that Amazon provides for discounts are pretty limited. One nicety of selling my own bundle was the ability to provide discount codes. I understand why the limitation is there for physical goods, but am not sure why they do not support this for virtual goods. I have some ideas, but have heard nothing concrete other than, &amp;#8220;if you want to discount, you do a blanket promotion and give it away free to everyone&amp;#8221;.&lt;/p&gt;

&lt;h2&gt;Other notes&lt;/h2&gt;

&lt;p&gt;US sales ~20X UK, ~40X DE, ~100X IT, ~160X FR, ~400X ES. Sadly I don&amp;#8217;t have website numbers to correlate with Amazon sales due to direct linking to the book in Amazon.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>President&#8217;s Day Decorator Sale</title>
    <link href="http://hairysun.com/blog/2012/02/19/presidents-day-decorator-sale/"/>
    <updated>2012-02-19T22:38:00-07:00</updated>
    <id>http://hairysun.com/blog/2012/02/19/presidents-day-decorator-sale</id>
    <content type="html">&lt;p&gt;The &lt;a href=&quot;http://grpug.org&quot;&gt;Grand Rapids Python User Group&lt;/a&gt; meets on holidays. They meet on holidays to discuss decorators (among other things). They also email authors of &lt;a href=&quot;http://hairysun.com/books/decorators/&quot;&gt;Python decorator books&lt;/a&gt; and ask them if they have free copies to give away at their meetings. Given that I&amp;#8217;m subject to the terms of Amazon KDP Select, I currently cannot give away an individual copy. But I can use a &amp;#8220;promotional&amp;#8221; day to lower the price to $0 for Feb 20, 2012. In return I&amp;#8217;m now an official sponsor of the group!&lt;/p&gt;

&lt;p&gt;Enjoy. Tweet it, reddit it, etc. If you like it, or find it useful, reviews on Amazon or blogs are always appreciated. I am off to the slopes for the day so there might be some radio silence on my end.&lt;/p&gt;

&lt;p&gt;PS &amp;#8212; I&amp;#8217;m still working on getting a dead tree version and am closer than I was last week. Also, I&amp;#8217;m hoping to release the next &amp;#8220;Guide to: Learning &amp;#8230;&amp;#8221; this week. Stay tuned.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Decorate Your Shirt</title>
    <link href="http://hairysun.com/blog/2012/02/17/decorate-your-shirt/"/>
    <updated>2012-02-17T06:42:00-07:00</updated>
    <id>http://hairysun.com/blog/2012/02/17/decorate-your-shirt</id>
    <content type="html">&lt;p&gt;&lt;img class=&quot;center&quot; src=&quot;http://hairysun.com/images/decshirt.jpg&quot;&gt;&lt;/p&gt;

&lt;p&gt;I messed around with &lt;a href=&quot;http://www.cafepress.com/treading_on_python&quot;&gt;Cafepress&lt;/a&gt; last night creating a shirt that I will probably use as a prize at my PyCon Intermediate Hands-On Tutorial. It has a pretty good decorator on the back.&lt;/p&gt;

&lt;p&gt;BTW &amp;#8212; Someone should tell Cafepress about this technology called Ajax&amp;#8230;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Amazon KDP Non-Fiction Week 2 Update</title>
    <link href="http://hairysun.com/blog/2012/02/13/amazon-kdp-week-2-update/"/>
    <updated>2012-02-13T06:03:00-07:00</updated>
    <id>http://hairysun.com/blog/2012/02/13/amazon-kdp-week-2-update</id>
    <content type="html">&lt;p&gt;&lt;img class=&quot;center&quot; src=&quot;http://hairysun.com/images/kindle3-dec.jpg&quot;&gt;&lt;/p&gt;

&lt;p&gt;I am two weeks into &lt;a href=&quot;http://hairysun.com/blog/2012/01/30/amazon-kdp-select-for-non-fiction-technical-books/&quot;&gt;my Amazon KDP non-fiction experiment&lt;/a&gt;. &lt;a href=&quot;http://hairysun.com/books/decorators/&quot;&gt;Guide to: Learning Python Decorators&lt;/a&gt; is currently &lt;a href=&quot;http://www.amazon.com/gp/bestsellers/books/285856/?ie=UTF8&amp;amp;tag=hairysuncom-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=390957&quot;&gt;#15 on the Python list&lt;/a&gt; as I write this, but was up at 5 during the week. It is aso &lt;a href=&quot;http://www.amazon.com/gp/new-releases/books/285856/?ie=UTF8&amp;amp;tag=hairysuncom-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=390957&quot;&gt;#1 on the Python &amp;#8220;Hot New Releases&amp;#8221;&lt;/a&gt;, which surprises me because #2 is a really strong title. Sales of both of my books have been slow and steady. I heard that the average &amp;#8220;indie&amp;#8221; author only sells 4 books/month. I&amp;#8217;m happy to report that I&amp;#8217;m slightly better than that and I will be receiving a check from Amazon this month ($100+ in sales).&lt;/p&gt;

&lt;p&gt;What else have I done this week? I have wondered about Amazon&amp;#8217;s lack of existence in BRIC (Brazil, Russia, India and China). When I had my own store front, I was able to sell to a few individuals from some of those countries. Now I am not because Amazon has no presence there. Again this is probably not something Indie fiction writers care about (with perhaps the exception of India) — I assume fiction is somewhat language dependent. But many programmers know English, so presumably I am losing some sales. How big would they be? I am not sure, but I have received at least one request from someone who claimed they did not have Kindle reader access. Currently my non-US sales are less than 10% of US sales. I am not sure if that is a function of my marketing, or how strong the Amazon presence is in those countries (UK, DE, ES, IT, FR), or some combination of the two.&lt;/p&gt;

&lt;p&gt;I also &lt;a href=&quot;https://authorcentral.amazon.com/gp/landing&quot;&gt;signed up for Amazon Author Central&lt;/a&gt;. Perhaps this will help with SEO, I am not sure, but I now have an &lt;a href=&quot;http://www.amazon.com/gp/entity/Matt-Harrison/B0077BQLH6/?ie=UTF8&amp;amp;refinementId=618073011&amp;amp;tag=hairysuncom-20&amp;amp;linkCode=ur2&amp;amp;camp=1789&amp;amp;creative=390957&quot;&gt;author page&lt;/a&gt;, which also aggregates this blog and my &lt;a href=&quot;http://twitter.com/__mharrison__&quot;&gt;tweetstream&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While at the Utah Python group this week, the first presenter actually mentioned my decorator book in his talk. When the meeting ended, an attendee informed me that he thought my book was pretty good (which he had purchased and was reading during the second presentation). Also he gave me some more feedback, which is always nice.&lt;/p&gt;

&lt;p&gt;I also spent some time looking into pbook generation. My calculation is around 4% of people would prefer dead tree books (very unscientific, consists of requests divided by current sales at some point in time). KDP only requires exclusive digital rights to your sales, not physical, so this is a very real possibility. But, my current pdf generation has issues and I starting learning LaTex to solve those. I hope to have some sort of dead tree versions released soon. I&amp;#8217;m thinking about using CreateSpace, but would be open to using other POD services. If you have experience with POD feel free to drop me some notes.&lt;/p&gt;

&lt;p&gt;My book was &lt;a href=&quot;http://www.thebookdesigner.com/2012/02/ebook-cover-design-awards-january-2012/&quot;&gt;submitted to the January 2012 Ebook Cover Design Awards&lt;/a&gt;, which was released this week. I was hoping to get some feedback on my cover, but did not. I interpret that response as an indication of the “blah”-ness of my cover. Not sufficiently interesting to warrant any praise, nor blatantly bad enough to expose the horrible design elements.&lt;/p&gt;

&lt;p&gt;Finally, a huge advantage to KDP, is I can easily push updates and Amazon handles everything else. A disadvantage is anonymity of purchases. With sales from my site, I had emails for all purchases and could interact with buyers, but pushing updates was a bit more of a pain. Some food for thought if you are considering one or the other. I really like to think that ebooks are somehow “alive” and that I can incorporate reader feedback very quickly and actually push it out, though this is not something that “real” publishers seem to be doing yet. I&amp;#8217;m thinking that I might stay on KDP with my more expensive/longer &lt;a href=&quot;http://hairysun.com/books/tread&quot;&gt;Treading on Python&lt;/a&gt; which receives a higher percentage of &amp;#8220;rentals&amp;#8221;, and make distribution of smaller ebooks more widely available — Kobo, my own site, and perhaps BN again.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Utah Python Feb 2012</title>
    <link href="http://hairysun.com/blog/2012/02/08/utah-python-feb-2012/"/>
    <updated>2012-02-08T06:10:00-07:00</updated>
    <id>http://hairysun.com/blog/2012/02/08/utah-python-feb-2012</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;http://utahpython.org/&quot;&gt;The Utah Python&lt;/a&gt; group will be meeting on Thursday, Feb 9th at 7pm. Amji will be doing a short presentation on a memoization decorator and Eric will be giving a preview of his PyCon talk &amp;#8220;Interfaces and Python&amp;#8221;. Cheers.&lt;/p&gt;
</content>
  </entry>
  
</feed>
