1. disabling blinking

    2014 01 29 technology

    python vision

    Background: Text editing in the IPython Notebook is provided by an excellent JavaScript-based CodeMirror text editor. This might be more detail than you want, but I'm a vision scientist so I hope you'll indulge me.

    The cursor is meant to tell the user the current location.

    The human visual system has a pre-cortical lag of roughly 50-90 ms (read more about P1).

    That's how long it takes from something changing on the screen to cause an avalanche of photons to barrel towards your eyeball, be phototransduced and processed by several stages of cells in the retina, finally causing retinal ganglion cells to fire an action potential down their axons through the optic nerve, make its way to a processing relay station called the LGN, with those cells firing action potential down their axons, with those spikes finally ending up in the primary visual cortex.

    By ~150 ms, our brains have processed the visual input enough to perform a non- trivial ammount of object recognition.

    The default blink rate for CodeMirror is 530ms.

    That's as slow as molasses in January!

    Say that I've been distracted and looked away from the screen. When I look back at the scree, half of the time it will take 3 times longer for me to get the information that I want ("where's my cursor") than if that cursor was clearly visible at all times. Now it's not always that bad, because sometimes my gaze will land on the screen and even though the cursor isn't visible, it appears in a few milliseconds, and so it takes just as long as if the cursor was there the whole time. But if I happen to be particularly unlucky (there's a reason I don't gamble), it can take 6 times longer.

    Try it out

    Here's the bit of JavaScript code you need to disable blinking in CodeMirror.

    CodeMirror.defaults.cursorBlinkRate=0
    

    If you type that into the JavaScript console of your webbrowser, that setting will apply to all cells created in the current IPython Notebook. If you don't know how to open your browser's Javascript console, don't frett, just make a new cell with just the following lines in there, execute it, and make a new cell to see how you like it.

    %%javascript
    CodeMirror.defaults.cursorBlinkRate=0
    

    Make the change stick

    IPython has a notion of profiles to allow for different kinds of configurations. If this is news to you, you've probably just been using the default profile and not known it. In the shell, run the ipython profile create command to be sure (don't worry, if you alreay have a profile, this won't overwrite it). Now ipython locate profile will tell you the directory which contains all of the configuration for the default profile.

    In [1]:
    !ipython profile create
    

    In [2]:
    !ipython locate profile
    

    /home/pi/.ipython/profile_default
    

    In [3]:
    x = !ipython locate profile
    

    In [4]:
    cd $x.s
    

    /home/pi/.ipython/profile_default
    

    In [5]:
    ls
    

    db/  history.sqlite  history.sqlite-journal  ipython_config.py  ipython_nbconvert_config.py  ipython_notebook_config.py  log/  pid/  security/  startup/  static/
    

    There's a lot of stuff there, but we just need to add our one line to the end of the file in static/custom/custom.js

    In [6]:
    cd static/custom/
    
    /home/pi/.ipython/profile_default/static/custom
    

    In [7]:
    ls
    

    custom.css  custom.js
    

    In [8]:
    !echo "codemirror.defaults.cursorblinkrate=0" >> custom.js
    

    "I want it all and I want it now!"

    You say you don't want to save your current notebook and reload it to get the updated CodeMirror settings? You just want all cells in the current notebook to change their behavior? Well, OK, Freddie:

    In [9]:
    %%javascript
    var rate = 0;
    // apply setting to  all current CodeMirror instances
    IPython.notebook.get_cells().map(
        function(c) {  return c.code_mirror.options.cursorBlinkRate=rate;  }
    );
    
    // make sure new CodeMirror instance also use this setting
    CodeMirror.defaults.cursorBlinkRate=rate;
    

    I hope you enjoyed this little IPython customization detour. If you want more information about how to get rid of blinking in other programs you use every day, here is an invaluable resource on that matter.

    Remember, blinking in user interfaces is bad, but blinking in vision is very important.

    This post was written as an IPython Notebook. You can view it on nbviewer, or download it

    read more
  2. What happens to a talk deferred...

    2013 06 17 technology

    python talk

    I'll be in Austin, TX for SciPy next week, and I'll be giving an updated talk about tools for reproducible research.

    What follows is the abstract of a talk that I really wanted to give and submitted to the general track which did not get in. I care deeply about this topic, and I'm hoping to have conversations with others about it. The talk was deferred to a poster, so if you don't bump into me at other times, seek me out during the poster session (mine's poster #15, 10:35 AM - 11:35 AM on June 27th). This post is intended as a pre-conference warm up to that.

    Navigating the Scientific Python Communities - the missing guide.

    The awful truth: our newcomers have a deluge of options to wade through as they begin their journey. What tools are available, how do I install them, how do I make them work together -- all hard questions facing a budding scipythonista.

    On developer-friendly platforms, the popular approach is to just install numpy, scipy, matplotlib, and ipython using package management facilities provided by the operating system. On Mac OS X and Windows, the least painful, bootstrapping approach is to use a Python distribution like Python(X,Y), EPD, Anaconda, or Sage.

    Both of these paths obscure a reality which must be stated explicitly: the development of packages is fundamentally decentralized. The scientific python ecosystem consists of a loose but thriving confederation of projects and communities.

    The chaos of installation options and lack of centralization around a canonical solution, which on the surface appears to be a point of weakness that is detrimental to community growth, is a symptom of one of its greatest strengths. Namely, what we have is a direct democracy for user-developers. They vote with their feet: filing bug reports, testing pre-release versions, participating in mailing lists, writing and reviewing pull requests, and advertising the tools they use in talks, papers, and conversations at conferences.

    I will discuss why this is the case, why this is a good thing, and how we can embrace it. The talk will present the ethos and expectations of an effective newcomer, as well as resources and strategies for incremental progress toward becoming a master scipythonista.

    read more
  3. tags-vs-categories in Pelican

    So, following up on my transition to pelican, here's a little help for navigating a pelican site. If you've ever wondered why sometimes there's a highlighted menu item at the top, and other times there isn't, read on.

    Categories

    With Pelican, every post belongs to exactly one category - that category is 'misc' if one is not provided (and you can override that named by setting DEFAULT_CATEGORY = 'somethingelse' in your pelicanconf.py file). Alternatively, if the post is in a subdirectory, it's category becomes the subdirectory name. So if you have a situation like this:

    .../content/unicorns/lady-rainicorn.md
    

    The lady-rainicorn post will be filed under the category of unicorns. You can explicitly override this category-from-subdirectory behavior, by specifying the category in the header of the file, like so:

    title: All about Lady Rainicorn
    slug: lady-rainicorn
    category: adventure-time
    

    Categories are where a lot of the pelican themes get the top navigation bar, which is referred to as the menu in Pelican. You'll notice that this post is filed under technology. If you're viewing this on the main page, that won't be highlighted, but if you click on the title of this post, you'll see that technology will become highlighted. Same deal if you just click on technology, which will get you a listing of the latest post in that category, and a pagination of all previous ones.

    Pages

    The menu items need not be limited to categories, however. With the popular notmyidea template (which is what I've customized for my journal here), if you create any pages (by putting the file in a content/pages/ directory), then the title of that page will appear in front of all of the categories in the menu. These pages don't show up in RSS feeds, though.

    Menuitems

    Additionally, you can specify other MENUITEMS in pelicanconf.py, which will go in front of all pages and categories. MENUITEMS is a list of tuples, each tuple should be composed of a link name, and a url. This is how I link to the listing of all of my blog posts:

    MENUITEMS = [('all', '/blog/archives.html')]
    

    Tags

    Finally, you can have zero or more tags attached to a post. Tags, by default, do not get a feed generated for them. To enable a tag feed, you'll have to set a line like this in your pelicanconf.py files:

    TAG_FEED_ATOM = "feeds/tag_%s.atom.xml"
    

    Menu highlighting

    The notmyidea template only contains logic for highlighting the active category. This is why, if you click on 'All' at the top of mine, it doesn't stay highlighted when you're on that page.

    On the other hand, if you click at cycling at the menu bar, it will stay highlighted, and you will see a listing of the articles in that category. But if you click on the cycling tag in one of those posts - the menu item will not be highlighted, and you will see some more articles - in particular, right now my review of Just Ride will also be listed, but it lives in the category of books, because that's where I'm keeping book reviews.

    Summary

    So there you have it - now you know the differences between categories, tags, pages, and menu items, as far as Pelican is concerned. For me, the bottom line is that I'll probably stick to just using categories, and will try to use tags sparingly. In my transition from WordPress, I cleaned up and removed a whole bunch of tags (since they were either redundant (the same tags kept appearing together), or were too specific (most tags were only used for one post).

    read more
  4. embracing my hypertextuality

    Well, it's happened again, I've jumped (back) on the static blog engine bandwagon. Early versions of my site were generated literally using #define ,#include, gcc, and a Makefile...). Back then I was transitioning away from using livejournal, and decided to use WordPress so I wouldn't have to roll my own RSS feed generator.

    I tolerated WP for a while - and the frequency of my posts was so low, that it wasn't much of an issue.

    Except for the security upgrades. I logged into the wp-admin console way more times than I cared to just to press the little "upgrade" box. The reason is that wordpress keeps everything in a database that gets queried every time someone hits the site. I was never comfortable with the fact, because content can be lost in case of database corruption during either an upgrade or a security breech. Also, my content just isn't that dynamic. The WP-cache stuff just seemed overkill, since I don't get that many visitors.

    But lately, I've found myself wanting to write more, to post more, but also shying away from it because I hate dealing with the WordPress editor. And I also hate being uncertain about whether any of it will survive the next upgrade, or the next security hole, whichever I happen to stub my toe on first.

    And the thing is, I really like to use version control for everything I do. I liked my blog posts to be just text files I can check into version control. I also like typing "make" to generate the blog, and now I get to!

    For added fun, I'm hoping that writing my posts in markdown will make it easier to coordinate my gopher presence, since it's pretty close.

    For posterity, I'm capturing what the first version of my Pelican-based blog looked like. I did the same thing when I moved to WordPress.

    Embracing my
hypertextuality

    I ran into some confusing things about transitioning to Pelican, so I thought I'd note them here, for the benefit of others.

    Unadulturated code blocks

    I like to use indentation as a proxy for the venerable <tt> tag - which uses a monospace font.

    If you just want to use an indentation, but do not want the indented text parsed as a programming language, put a :::text at the top of that block. Here's what I mean. Take this Oscar Wilde quote, where I've inserted a line break for drammatic effect, for example:

    A gentleman is one who never hurts anyone's feelings
    unintentionally.
    

    Now, you see that ugly red box around the apostrophe? Well, That's because all I did was indent the two lines. If I just put a :::text above the quote, indented to the same level,

        :::text
        A gentleman is one who never hurts anyone's feelings
        unintentionally.
    

    the result will render like this.

    A gentleman is one who never hurts anyone's feelings
    unintentionally.
    

    As the pelican documentation specifies, this is also the way you can also specify the specific programming language you want, so :::python would be one way to not make pygments guess. You can get a list of all supported languages here, just use one of the short names for your language of choice.

    And you should really do this, even if you aren't bothered by the red marks, because the code highlighting plugin goes in and tokenizes all of those words and surrounds them in <span> tags. Here's the HTML generated for the first version:

    <div class="codehilite"><pre><span class="n">A</span> <span class="n">gentleman</span> <span class="n">is</span> <span class="n">one</span> <span class="n">who</span> <span class="n">never</span> <span class="n">hurts</span> <span class="n">anyone</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">feelings</span>
    <span class="n">unintentionally</span><span class="p">.</span>
    </pre></div>
    

    and here's the version generated when you add the :::text line at the top:

    <div class="codehilite"><pre>A gentleman is one who never hurts anyone&#39;s feelings
    unintentionally.
    </pre></div>
    

    nikola?

    At some point, having a dialogue with myself, I wrote in here "or should I not use pelican and use nicola instead?"

    Ok, tried it - nikola takes too long to startup -

    nikola --help
    real    0m1.202s
    user    0m0.876s
    sys     0m0.300s
    
    pelican --help
    real    0m0.639s
    user    0m0.496s
    sys 0m0.132s
    

    I'm sure it's a fine static blogging engine - and Damian Avila's already written IPython Notebook converters for it, but it just feels like it tries to do too many things. Constraints are good. I'll stick with Pelican for now. (Though I did use the nikola wordpress import tool to grab the wp-upload images from my WordPress blog)

    another set of instructions I consulted: Kevin Deldycke's WordPress to Pelican, which is how I did get my articles out using exitwp which I patched slightly, so files got saved as .md, and preserve other format properties.

    Redirects

    also known as: not breaking the web

    I wanted to preserve rss feeds, and also not break old WordPress style /YYYY/MM/DD urls - the Nikola wp-import script had created a url remapping scheme in a file called url_map.csv.

    I don't have that many posts, so I just added them in by hand:

    Options +FollowSymLinks
    RewriteEngine on
    RedirectMatch 301 /blog/feed/ /blog/feeds/all.atom.xml
    RedirectMatch 301 /blog/2006/10/18/todd-chritien-greens-choice-voting/ /blog/todd-chritien-greens-choice-voting.html
    RedirectMatch 301 /blog/2007/01/04/changelogs-with-dates-gui-goodness/ /blog/changelogs-with-dates-gui-goodness.html
    ...
    

    Enabling table of contents for posts

    If you want to include a table of contents within a post using [TOC], you must enabled the markdown toc processor with a line like this is your pelicanconf.py:

    MD_EXTENSIONS =  [ 'toc', 'codehilite','extra']
    

    Categories and tags

    Ok, so this was never clear to me in wordpress, either - but what's the difference between a tag and a category? is it the case that a post can only belong to one category, whereas it can have any number of tags?

    I think I used categories as tags on wordpress. Looks like all posts on Pelican can have at most one category. Turns out this little aside was long enough to turn into its own post, so if you're interested, pelican tags-vs-categories has got you covered.

    That's it for now

    Thanks to Preston Holmes (@ptone) for encouraging me to transition away from WordPress, and pointing me to this post by Gabe Weatherhead (@MacDrifter) for how to do that. It should be said that the pelican documentation itself is very good for getting you going. Additionally, I consulted this post by Steve George which has a good description to get you started, and also covers a bunch of little gotchas, and lots of pointers. Also, thanks to Jake Vanderplas (@jakevdp) for his writeup on transitioning to Pelican, which I will consult later for incorporating IPython notebooks into my markdown posts, in the future. This is good enough for now. LTS.

    read more
  5. Cycling

    2013 05 23 cycling

    cycling

    A page about cycling in the East Bay (and the San Francisco Bay Area in general).

    This started off as the sort of resource that I wish I had when visiting a new town: so hi there, out-of-towner, welcome to our corner of the world. Hope you enjoy your stay and find these resources helpful.

    You need a bike, a water bottle, a jersey or a saddle bag (to store your snack, phone, patch kit). Everything else is optional.

    Routes

    Though I consider myself an avid cyclist, the reality is that I am only mildly so. I have not been on a ton of rides in the area, and don't know them well at all outside of the East Bay - I have yet to cycle across the Golden Gate Bridge - and the Marin Headlands (an omission I plan to rectify soon). I did mountain bike a bit in Marin when I was a kid, and rode a fair bit around the Peninsula while I was in high school. I got my first roadie the summer before heading off to UC Davis. It was a wonderfully light steel blue Peugeot from the 70s (you can see a picture of it here). I convinced (my then future roommate) Philip to get a matching white one. But it was taken from me my first year in grad school (2006). I hadn't been cycling much since, until I started up again recently. Below, you will find a concise guide to some of my favorite rides in the area. As far as my actual experiences, you can get a flavor of the rides I go on by reading my cycling log.

    20-40 km

    Here is the overview: If you want a shorter ride with a great view - I recommend this 24 km (15 mi) loop from UC Berkeley to Grizzly Peak. The ascent to Grizzly Peak Rd is steady and manageable. The road does get pretty rough when you turn off of College until you get to Broadway, but you avoid the dangerous Ashby route to Tunnel Road. Recently, I've been doing a similar ride that avoids that rough patch by going down College Ave all the way to Broadway. As an alternative option, instead of going up to Grizzly Peak, you can turn off for a slightly shorter (but really fun) descent that ends at the historic Claremont Hotel.

    What's nice about these loops is that you can do them back-to-back for a total of ~50 km. But If you want to do a ride that long with more variety, read on for the longer routes.

    50 km and beyond

    If you have some time (about twice the time it takes to do the shorter routes above), the Redwood-Pinehurst route will take you through an incredible canyon that's filled with redwoods! You can take the loop in the other direction - Pinehurst-Redwood.

    Another local favorite is the "Three Bears" ride, which has some truly scenic views all throughout (62 km, ~1 km gain).

    My longest ride was the El Cerrito to Davis 200K

    My previous longest ride took me half-way up Mt Diablo - the views from there are breathtaking. Can't wait to go all the way up! (115.5 km, 1825 m gain)

    Centuries

    I haven't yet completed a century. April 2014 - El Cerrito-Davis 200K was my first century! (132 miles)

    Here are some local ones that I have my eye on.

    Grizzly Peak Century is one that goes through some of the local East Bay routes I described above.

    Best of The Bay Century likewise starts off in the East Bay routes I'm most familiar with, and heads south all the way to San Jose, before returning a bit to Fremont BART station.

    Foxy's Fall Century is an organized ride based out of Davis, CA, where I was an undergrad.

    Davis Double Century is in my sights as well. Maybe next year I'll get on the board of the California Triple Crown.

    There are a lot of long rides listed on the Different Spokes San Francisco website. San Francisco Randonneurs run a very regular brevet series.

    Routes to avoid

    Ohlone Greenway: it's not fun - there are too many stops and unprotected crossings. This is a nice route to take a stroll through, on a bike it's just frustrating.

    Local Bike Shops

    I want to keep track of reasonable places that rent bicycles in the area (in particularly road bikes), as well as routes you should be sure to checkout (with variations, caveats, and general overview).

    Missing Link Bicycle Cooperative - One can't say enough good things about this place, super friendly atmosphere. They're located right downtown Berkeley, they both sell gear and fix bikes, and even have two complete sets of tools and stands you can use to fix up your bike for free!

    Blue Heron Bikes - a relatively new shop (opened in 2012), in "Westbrae" right of the Ohlone Greenway, I cycle past it every day on my commute. Soon after they first opened, I chatted with the owner, Rob, and he's a great guy.

    Wheels of Justice Cyclery - The wheels of justice grind slowly, but exceedingly fine.

    Resources

    Bike East Bay - a very active local group (previously went by the name East Bay Bike Coalition).

    Albany Strollers and Rollers - Albany, California, is a little 1.5 square mile city just north of Berkeley which I call home.

    Berkeley Critical Mass - 2nd Friday of each month - departs at 6pm from Downtown Berkeley BART station.

    East Bay Bike Party - a monthly evening ride.

    Just Ride - my review of Grant Petersen's book.


    Here's some ASCII art I made that I now use as my email signature:

                       _
                      / \
                    A*   \^   -
                 ,./   _.`\\ / \
                / ,--.S    \/   \
               /  `"~,_     \    \
         __o           ?
       _ \<,_         /:\
    --(_)/-(_)----.../ | \
    --------------.......J
    
    read more
  6. Just Ride

    2013 05 17 books

    cycling

    This is a pretty good book - though it's more of a set of short little blog posts combined into a book. It's nice to read the very opinionated thoughts of someone who's been dealing with bicycles for a very long time.

    The whole time I was reading this, I felt like this is the type of stuff that my pal Jon G would have said, and in a similar style to the way he would have said it. I look forward to reading Jon's treatises on cycling in the future.

    Reading this book made me proud to and convinced me to continue to never wear clipless pedals and cycling shoes (I have toe clips), and having a kickstand on my roadie. I'm an unracer - and to quote the title of one of the little chapters: "Racing ruins the breed".

    I also learned how to corner and turn properly - which has been invaluable in my windy descents lately. Finally, I was reminded to not just count miles, because every ride counts ("No ride too short"). Also it makes as much sense to count time spent on the bike, and the amount of elevation gain, and the number of days biked, period. Thanks to my commute, this means my days biked per week stays above 5 during the most of the year in California.

    I also learned a new word: Beausage (byoo-sidj). My current bike doesn't have any, but my last laptop certainly does.

    It also felt kind of cool that the author is local. Grant Petersen founded and still runs Rivendell Bicycle Works in Walnut Creek, CA.

    read more
  7. Cycling log

    2013 04 17 cycling

    cycling

    Why do I keep a log? Read here. This log is terse, if you want longer descriptions of the rides, read my advice for cycling in the East Bay.


    2016-05-07 Grizzly Peak Century - Rode to the start to add an extra 20k and 300m of climbing. (140km, 2100m gain)


    2016-04-30 Treasure Island - rode with Sara and Kayvon - so good to see them both again.


    2017-04-01 Tunnel Road + Orinda dash - A reasonably short ride with Greg

    2017-02-25 SF Tri Club in the East Bay - Kilian invited me and it was great ride. I had to take easy since I haven't ridden any significant amount lately. (113km, 1710m gain, 7 hours) -- 2017-03-22 Direct to Orinda and back - left my water bottle there the weekend prior -- 2017-03-15 Happy Valley loop -- 2017-02-25 Pt Richmond


    2017-02-18 Pt Richmond

    2017-02-11 Pt Richmond

    2017-01-29 Ciba and back - a lovely weather ride with Greg. I stuck around for a Hawk Hill loop before heading home. First time at Ciba - great coffee!


    2017-01-16 Happy valley loop - saw Gabi hiking in Tilden.


    2017-01-13 Friday morning ride - it's been a long time since I did one of these. This time I went alone, fueling up at Bica before heading up the last bit of Broadway.


    2017-01-02 Tour the Flats - Greg and I decided to start the year off right by going all the way across the Bay Bridge. It was cold. The flats gods tried to deter our plans, and halted our progress only 1.3 miles into the ride from our rendez-vous point. But Greg fixed it with grace, and we were on our way. Only to get another flat as soon as we made it to Yerba Buena Island. Once he patched that up, we decided to reward ourselves with cinnamon rolls from Ikea for our heroism.


    2016-10-23 Happy valley loop - didn't take any snacks with me, was OK.


    2016-10-18 Social ride - With Sara and Kayvon.

    2016-10-09 Russian River 200k (modified) - Stork and I had a great day on our bikes. On the way back, we decided to get off Highway 1 and instead backtracked our morning rollout (for calmer road conditions, and at the cost of some extra climbing. This was my first ride in 2 months and it showed - I had to go painfully slow from Bodega Bay to Valley Ford, spinning in low gear without being able to provide any power.


    2016-08-13 El Cerrito - Davis 200k - a my 5 consecutive monthly 200k. Left El Cerrito at 7am and got to St Helena at noon, which is 45 faster than usual for me - but it was so hot that, despite the extra time cushion, I ended up rolling into Davis at 6pm - which is an hour longer than last time. (213km, 2472m climbing, 11 hours total)


    2016-08-12 Friday morning social ride - Danny and Jon, over Grizzly Peak (42 km, 759m gain, 1.5 hours)


    2016-08-07 Bay Trail - Oakland to Fremont with Jon - beautiful day, the mixed terrain was very welcome. (90km, 137m gain, 5 hours)


    2016-08-05 Friday morning social ride - just Danny and I, took Claremont. (40km, 678m gain, 1.5 hours)


    2016-07-23 Happy valley loop - good to be back on the bike, it was a hot one. (57km, 1062m gain, 2.5 hours of saddle time)


    2016-07-10 Cloverdale to SF 200k - Stayed up front at the beggining and got a chance to ride with some fast riders through the first two controls, and then from just before Sir Francis Drake climb. (202km, 1694 gain, 8 hours 40 minutes)


    2016-07-09 Boonville Lollipop 300k - My first 300k! (310km, 3188m gain, 14 hours 56 minutes)


    2016-07-07 Hawk Hill with Janet! We saw whales when we stopped part way down the descent.


    2016-07-03 Return to Reliez - haven't ridden on Reliez Valley Rd for over a year, maybe two... Decided to correct that today. (73km, 1463m gain, 3 hours 40 minutes)


    2016-07-01 Friday with Jon - had a good conversation about 3D modeling tools, and a possible stealth project... (52km, 860m gain)


    2016-06-25 Russian River 200k - what a lovely ride! (205km, 2026m gain, 9 hours 25 minutes)


    2016-06-24 Friday with Danny and Jon - good thing I did this ride, because the only water I had at the start of the 200k the next day was a single mostly full bottle from this outing.


    2016-06-11 Happy valley loop - Saw a gorgeous Stellar's Jay in the woods, and two young deer on the Wildcat on the way back. (57km, 1062m gain, 2.5 hours of saddle time)


    2016-05-22 El Cerrito - Davis 200k - a solo ride, the second in my quest for my first R-12. Took a bunch of photos. (213km, 2472m climbing, 10 hours total)


    2016-05-12 Bike to Work day! A sweet leisurely ride from the office to Hawk Hill (my first time there) with Danny and Janet. Danny and I rode the ferry from Oakland, so I had another 13km before the SF portion of the ride. Danny has a few photos on his Strava (56km, 650m gain, 3 hours)


    2016-05-08 Bear-y Happy Nice and foggy morning ride, fueled by Doughnut Dolly! (75km, 1174 m gain, 3 hours)


    2016-05-01 Grizzly Peak Century - Spontaneously ended up riding with Mark within the first few miles, and after meeting at the first rest stop, we rode most of the 110 mile version of the ride together at a brisk pace. The conversation sure made the miles go by a lot faster. Also bumped into randonneurs Rob Hawks and Barb who volunteered separate rest stops - nice to see familiar faces. (190km, 3101 m gain, ~ 10.5 hours total)


    2016-04-30 The ride of two Pauls - I took Paul The Elder on his first ride in the East Bay. It was a beautiful morning, which we started at Semifreddi's. I had to ditch Paul at the top of Happy Valley to head home, but he was a good sport about it. (56km, 1062m gain, 3.5 hours of saddle time)


    2016-04-29 Another Friday with Danny - Danny and I took on Grizzly Peak - I returned home the more direct way, opting out of the extra climbing. (33km, 579m gain, 2 hours)


    2016-04-16 El Cerrito - Davis 200k - a wonderful day for a ride (213km, 2472m climbing, 9 hours of saddle time, 10 hours total)


    2016-04-10 Happy LaMo return via Arlington again - the weather kept me from leaving earlier in the morning in trying for Mt Diablo. Climbed around Albany Hill when I got back just to add a little extra. (57km, 1062m gain, 3 hours of saddle time)


    2016-04-03 Longer training ride, the 200k is only two weeks away, so I extended my usual loop by going through Moraga. Pleasant sounds of bubbling creeks on Redwood Road: delightful. (88 km, 1720m gain, 4.5 hours)


    2016-04-01 (Anti) Social ride - Danny slept in, so I took on Grizzly Peak by myself. (42 km, 759m gain, 2.5 hours)


    2016-03-26 Happy LaMo return via Arlington - trying to get ready for the El Cerrito-Davis 200k (57km, 1062m gain, 3 hours of saddle time)


    2016-03-25 Friday with Dmatt - Danny and I decided to take on Grizzly Peak. (42 km, 759m gain, 2.5 hours)


    Wildcat Only - wow, not

    Friday with Dmatt

    -- 2016-01-23 A run - ran to El Cerrito BART station, then the North Berkeley one, once around UC Berkeley campus and back. 16.7km, 222m gain -- 2016-01-15 Tunnel Road to Claremont - Danny was freezing, Jon's back tire had a slow leak, but we still got out there! I wore a jacket and was much warmer. (40km, 678m gain, 1.5 hours)


    2016-01-08 Tunnel Road to Claremont - with Jon, I was very cold, was shivering at Fourne for quite a while after the Claremont descent. Jon and I came up with and idea for an electronics project. (40km, 678m gain, 1.5 hours) 2016-01-01 Wildcat Only - wow, not cycling for two months really made me weak... The cold temperature (5-7°C / 41-45° F) didn't help. (31km, 560m gain, 2 hours)


    2015-10-25 Happy LaMo return via Arlington - saw one turkey doing a pretty dance for another turkey... in the middle of the road... Turkey's aren't very smart, it turns out. (57km, 1062m gain, 3 hours of saddle time)


    2015-10-30 Tunnel Road to Claremont - Jon, Danny, and I. Saw some turkeys, one of whom had beef with us and took it out on the car behind us.


    2015-10-25 Happy LaMo return via Arlington (2.5 hours of saddle time)


    2015-10-16 Tunnel Road to Claremont - Just Danny and I today.


    2015-10-10 Winters 200k - continuing my tradition of forgetting to put water in my bottles before rolling out - rode 'dry' and ended up filling them at the first control (38km into the ride). For the first half of the ride, I somehow ended up in a group with 2 anciens and 2 anciennes (Robert, Barry, Kris, and Renee). Having done only two 200k rides before this, I was actually surprised to keep up with them for as long as I did. We got to the Winters control (93km) at 10:10 - I was aiming for 10 hours which would have only put me there a bit before noon. The cardiac hill climb is where I couldn't keep up anymore, though our paths still crossed at the next control (124km) - but I decided to sit and cool off for a bit as they rolled out from there (and finished exactly an hour before me). I was pretty much alone for the second part of the ride, which is too bad, because the headwind was quite strong and took a lot out of me, but I'm happy with my performance. (Photos from an SFR member) (200km, 2266m gain, 9 hours, 28 minutes)


    2015-10-04 Willow Ave Park and Ride Scoped out the Winters 200K start control for next week. (51 km, 460 m gain, 2 hours)


    2015-10-02 Tunnel Road to Claremont - All of us again (Sara, Kayvon, Danny and Jon) - met up at Blue Bottle this time. Fournée post-ride stop again! (40km, 678m gain, 1.5 hours)


    2015-09-27 Pt Reyes Station loop with Danny and Stork! Danny's longest ride ever - but he paid for it with two flats. I played with staying in the big gear for several of the climbs, and the new-to-me segments of the Cross Marin Trail were delightful. (150km, 8 hours)


    2015-09-25 Tunnel Road to Claremont - Our biggest turnout! Sara, Kayvon, Danny and Jon all showed up. Jon got a flat halfway up Tunnel Road. Our first time at Fournee bakery afterwards, yummy! (40km, 678m gain, 1.5 hours)


    2015-09-18 Tunnel Road to Centennial - A ride with Jon and "Hawkeye" Danny! (40km, 678m gain, 1.5 hours)


    2013-09-14 Lucas Valley Populaire: Danny's first randonneuring event, it was a really nice, overcast day. (113km, 1417m gain, 6 hours)


    2015-09-06 Happy Valley First weekend ride with Danny! (56km, 1057m gain, 3 hours)


    2015-09-04 Tunnel Road to Claremont - With Danny and Jonathan! Rode up Euclid for good measure afterwards. (40km, 678m gain, 1.5 hours)


    2015-09-01 Tunnel Road to Centennial - Sara, Kayvon, and Danny! (37km, 600m gain, 1.5 hours)


    2015-08-27 Wildcat and South Park - went for a run with Stéfan afterwards (1.5 hours)


    2015-08-21 Tunnel Road to Centennial - Just DMatt and I this time, we split off with Danny taking Centennial down, whereas I stayed on Grizzly and came down Spruce. (37km, 600m gain, 1.5 hours)


    2015-08-09 Wildcat Moraga Redwood - a good weekend ride. (80km, 1.5km gain, 3.5 hours saddle time)


    2015-08-07 Tunnel Road to Centennial - another Friday morning with Sara and Danny. Danny's first time up to Grizzly Peak. (37km, 600m gain, 2 hours)


    2015-08-03 Freestone Bread Run 200K - Awesome ride with SF Randonneurs, - here's an album where I can be seen holding a coffee at the beginning of the ride. (205km, 3km of climbing, 11 hours 45 minutes of saddle time, 3 wild blackberry pickings on the side of the road)


    2015-07-31 Tunnel Road to Claremont with Sara and Danny (DMatt's first time!). Sadly, found out that Nobolom ...

    read more
  8. remembering John Hunter (1968-2012)

    John Hunter, the author of matplotlib, passed away on August 28th, 2012. He will be dearly missed.

    Please donate to the John Hunter Memorial Fund. A giant in our community, John lead by example and gave us all so much. This is one small way we can give back to his family.

    what follows are excerpts from my paper journal over the past week:

    John Hunter passed away this morning,
    Oh my god. John Hunter was incredibly
    kind and warm -- I can't believe he bought
    me this laptop. I can't believe that such
    a wonderful man could be dead -- so suddenly.
    
        What a tremendous loss.
    

    Dear Merlin,
        John Hunter died yesterday --
    getting unstuck. It is entirely appropriate
    to be stuck -- to feel it, smell it, taste it
    feel it drilling though your head
    

    I keep pacing around the house.
    I just need to leave.
        calmly.
    My thoughts are with John's
    family. & with the folks in Louisiana.
    
        A rat in a maze --
    panicked -- & the water
    level rises still. escalates.
    

        Our loss of John makes me
    want to code furiously.
    

    I feel the urge to code furiously,
    but only have the capacity to tweet about
    it, and lack thereof to censor myself.
    

    I don't believe I'm losing
    my mind. I believe I never had
    one to begin with.
      I'm not losing my mind. I never
      had one to begin with.
      I'm not losing my mind.
      That would imply I had one
      to begin with.
    Left the house without shoes --
    waiting for my laptop to charge.
    
      I want to share this with the
      group -- so I can come to
    terms with it myself. forgive myself.
    
      Connection with a stranger -- can be a form of escape.
    but it can help you gain perspective on
    your own life. I think it has for
    me.
      I am a severely broken
    person. Ok. Time to get shoes,
    shower, & then go to try &
    talk w/ Greg Wilson.
    

    I must be mistaken. Maybe I was.
    Who's to say that I wasn't.
    

    The scientific python community lost one
    of it's giants this week, and
    I lost an important mentor.
    
    Remembering John Hunter (JDH)
    
        People keep dying. I don't know
    how to deal with that -- I feel like
    I never really processed dedushka's death --
    nor Ken Green's, nor Jessi Debaca's,
    nor babushka's
    
    ... I lost another mentor. Most of
    these people (all?) don't know that they
    were mentors to me -- but they were.
    I looked up to John -- I secretly
    wanted to please him -- but did not
    even dare to do so directly (I
    have Fernando Perez to thank for getting
    my first contribution into Matplotlib.
    
    I remember feeling really bad after my first
    sprints at SciPy 2009 -- John actually
    knew who I was -- and wanted me
    to work on some matplotlib stuff --
      I ended up doing some rote work with
    David Warde Farley (and felt kind
    of like a third wheel - since dwf
    (pronounced "dwoof" - did I get
    that right, David?) is more than
    capable as a command-line
    cowboy (David doesn't know this --
    but I learned a great deal from
    just sitting next to him and watching
    him string together standard unix
    tools, pipe-after-pipe -- to clean
    up some scipy wiki content, to
    try and export it to a new site.
    David's also a role model in other ways --
    he's very calm and collected (unless
    he senses you've pushed the bozo button from
    some punditry vending machine - instead of
    understanding and engaging with the full complexity of some
    social or political issue)
    
        John was extremely kind and understanding -- 
    he wanted to invite & welcome me to
    code alongside other matplotlib developers,
    but there was no expectation.
    
      I got to hang out with John the 
    most at the PyData conference in
    Mountain View in late February. He was
    giving a matplotlib talk, and was seeking
    feedback on what to talk about --
    & how to do it. He's warm -- and always
    had this kind smile about him.
    
        After hanging out with John at PyData --
    this email arrived in my inbox
    

    Hey Paul, It was great seeing you again at pydata, and thanks for your help during the talk. We’ve decided that you could be a lot more productive in all your efforts to help ipython, mpl and others if you had a shiny new laptop, so I want to buy you one out of the mpl donations fund. If you spec out the machine you want and send me a link and details, and your preferred shipping address, I’ll order it for you and have it shipped to you. Pick a machine good enough that you can rely on it for a few years, because it looks like you get good use from these things! In other words, don’t feel compelled to be frugal on our behalf.  JDH

    Fernnado knew about the email -- & I was at
    a barbecue at his house -- to sort of
    celebrate an awesome week of lots of
    Python Giants in from out of town.
      Fernando was giddy -- "Have
    you checked your email?" -- with a
    twinkle in his eye "Let's go have you
    check your email right now" -- & he
    walked over to turn on his desktop machine.
    

        On the mailing lists -- I always tried to
    emulate John's approach -- helping everyone
    even if in the slightest manner.
    
    I was offered commit rights sort
    of out of the blue -- after sending
    a couple of pull requests.
    
        We are a community.
    We need to remember John, & keep
    remembering John -- for many, many,
    many years to come.
    
    I feel the urge to reach
    out to everyone I know & don't know.
    I'm desperate -- i think I've been that
    way since I was a little kid -- I
    remember having the same feelings when
    we were leaving Moscow -- a ten-year old,
    talking to friends and my teachers,
    many for the very last time.
    

    I am posting this, but it isn't finished.
    
    This is broken, half-finished, confused,
    necessarily so -- because there is no way
    to mend what we have lost. This
    is an expression of my current state --
    and if I don't let this out, it will just
    keep ricocheting around in my head for years
    to come.
    
        This is a first pass. This is me
    grieving. This will never be enough. This
    is just a start.
    

    videos of John Hunter's talks:

    matplotlib: Lessons from middle age. (Scipy 2012)

    Advanced Matplotlib Tutorial (PyData)

    SciPy 2009 - Advanced tutorial 3: Advanced topics in matplotlib

    (beginning) SampleDoc

    Scipy '09 Panel on Visualization tools

    Scipy '02 Core Projects update

    NIPS Workshop on Machine Learning Open Source Software (MLOSS)

    Fernando Perez and John Hunter

    Sept 2009: "some fun stories like 'Jeez, you guys have some crazy examples. I am surprised there isn't dolphins swimming around inside a sphere.' So now there is."

    read more
  9. pheriday 2: termcasting overview

    pheriday 2: termcasting overview (2012-08-03) from Paul Ivanov on Vimeo.

    paul's habitual errant ramblings (on Fr)idays (2012-08-03)

    show notes:
    http://pirsquared.org/blog/2012/08/04/termcasting/
    gopher://sdf.org/1/users/ivanov/pheridays/2012-08-03 (yes, gopher!)

    1. try to not say "uuuuhhhhmmnn"

    BAM/PFA Summer Cinema on Center Street http://bampfa.berkeley.edu/filmseries/summercinema

    1. SciPy 2012 videos up, go check them out! (I have!) http://www.youtube.com/nextdayvideo (removed nextdayvideo internal box url, by request)

    Software Carpentry: Record and Playback post http://software-carpentry.org/2012/07/record-and-playback/

    1. termcasting: a review of what's out there.

    http://termcast.org and http://alt.org/nethack/ mostly nethack stuff, both just use telnet protocol, only live sessions (though there are "TV" scripts to re-run sets of ttyrec files).

    (playterm vs ascii.io vs shelr.tv)

    tldr: playterm.org supports ttyrec files, but has the most primitive player. Players on ascii.io and shelr.tv can both seek. shelr.tv can also speed up playback! Downside is both of those have their own recorder programs (though at least shelr leverages script or ttyrec)

    http://playterm.org/ - supports ttyrec files, outgoing links for author and related article, comments. - most primitive player (https://github.com/encryptio/jsttyplay/) - Pause only - only terminal sized of 80x24 or 120x35 - supports tags and comments - service only (code for playterm.org does not seem to be available, though jsttyplay is doing the hardest part of actual playback)

    http://ascii.io/ - supports non-standard terminal size - player can seek. - aesthetic thumbnail previews - login via github or twitter credentials (for uploads) - code for website available (ruby and javascript) https://github.com/sickill/ascii.io - code for recorder available (python) https://github.com/sickill/ascii.io-cli

    http://shelr.tv/ - supports non-standard terminal size - player can seek. - player playback speed can be increased (currently up to 10x of real time) - supports tags, comments and voting up/down on a video - shelr can playback from command line ("shelr play http://shelr.tv/records/4f8f30389660802671000012.json") - code for website available (ruby and javascript) [AGPLv3] https://github.com/shelr/shelr.tv - code for recorder available (ruby) [GPLv3] https://github.com/shelr/shelr

    1. my wanted list for termcasting
    2. should support ttyrec files (upload and download)
    3. live-streaming (like ustream - but for coding)
    4. termcast.org has ttrtail which does just this
    5. quick "encrypt" switch - to keep streaming, but start GPG encrypting the stream as it goes out - so you can still look at it later. This would make it easy to leave the streaming on all the time
    6. a .tty editor that's like a video editor cut out portions [i.e. dead time]

    This is a low-bandwidth way of capturing what I'm working on and thinking about. Now, I'm going to try to record everything I do! "ttyrec -e screen -x". I've only done it a couple of times so far while coding, but I find being able to go back and re-view (and review) what I worked on at the end of the day to be really helpful.

    I was inspired by Joey Hess' "git-annex coding in haskell" where he reviews and narrates some of the code he wrote, after he wrote it. http://joeyh.name/screencasts/git-annex_coding_in_haskell/

    P.S. It's Saturday now. I tried to save some local diskspace by running recordmydesktop using the --on-the-fly-encoding option, and that was a mistake. The audio and video were (un)hilariously desynchronized - the audio ran for 9:48, but the video wanted to be just 7:30. Audacity came to the rescue by allowing me to change the tempo to be 30% faster, which made the syncing better. And then I used avconv to stitch in the faster audio.

    tools used: Debian GNU/Linux sid, recordmydesktop, xmonad, fbpanel, screen, chromium, cheese, xcompmgr, audacity, avconv

    read more
  10. pheriday 1: software carpentry, digital artifacts, visiting other OSes

    Here's pheriday 1, another edition of paul's habitual errant ramblings (on Fr)idays

    pheriday 1: software carpentry, digital artifacts, visiting other OSes (2012-07-27) from Paul Ivanov on Vimeo.

    2012-07-27.mp4 (28 MB) 2012-07-27.avi (71 MB) 2012-07-27.ogv (321 MB)

    show notes

    I had three topics I wanted to cover today, and ended up spending about an hour thinking about what I was going to say and which resources I was going to include. This was too long, and the end result was still very rambling, but I think I'll get better at this with more practice.

    SDF Public Access UNIX System http://sdf.org gopher://sdf.org/1

    1. try to not say "uuuuhhhhmmnn"
    2. be lazy (software carpentry)
    3. flipside of "publisher's block" (git-annex)
    4. visiting another country (windows 8 release preview)

    As usual, I didn't know what I was really trying to say in 0, and here's a really good overview of what I meant: Software Carpentry

    If you have 90 seconds, watch the pitch

    play it in 60 seconds, instead: mplayer -af scaletempo -speed 1.5 Software_Carpentry_in_90_Seconds-AHt3mgViyCs.flv

    1. publisher's block

    Jaron Lanier's You Are Not A Gadget What I mention in the video is not at all the main point of Lanier's book (which is quite good!), and in fact, his book is a critique of (over) digitization. Nevertheless, I'm only pointing out that there are redeemable aspects of an increasingly digital artifact producing life, such as preservation.

    David Weinberger’s Everything is Miscellaneous

    My review of David Weinberger’s Everything is Miscellaneous, where I go into more depth about "information overload".

    git-annex Excellent project. The technical details is that when you "annex" files, they are renamed to long hash of their contents (bit rot resistant!) and stored in a .git/annex/objects directory, whereas in place of where the file was, you get a symlink to the original file, which gets added to git. So git only keeps track of symlinks, and additionally has a git-annex branch that keeps track of all known annexes, so that you can copy, move, and drop files from the ones that are accessible. Very handy!

    Haiku OS

    tools used: Debian GNU/Linux sid, recordmydesktop, xmonad, fbpanel, screen, iceweasel, cheese, xcompmgr, youtube-dl, mplayer, screen

    gopher version of this post (proxy)

    read more

« Page 2 / 5 »

social