<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Paul Ivanov’s Journal</title><link href="//pirsquared.org/blog/" rel="alternate"></link><link href="//pirsquared.org/blog/feeds/all.atom.xml" rel="self"></link><id>//pirsquared.org/blog/</id><updated>2025-05-08T00:00:00-07:00</updated><entry><title>Code generation tools: a degenerative disease for free and open source software</title><link href="//pirsquared.org/blog/foss-degenerative-disease.html" rel="alternate"></link><published>2025-05-08T00:00:00-07:00</published><updated>2025-05-08T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2025-05-08:/blog/foss-degenerative-disease.html</id><content type="html">&lt;p&gt;&lt;em&gt;There have been some conversations in the Scientific Python community over the
past several months about what, if anything, should be done regarding
contributions that utilize code generation tools. In preparation for next week's
Developer Summit, &lt;a href="https://github.com/scientific-python/summit-2025/issues/35"&gt;Matthew Brett opened an issue to begin drafting a
SPEC&lt;/a&gt; to help the
community navigate this terrain. What follows is my contribution on that
thread&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Any project that accepts code that was generated by tools violating license
terms dilute and invalidate their own license.&lt;/p&gt;
&lt;p&gt;These include approximately all of the automated tools in use today, as &lt;a href="https://pirsquared.org/blog/current-challenges-in-free-software-and-open-source-development.html#014"&gt;even
training sets that exclude
GPL&lt;/a&gt;
nevertheless violate the terms of BSD and MIT
licenses which require attribution.&lt;/p&gt;
&lt;p&gt;I think a way to address this would be to have attestations in the form of
checkboxes and fill-in-the-blank, akin to those in Contributor License
Agreements (CLAs), that states either that "I did not use code-generation tools
in the production of the code submitted here", or that "The code generation
tools I used was trained only on public domain, no attribution such as
zero-clause BSD, zero-clause MIT, or code within this project" with a
fill-in-the-blank requirement to specify the models that were used. In
particular, in no uncertain terms it should reject contribution that utilized
any of the popular tools in use today, which includes GitHub CoPilot, ChatGPT,
Claude, Llama, Mistral, Replit Code, StarCoder, CodeLLama.&lt;/p&gt;
&lt;p&gt;Projects without such a direct approach are open to drifting and sliding into a
post-legal world. It doesn't matter what license they use, as they lack the
means to assert their own license due to a lack of provenance of their incoming
contributions.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;You can find this post on &lt;a href="https://www.linkedin.com/posts/paulivanov_any-project-that-accepts-code-that-was-generated-activity-7326404220281049088-Asll?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAAACiDKkBPfAruwG6y0yIX9mvoBWDXbmHmE8"&gt;LinkedIn&lt;/a&gt;,
&lt;a href="https://bsky.app/profile/paulivanov.bsky.social/post/3lop7kkykds2s"&gt;Bsky&lt;/a&gt;,
&lt;a href="https://x.com/ivanov/status/1920642426949218494"&gt;Twitter&lt;/a&gt;, or &lt;a href="https://mastodon.sdf.org/@ivanov/114475359498699029"&gt;Mastodon&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;</content><category term="misc"></category><category term="open source"></category><category term="code generation"></category><category term="license laundering"></category><category term="scientific python"></category><category term="python"></category></entry><entry><title>diff-jfk</title><link href="//pirsquared.org/blog/diff-jfk.html" rel="alternate"></link><published>2025-03-28T00:00:00-07:00</published><updated>2025-03-28T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2025-03-28:/blog/diff-jfk.html</id><summary type="html">&lt;p&gt;&lt;em&gt;I did some data munging to match the latest release of JFK assassination
records to their previously released version to produce a &lt;i class="extra"&gt;pop-out&lt;/i&gt; effect
of the newly declassified parts. The resulting over two thousand documents,
spanning eighty thousand pages are now all posted on &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025"&gt;github&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As of March 20th, there is a total of 2,343 documents released by the U.S.
National Archives and Records Administration (NARA) in &lt;a href="https://www.archives.gov/research/jfk/release-2025"&gt;JFK Assassination
Records - 2025 Documents
Release&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The total page count that NARA indicates that there were a total of 77,100
pages released, though in downloading all 2,343 files and summing their page
numbers, I get a higher total of 82,864 pages.&lt;/p&gt;
&lt;p&gt;Wouldn't it be nice if someone went through to highlight the newly un-redacted
parts of previous reports? Well, dear reader, I got you!&lt;/p&gt;
&lt;p&gt;But first let me help you get oriented. &lt;/p&gt;
&lt;h2 id="_fresh-vs-_highlighted"&gt;&lt;code&gt;*_fresh&lt;/code&gt; vs &lt;code&gt;*_highlighted&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;There are two flavors of PDFs that I've generated - &lt;code&gt;_fresh&lt;/code&gt; and &lt;code&gt;_highlighted&lt;/code&gt;.
The &lt;code&gt;_fresh&lt;/code&gt; versions
contain &lt;em&gt;only&lt;/em&gt; the pages where there is something different, and each page has
some text at the top indicate what the corresponding page number was in the original
released document. There's also a &lt;code&gt;_highlighted&lt;/code&gt; version, which contains whole
document, with the highlighting of differences in their entire context. The
notes at the top of the highlighted document (and top of each fresh page) are
in light blue so as not to be too intrusive, and you can highlight them to read
or copy when you end up seeking out the original, because in cases where the
&lt;code&gt;diff-jfk&lt;/code&gt; version is not legible.&lt;/p&gt;
&lt;p&gt;Now you have the necessary information, if you're ready to dive in, just click below:&lt;/p&gt;
&lt;h2 id="happy-sleuthing"&gt;&lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025"&gt; &amp;gt;&amp;gt; Happy Sleuthing &amp;lt;&amp;lt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Otherwise, stick around for some more information and examples.&lt;/p&gt;
&lt;h2 id="unredacted-diffs"&gt;Unredacted diffs&lt;/h2&gt;
&lt;p&gt;Turns out that &lt;a href="https://www.maryferrell.org/"&gt;Mary Ferrell Foundation&lt;/a&gt; is an excellent resource, see &lt;a href="https://www.maryferrell.org/pages/Featured_2025_JFK_Records_Releases.html"&gt;their 2025 JFK Records Releases&lt;/a&gt;. Unlike the MFF, which is choosing to redact the social security numbers, &lt;code&gt;diff-jfk&lt;/code&gt; is not. &lt;/p&gt;
&lt;p&gt;The only visual differences in the &lt;code&gt;diff-jfk&lt;/code&gt; generated documents that are omitted from counting toward &lt;em&gt;fresh&lt;/em&gt; pages are the very top of the first page document. This is where there would be an expected difference in the banner indicating the year of the release. And also the bottom of each page that was used to keep track of document ID and page number but ended up reproducing slightly different in some of the documents, so I discarded that to get fewer false-positives.&lt;/p&gt;
&lt;p&gt;These trivial changes are not informative, so they has been explicitly omitted from "&lt;em&gt;fresh&lt;/em&gt;" consideration. So a document that was initially released in 2023, and again released in 2025, would have a red mark in the last digit of the year in the banner on top of its first page, but such a page would not be considered "&lt;em&gt;fresh&lt;/em&gt;" if there are no other changes on that first page. You will still see that red mark, however, if there were other changes to the page.&lt;/p&gt;
&lt;h2 id="some-samples"&gt;Some samples&lt;/h2&gt;
&lt;p&gt;Here are some examples of the new information that's been released:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_5/104-10301-10001_fresh.pdf"&gt;2025/104-10301-10001_fresh.pdf&lt;/a&gt; - fresh page 1 has previously censored details of CIA's 1961 budget: $41.5 million spent on Cuban operations, $11 million on the rest of Latin America&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/104-10301-10001_1961_CIA_Latin_America_budget.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_6/124-10114-10010_highlighted.pdf"&gt;2025/124-10114-10010_highlighted.pdf&lt;/a&gt; shows you the one previously redacted box, which now reveals the word "Embassy" in between "Paris" and "CAS". CAS is one of the terms of art that I learned in preparing these documents - it stands for Controlled American Source - CIA. &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/124-10114-10010_Paris_Embassy_CAS.png"&gt;&lt;/p&gt;
&lt;p&gt;When it works, it works brilliantly. &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_8/177-10002-10105_fresh.pdf"&gt;2025/177-10002-10105_fresh.pdf&lt;/a&gt; has just the two pages that have newly declassified information which concerns understanding of Soviet submarine fleet in 1966-68, but if you wish you can &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_8/177-10002-10105_highlighted.pdf"&gt;peruse the entire 14 page document&lt;/a&gt; which now highlights the declassification.&lt;/p&gt;
&lt;p&gt;Take for example, &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_5/104-10307-10006_highlighted.pdf"&gt;2025/104-10307-10006_highlighted.pdf&lt;/a&gt;, where you can learn, among other things about how CIA set up a special facility in Miami to &lt;strong&gt;intercept electronically internal communications&lt;/strong&gt; within Cuba, &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/104-10307-10006_page_13.png"&gt;&lt;/p&gt;
&lt;p&gt;details of the 14 countries' spy agencies which "have been most cooperative and helpful" (page 12),&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/104-10307-10006_page_12.png"&gt;&lt;/p&gt;
&lt;p&gt;where one of the sources was a former protege of &lt;strong&gt;Raul CASTRO&lt;/strong&gt; , one was and ambassador of a &lt;strong&gt;North African&lt;/strong&gt; country in Cuba, and another was a &lt;strong&gt;Cuban ambassador&lt;/strong&gt; in Western Europe (page 5).&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/104-10307-10006_page_5.png"&gt;&lt;/p&gt;
&lt;p&gt;Document 104-10178-10000 contains, among other things, the tales of WKSCARLET-3,
with some juicy bits about plans for that Venezuelan to bug the Colombian
delegation in Rome during Colombian-Venezuelan border talks in 1973.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/104-10178-10000_page_72.png"&gt;&lt;/p&gt;
&lt;p&gt;The full-context &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_3/104-10178-10000_highlighted.pdf"&gt;highlighted document&lt;/a&gt; has 310 pages, whereas the &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_3/104-10178-10000_fresh.pdf"&gt;freshly declassified pages&lt;/a&gt; add up to 86. The image above is page 72 in the original document, and appears on page 9 of the fresh-only version.&lt;/p&gt;
&lt;h2 id="limitations-of-minimal-magic"&gt;Limitations of Minimal Magic&lt;/h2&gt;
&lt;p&gt;I didn't do anything fancy to try to get the pages to line up properly. Also,
the approach I took with highlighting works pretty well for pages that were
previously redacted in white, but isn't as legible for documents which were
previously blacked out. So take this with a grain of salt. Hopefully it helps
you identify &lt;em&gt;where&lt;/em&gt; to look in the original document if you can't make it out
in the &lt;code&gt;diff-jfk&lt;/code&gt; version.&lt;/p&gt;
&lt;p&gt;Slight rotations, rescans, change to the cropping, and so on, make the
previously unredacted parts of the document either hard to read or completely
illegible. Nevertheless, despite this limitation, it's still makes it easier to
scan the highlighted document to identify which pages to look at in the newly
unredacted document. For example, scanning through the otherwise atrocious mess
in the &lt;code&gt;diff-jfk&lt;/code&gt; version of
&lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_6/124-10179-10220_highlighted.pdf"&gt;2025/124-10179-10220_highlighted.pdf&lt;/a&gt;,
I was quickly able to come to page 37 that previously had censorship boxes, and
looking on the same page of the
&lt;a href="https://www.archives.gov/files/research/jfk/releases/2025/0318/124-10179-10220.pdf"&gt;original&lt;/a&gt;,
I can see that the August 20, 1968 (Warsaw Pact invasion of Czechoslovakia)
example of positive intelligence involved the wiretapping of, previously
redacted, "the Soviet Mission to the United Nations". On the next page,  phrase
"the Romanian Embassy" was omitted from a description of another wiretap, and
further down the page the previously censored phrase of "intercepts on various
missions to the United Nations and embassies" providing many indicators during
Arab-Israeli Six Day War and the India-Pakistan War.&lt;/p&gt;
&lt;p&gt;There's more to be done, but I wanted to get this out there and not let
perfect be the enemy of good enough. Here's an example of what's supposed to be
the same document but having different page numbers. On the left hand side is
Page 57 of 2023/docid-32404520.pdf and on the right is page 61 of
2025/104-10332-10007.pdf &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/104-10332-10007_State_cover.png"&gt;&lt;/p&gt;
&lt;p&gt;By the way, that's definitely one of the recurring themes for what I've come
across being previously censored but now reveled in these documents: the use of
State department cover. It also came up in, to name just a few:
20225/104-10330-10102.pdf and 2025/104-10330-10083.pdf&lt;/p&gt;
&lt;h2 id="how-diff-jfk-came-to-be"&gt;How &lt;code&gt;diff-jfk&lt;/code&gt; came to be&lt;/h2&gt;
&lt;p&gt;The first thing we can do is just hope for the best and assume that the filename hasn't changed and exactly matches the previous release (2023).&lt;/p&gt;
&lt;p&gt;That gets us 849 files, 36.24% of the total file count with exact matches that were previously released in 2023. Not bad for a first pass, and this haul actually gets us the bulk of the raw-page count, because these 849 files contain 44770 pages, so we're already more than half way there!&lt;/p&gt;
&lt;p&gt;To continue on, it's a bit of a slog, because whereas in 2025 all files started off with the 3-5-5 pattern, that's not the case for earlier years. We luckily have a &lt;a href="https://www.archives.gov/files/research/jfk/national-archives-jfk-assassination-records-2023-release.xlsx"&gt;spreadsheet from 2023&lt;/a&gt; which gives us a mapping for record number to filename. There are also such spreadsheets for &lt;a href="https://www.archives.gov/files/research/jfk/national-archives-jfk-assassination-records-2022-release.xlsx"&gt;2022&lt;/a&gt;, &lt;a href="https://www.archives.gov/files/research/jfk/national-archives-jfk-assassination-records-2021-release.xlsx"&gt;2021&lt;/a&gt;, and the &lt;a href="https://www.archives.gov/files/research/jfk/national-archives-jfk-assassination-records-2017-2018-release.xlsx"&gt;2017-2018 releases&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="duplicate-ambiguity"&gt;Duplicate ambiguity&lt;/h3&gt;
&lt;p&gt;Ok, we also have the problem of ambiguity where from the filename, we have
multiple files for the same record number. For example, we have
&lt;code&gt;./2025/104-10105-10290 (C06932214).pdf&lt;/code&gt; and also &lt;code&gt;./2025/104-10105-10290.pdf&lt;/code&gt;,
there's also &lt;code&gt;2025/124-10273-10007_multirif.pdf&lt;/code&gt; and &lt;code&gt;2025/124-10273-10007.pdf&lt;/code&gt;
and so on.&lt;/p&gt;
&lt;p&gt;Anyway, I'll spare you the rest of the details, except to say that I got pretty
close to finding previous versions of all of the files. &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;873&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1456&lt;/span&gt;
&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1349&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;107&lt;/span&gt;
&lt;span class="mi"&gt;2021&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;107&lt;/span&gt;
&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="n"&gt;_2018&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;94&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There are 2,221 files from the 2025 release that I've managed to match to a
previous version with the same page count. &lt;/p&gt;
&lt;p&gt;Another 26 files where the previous and 2025 release have a different number of
pages. A handful of those just lost or gained a page or two, I was able to
accommodate and fix, but there's more work to be done to completely close those
out.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt; Table of 26 files where previous version does not have same page number (click here toggle visibility)&lt;/summary&gt;
&lt;markdown-accessiblity-table data-catalyst=""&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File Name&lt;/th&gt;
&lt;th&gt;Num Pages&lt;/th&gt;
&lt;th&gt;Previous File Name&lt;/th&gt;
&lt;th&gt;Previous Num Pages&lt;/th&gt;
&lt;th&gt;Page Difference&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10302-10028.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;133&lt;/td&gt;
&lt;td&gt;2023/docid-32401336.pdf&lt;/td&gt;
&lt;td&gt;140&lt;/td&gt;
&lt;td&gt;-7&lt;/td&gt;
&lt;td&gt;The President’s Intelligence Checklist. 2025 shorter by 7 pages, it starts at 21 Nov 1963, whereas in 2023 there was also 20 Nov 1963 – page scrabmled issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10330-10044.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2023/docid-32404031.pdf&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;Page 1 from 2023 omitted in 2025, scanned in a slightly rotated orientation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10330-10083.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;2023/docid-32404069.pdf&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;Page 1 from 2023 omitted in 2025, scanned in a slightly rotated orientation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10332-10007.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;2023/docid-32404520.pdf&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4 pages inserted somewhere, order of pages different after page 35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10332-10008.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;2023/docid-32404521.pdf&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;Page 1 from 2023 omitted in 2025, scanned in a slightly rotated orientation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10332-10009.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;2023/docid-32404522.pdf&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10332-10021.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;2023/docid-32404534.pdf&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;Page 1 from 2023 omitted in 2025 and order of pages is different&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10179-10217.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2022/docid-32989640.pdf&lt;/td&gt;
&lt;td&gt;370&lt;/td&gt;
&lt;td&gt;-368&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10179-10219_multirif.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;370&lt;/td&gt;
&lt;td&gt;2023/124-10179-10219.pdf&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;368&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10179-10221_multirif.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;370&lt;/td&gt;
&lt;td&gt;2022/docid-32989574.pdf&lt;/td&gt;
&lt;td&gt;640&lt;/td&gt;
&lt;td&gt;-270&lt;/td&gt;
&lt;td&gt;should actually be 2022/docid-32989640.pdf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10185-10099 (c06716626).pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;2023/docid-32989624.pdf&lt;/td&gt;
&lt;td&gt;288&lt;/td&gt;
&lt;td&gt;-280&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10185-10099.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;td&gt;2023/docid-32989624.pdf&lt;/td&gt;
&lt;td&gt;288&lt;/td&gt;
&lt;td&gt;-118&lt;/td&gt;
&lt;td&gt;2025/124-10186-10041.pdf is 118 pages long, does it fit here?, also with 8 pages from c0671 below, there’s 2025/104-10210-10037.pdf that’s 110 pages long, as is 2025/104-10164-10110.pdf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10185-10214.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;2022/docid-32989599.pdf&lt;/td&gt;
&lt;td&gt;126&lt;/td&gt;
&lt;td&gt;-115&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10204-10101.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2018/docid-32989602.pdf&lt;/td&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;td&gt;-137&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10206-10180.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;2022/docid-32290904.pdf&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10222-10171.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2022/docid-32298395.pdf&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Page 3 new in 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10226-10305.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;165&lt;/td&gt;
&lt;td&gt;2022/docid-32300025.pdf&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;130&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10271-10299.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;2023/docid-32989588.pdf&lt;/td&gt;
&lt;td&gt;270&lt;/td&gt;
&lt;td&gt;-256&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10271-10301.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2022/docid-32989609.pdf&lt;/td&gt;
&lt;td&gt;223&lt;/td&gt;
&lt;td&gt;-222&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10273-10086_multirif.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;440&lt;/td&gt;
&lt;td&gt;2018/docid-32989602.pdf&lt;/td&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;td&gt;293&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10273-10289_redacted.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3057&lt;/td&gt;
&lt;td&gt;2023/docid-32989646.pdf&lt;/td&gt;
&lt;td&gt;1417&lt;/td&gt;
&lt;td&gt;1640&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10274-10029.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2022/docid-32989627.pdf&lt;/td&gt;
&lt;td&gt;304&lt;/td&gt;
&lt;td&gt;-301&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-90073-10039.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;2022/docid-32328335.pdf&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/157-10014-10005.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;112&lt;/td&gt;
&lt;td&gt;2023/docid-32423393.pdf&lt;/td&gt;
&lt;td&gt;113&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;Page 61 from 2023 omitted in 2025 (as evidenced by page count at the bottom that goes 60 to 62.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/177-10002-10092.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2023/177-10002-10092.pdf&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Page 2 new in 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/180-10147-10176.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;2023/180-10147-10176.pdf&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;Page 1 from 2023 omitted in 2025, scanned in a slightly rotated orientation, size mismatch&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/markdown-accessiblity-table&gt;
&lt;/details&gt;

&lt;p&gt;It's not perfect, but it's a pretty damn good start.&lt;/p&gt;
&lt;h2 id="previously-unreleased-files"&gt;Previously unreleased files&lt;/h2&gt;
&lt;p&gt;Finally, here's a list of files that I believe are entirely new in the 2025
releases. As there is nothing to diff against, I did not generate fresh or
highlight files for them. You can &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/new"&gt;these new files here in their own folder&lt;/a&gt;.&lt;/p&gt;
&lt;details&gt;
&lt;summary class=""&gt; Table of 94 files and their page counts, that were first released in 2025. (click here toggle visibility)&lt;/summary&gt;
&lt;markdown-accessiblity-table data-catalyst=""&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File Name&lt;/th&gt;
&lt;th&gt;Num Pages&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10246.pdf"&gt;&lt;code&gt;2025/124-10203-10246.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10276.pdf"&gt;&lt;code&gt;2025/124-10203-10276.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10292.pdf"&gt;&lt;code&gt;2025/124-10203-10292.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10294.pdf"&gt;&lt;code&gt;2025/124-10203-10294.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10464.pdf"&gt;&lt;code&gt;2025/124-10203-10464.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10465.pdf"&gt;&lt;code&gt;2025/124-10203-10465.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10466.pdf"&gt;&lt;code&gt;2025/124-10203-10466.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10468.pdf"&gt;&lt;code&gt;2025/124-10203-10468.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10482.pdf"&gt;&lt;code&gt;2025/124-10203-10482.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10485.pdf"&gt;&lt;code&gt;2025 …&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/markdown-accessiblity-table&gt;&lt;/details&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;I did some data munging to match the latest release of JFK assassination
records to their previously released version to produce a &lt;i class="extra"&gt;pop-out&lt;/i&gt; effect
of the newly declassified parts. The resulting over two thousand documents,
spanning eighty thousand pages are now all posted on &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025"&gt;github&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As of March 20th, there is a total of 2,343 documents released by the U.S.
National Archives and Records Administration (NARA) in &lt;a href="https://www.archives.gov/research/jfk/release-2025"&gt;JFK Assassination
Records - 2025 Documents
Release&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The total page count that NARA indicates that there were a total of 77,100
pages released, though in downloading all 2,343 files and summing their page
numbers, I get a higher total of 82,864 pages.&lt;/p&gt;
&lt;p&gt;Wouldn't it be nice if someone went through to highlight the newly un-redacted
parts of previous reports? Well, dear reader, I got you!&lt;/p&gt;
&lt;p&gt;But first let me help you get oriented. &lt;/p&gt;
&lt;h2 id="_fresh-vs-_highlighted"&gt;&lt;code&gt;*_fresh&lt;/code&gt; vs &lt;code&gt;*_highlighted&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;There are two flavors of PDFs that I've generated - &lt;code&gt;_fresh&lt;/code&gt; and &lt;code&gt;_highlighted&lt;/code&gt;.
The &lt;code&gt;_fresh&lt;/code&gt; versions
contain &lt;em&gt;only&lt;/em&gt; the pages where there is something different, and each page has
some text at the top indicate what the corresponding page number was in the original
released document. There's also a &lt;code&gt;_highlighted&lt;/code&gt; version, which contains whole
document, with the highlighting of differences in their entire context. The
notes at the top of the highlighted document (and top of each fresh page) are
in light blue so as not to be too intrusive, and you can highlight them to read
or copy when you end up seeking out the original, because in cases where the
&lt;code&gt;diff-jfk&lt;/code&gt; version is not legible.&lt;/p&gt;
&lt;p&gt;Now you have the necessary information, if you're ready to dive in, just click below:&lt;/p&gt;
&lt;h2 id="happy-sleuthing"&gt;&lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025"&gt; &amp;gt;&amp;gt; Happy Sleuthing &amp;lt;&amp;lt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Otherwise, stick around for some more information and examples.&lt;/p&gt;
&lt;h2 id="unredacted-diffs"&gt;Unredacted diffs&lt;/h2&gt;
&lt;p&gt;Turns out that &lt;a href="https://www.maryferrell.org/"&gt;Mary Ferrell Foundation&lt;/a&gt; is an excellent resource, see &lt;a href="https://www.maryferrell.org/pages/Featured_2025_JFK_Records_Releases.html"&gt;their 2025 JFK Records Releases&lt;/a&gt;. Unlike the MFF, which is choosing to redact the social security numbers, &lt;code&gt;diff-jfk&lt;/code&gt; is not. &lt;/p&gt;
&lt;p&gt;The only visual differences in the &lt;code&gt;diff-jfk&lt;/code&gt; generated documents that are omitted from counting toward &lt;em&gt;fresh&lt;/em&gt; pages are the very top of the first page document. This is where there would be an expected difference in the banner indicating the year of the release. And also the bottom of each page that was used to keep track of document ID and page number but ended up reproducing slightly different in some of the documents, so I discarded that to get fewer false-positives.&lt;/p&gt;
&lt;p&gt;These trivial changes are not informative, so they has been explicitly omitted from "&lt;em&gt;fresh&lt;/em&gt;" consideration. So a document that was initially released in 2023, and again released in 2025, would have a red mark in the last digit of the year in the banner on top of its first page, but such a page would not be considered "&lt;em&gt;fresh&lt;/em&gt;" if there are no other changes on that first page. You will still see that red mark, however, if there were other changes to the page.&lt;/p&gt;
&lt;h2 id="some-samples"&gt;Some samples&lt;/h2&gt;
&lt;p&gt;Here are some examples of the new information that's been released:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_5/104-10301-10001_fresh.pdf"&gt;2025/104-10301-10001_fresh.pdf&lt;/a&gt; - fresh page 1 has previously censored details of CIA's 1961 budget: $41.5 million spent on Cuban operations, $11 million on the rest of Latin America&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/104-10301-10001_1961_CIA_Latin_America_budget.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_6/124-10114-10010_highlighted.pdf"&gt;2025/124-10114-10010_highlighted.pdf&lt;/a&gt; shows you the one previously redacted box, which now reveals the word "Embassy" in between "Paris" and "CAS". CAS is one of the terms of art that I learned in preparing these documents - it stands for Controlled American Source - CIA. &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/124-10114-10010_Paris_Embassy_CAS.png"&gt;&lt;/p&gt;
&lt;p&gt;When it works, it works brilliantly. &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_8/177-10002-10105_fresh.pdf"&gt;2025/177-10002-10105_fresh.pdf&lt;/a&gt; has just the two pages that have newly declassified information which concerns understanding of Soviet submarine fleet in 1966-68, but if you wish you can &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_8/177-10002-10105_highlighted.pdf"&gt;peruse the entire 14 page document&lt;/a&gt; which now highlights the declassification.&lt;/p&gt;
&lt;p&gt;Take for example, &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_5/104-10307-10006_highlighted.pdf"&gt;2025/104-10307-10006_highlighted.pdf&lt;/a&gt;, where you can learn, among other things about how CIA set up a special facility in Miami to &lt;strong&gt;intercept electronically internal communications&lt;/strong&gt; within Cuba, &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/104-10307-10006_page_13.png"&gt;&lt;/p&gt;
&lt;p&gt;details of the 14 countries' spy agencies which "have been most cooperative and helpful" (page 12),&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/104-10307-10006_page_12.png"&gt;&lt;/p&gt;
&lt;p&gt;where one of the sources was a former protege of &lt;strong&gt;Raul CASTRO&lt;/strong&gt; , one was and ambassador of a &lt;strong&gt;North African&lt;/strong&gt; country in Cuba, and another was a &lt;strong&gt;Cuban ambassador&lt;/strong&gt; in Western Europe (page 5).&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/104-10307-10006_page_5.png"&gt;&lt;/p&gt;
&lt;p&gt;Document 104-10178-10000 contains, among other things, the tales of WKSCARLET-3,
with some juicy bits about plans for that Venezuelan to bug the Colombian
delegation in Rome during Colombian-Venezuelan border talks in 1973.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/104-10178-10000_page_72.png"&gt;&lt;/p&gt;
&lt;p&gt;The full-context &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_3/104-10178-10000_highlighted.pdf"&gt;highlighted document&lt;/a&gt; has 310 pages, whereas the &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_3/104-10178-10000_fresh.pdf"&gt;freshly declassified pages&lt;/a&gt; add up to 86. The image above is page 72 in the original document, and appears on page 9 of the fresh-only version.&lt;/p&gt;
&lt;h2 id="limitations-of-minimal-magic"&gt;Limitations of Minimal Magic&lt;/h2&gt;
&lt;p&gt;I didn't do anything fancy to try to get the pages to line up properly. Also,
the approach I took with highlighting works pretty well for pages that were
previously redacted in white, but isn't as legible for documents which were
previously blacked out. So take this with a grain of salt. Hopefully it helps
you identify &lt;em&gt;where&lt;/em&gt; to look in the original document if you can't make it out
in the &lt;code&gt;diff-jfk&lt;/code&gt; version.&lt;/p&gt;
&lt;p&gt;Slight rotations, rescans, change to the cropping, and so on, make the
previously unredacted parts of the document either hard to read or completely
illegible. Nevertheless, despite this limitation, it's still makes it easier to
scan the highlighted document to identify which pages to look at in the newly
unredacted document. For example, scanning through the otherwise atrocious mess
in the &lt;code&gt;diff-jfk&lt;/code&gt; version of
&lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/folder_6/124-10179-10220_highlighted.pdf"&gt;2025/124-10179-10220_highlighted.pdf&lt;/a&gt;,
I was quickly able to come to page 37 that previously had censorship boxes, and
looking on the same page of the
&lt;a href="https://www.archives.gov/files/research/jfk/releases/2025/0318/124-10179-10220.pdf"&gt;original&lt;/a&gt;,
I can see that the August 20, 1968 (Warsaw Pact invasion of Czechoslovakia)
example of positive intelligence involved the wiretapping of, previously
redacted, "the Soviet Mission to the United Nations". On the next page,  phrase
"the Romanian Embassy" was omitted from a description of another wiretap, and
further down the page the previously censored phrase of "intercepts on various
missions to the United Nations and embassies" providing many indicators during
Arab-Israeli Six Day War and the India-Pakistan War.&lt;/p&gt;
&lt;p&gt;There's more to be done, but I wanted to get this out there and not let
perfect be the enemy of good enough. Here's an example of what's supposed to be
the same document but having different page numbers. On the left hand side is
Page 57 of 2023/docid-32404520.pdf and on the right is page 61 of
2025/104-10332-10007.pdf &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/jfk/104-10332-10007_State_cover.png"&gt;&lt;/p&gt;
&lt;p&gt;By the way, that's definitely one of the recurring themes for what I've come
across being previously censored but now reveled in these documents: the use of
State department cover. It also came up in, to name just a few:
20225/104-10330-10102.pdf and 2025/104-10330-10083.pdf&lt;/p&gt;
&lt;h2 id="how-diff-jfk-came-to-be"&gt;How &lt;code&gt;diff-jfk&lt;/code&gt; came to be&lt;/h2&gt;
&lt;p&gt;The first thing we can do is just hope for the best and assume that the filename hasn't changed and exactly matches the previous release (2023).&lt;/p&gt;
&lt;p&gt;That gets us 849 files, 36.24% of the total file count with exact matches that were previously released in 2023. Not bad for a first pass, and this haul actually gets us the bulk of the raw-page count, because these 849 files contain 44770 pages, so we're already more than half way there!&lt;/p&gt;
&lt;p&gt;To continue on, it's a bit of a slog, because whereas in 2025 all files started off with the 3-5-5 pattern, that's not the case for earlier years. We luckily have a &lt;a href="https://www.archives.gov/files/research/jfk/national-archives-jfk-assassination-records-2023-release.xlsx"&gt;spreadsheet from 2023&lt;/a&gt; which gives us a mapping for record number to filename. There are also such spreadsheets for &lt;a href="https://www.archives.gov/files/research/jfk/national-archives-jfk-assassination-records-2022-release.xlsx"&gt;2022&lt;/a&gt;, &lt;a href="https://www.archives.gov/files/research/jfk/national-archives-jfk-assassination-records-2021-release.xlsx"&gt;2021&lt;/a&gt;, and the &lt;a href="https://www.archives.gov/files/research/jfk/national-archives-jfk-assassination-records-2017-2018-release.xlsx"&gt;2017-2018 releases&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="duplicate-ambiguity"&gt;Duplicate ambiguity&lt;/h3&gt;
&lt;p&gt;Ok, we also have the problem of ambiguity where from the filename, we have
multiple files for the same record number. For example, we have
&lt;code&gt;./2025/104-10105-10290 (C06932214).pdf&lt;/code&gt; and also &lt;code&gt;./2025/104-10105-10290.pdf&lt;/code&gt;,
there's also &lt;code&gt;2025/124-10273-10007_multirif.pdf&lt;/code&gt; and &lt;code&gt;2025/124-10273-10007.pdf&lt;/code&gt;
and so on.&lt;/p&gt;
&lt;p&gt;Anyway, I'll spare you the rest of the details, except to say that I got pretty
close to finding previous versions of all of the files. &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;873&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1456&lt;/span&gt;
&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1349&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;107&lt;/span&gt;
&lt;span class="mi"&gt;2021&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;107&lt;/span&gt;
&lt;span class="mi"&gt;2017&lt;/span&gt;&lt;span class="n"&gt;_2018&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;94&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There are 2,221 files from the 2025 release that I've managed to match to a
previous version with the same page count. &lt;/p&gt;
&lt;p&gt;Another 26 files where the previous and 2025 release have a different number of
pages. A handful of those just lost or gained a page or two, I was able to
accommodate and fix, but there's more work to be done to completely close those
out.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt; Table of 26 files where previous version does not have same page number (click here toggle visibility)&lt;/summary&gt;
&lt;markdown-accessiblity-table data-catalyst=""&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File Name&lt;/th&gt;
&lt;th&gt;Num Pages&lt;/th&gt;
&lt;th&gt;Previous File Name&lt;/th&gt;
&lt;th&gt;Previous Num Pages&lt;/th&gt;
&lt;th&gt;Page Difference&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10302-10028.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;133&lt;/td&gt;
&lt;td&gt;2023/docid-32401336.pdf&lt;/td&gt;
&lt;td&gt;140&lt;/td&gt;
&lt;td&gt;-7&lt;/td&gt;
&lt;td&gt;The President’s Intelligence Checklist. 2025 shorter by 7 pages, it starts at 21 Nov 1963, whereas in 2023 there was also 20 Nov 1963 – page scrabmled issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10330-10044.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2023/docid-32404031.pdf&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;Page 1 from 2023 omitted in 2025, scanned in a slightly rotated orientation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10330-10083.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;2023/docid-32404069.pdf&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;Page 1 from 2023 omitted in 2025, scanned in a slightly rotated orientation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10332-10007.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;2023/docid-32404520.pdf&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4 pages inserted somewhere, order of pages different after page 35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10332-10008.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;2023/docid-32404521.pdf&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;Page 1 from 2023 omitted in 2025, scanned in a slightly rotated orientation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10332-10009.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;2023/docid-32404522.pdf&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/104-10332-10021.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;2023/docid-32404534.pdf&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;Page 1 from 2023 omitted in 2025 and order of pages is different&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10179-10217.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2022/docid-32989640.pdf&lt;/td&gt;
&lt;td&gt;370&lt;/td&gt;
&lt;td&gt;-368&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10179-10219_multirif.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;370&lt;/td&gt;
&lt;td&gt;2023/124-10179-10219.pdf&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;368&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10179-10221_multirif.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;370&lt;/td&gt;
&lt;td&gt;2022/docid-32989574.pdf&lt;/td&gt;
&lt;td&gt;640&lt;/td&gt;
&lt;td&gt;-270&lt;/td&gt;
&lt;td&gt;should actually be 2022/docid-32989640.pdf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10185-10099 (c06716626).pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;2023/docid-32989624.pdf&lt;/td&gt;
&lt;td&gt;288&lt;/td&gt;
&lt;td&gt;-280&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10185-10099.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;td&gt;2023/docid-32989624.pdf&lt;/td&gt;
&lt;td&gt;288&lt;/td&gt;
&lt;td&gt;-118&lt;/td&gt;
&lt;td&gt;2025/124-10186-10041.pdf is 118 pages long, does it fit here?, also with 8 pages from c0671 below, there’s 2025/104-10210-10037.pdf that’s 110 pages long, as is 2025/104-10164-10110.pdf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10185-10214.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;2022/docid-32989599.pdf&lt;/td&gt;
&lt;td&gt;126&lt;/td&gt;
&lt;td&gt;-115&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10204-10101.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2018/docid-32989602.pdf&lt;/td&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;td&gt;-137&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10206-10180.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;2022/docid-32290904.pdf&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10222-10171.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2022/docid-32298395.pdf&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Page 3 new in 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10226-10305.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;165&lt;/td&gt;
&lt;td&gt;2022/docid-32300025.pdf&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;130&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10271-10299.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;2023/docid-32989588.pdf&lt;/td&gt;
&lt;td&gt;270&lt;/td&gt;
&lt;td&gt;-256&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10271-10301.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2022/docid-32989609.pdf&lt;/td&gt;
&lt;td&gt;223&lt;/td&gt;
&lt;td&gt;-222&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10273-10086_multirif.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;440&lt;/td&gt;
&lt;td&gt;2018/docid-32989602.pdf&lt;/td&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;td&gt;293&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10273-10289_redacted.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3057&lt;/td&gt;
&lt;td&gt;2023/docid-32989646.pdf&lt;/td&gt;
&lt;td&gt;1417&lt;/td&gt;
&lt;td&gt;1640&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-10274-10029.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2022/docid-32989627.pdf&lt;/td&gt;
&lt;td&gt;304&lt;/td&gt;
&lt;td&gt;-301&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/124-90073-10039.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;2022/docid-32328335.pdf&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/157-10014-10005.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;112&lt;/td&gt;
&lt;td&gt;2023/docid-32423393.pdf&lt;/td&gt;
&lt;td&gt;113&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;Page 61 from 2023 omitted in 2025 (as evidenced by page count at the bottom that goes 60 to 62.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/177-10002-10092.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2023/177-10002-10092.pdf&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Page 2 new in 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2025/180-10147-10176.pdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;2023/180-10147-10176.pdf&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;-1&lt;/td&gt;
&lt;td&gt;Page 1 from 2023 omitted in 2025, scanned in a slightly rotated orientation, size mismatch&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/markdown-accessiblity-table&gt;
&lt;/details&gt;

&lt;p&gt;It's not perfect, but it's a pretty damn good start.&lt;/p&gt;
&lt;h2 id="previously-unreleased-files"&gt;Previously unreleased files&lt;/h2&gt;
&lt;p&gt;Finally, here's a list of files that I believe are entirely new in the 2025
releases. As there is nothing to diff against, I did not generate fresh or
highlight files for them. You can &lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025/new"&gt;these new files here in their own folder&lt;/a&gt;.&lt;/p&gt;
&lt;details&gt;
&lt;summary class=""&gt; Table of 94 files and their page counts, that were first released in 2025. (click here toggle visibility)&lt;/summary&gt;
&lt;markdown-accessiblity-table data-catalyst=""&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File Name&lt;/th&gt;
&lt;th&gt;Num Pages&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10246.pdf"&gt;&lt;code&gt;2025/124-10203-10246.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10276.pdf"&gt;&lt;code&gt;2025/124-10203-10276.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10292.pdf"&gt;&lt;code&gt;2025/124-10203-10292.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10294.pdf"&gt;&lt;code&gt;2025/124-10203-10294.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10464.pdf"&gt;&lt;code&gt;2025/124-10203-10464.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10465.pdf"&gt;&lt;code&gt;2025/124-10203-10465.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10466.pdf"&gt;&lt;code&gt;2025/124-10203-10466.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10468.pdf"&gt;&lt;code&gt;2025/124-10203-10468.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10482.pdf"&gt;&lt;code&gt;2025/124-10203-10482.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10485.pdf"&gt;&lt;code&gt;2025/124-10203-10485.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10489.pdf"&gt;&lt;code&gt;2025/124-10203-10489.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10494.pdf"&gt;&lt;code&gt;2025/124-10203-10494.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10203-10497.pdf"&gt;&lt;code&gt;2025/124-10203-10497.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10004.pdf"&gt;&lt;code&gt;2025/124-10204-10004.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10146.pdf"&gt;&lt;code&gt;2025/124-10204-10146.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10147.pdf"&gt;&lt;code&gt;2025/124-10204-10147.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10154.pdf"&gt;&lt;code&gt;2025/124-10204-10154.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10157.pdf"&gt;&lt;code&gt;2025/124-10204-10157.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10203.pdf"&gt;&lt;code&gt;2025/124-10204-10203.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10204.pdf"&gt;&lt;code&gt;2025/124-10204-10204.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10206.pdf"&gt;&lt;code&gt;2025/124-10204-10206.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10209.pdf"&gt;&lt;code&gt;2025/124-10204-10209.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10211.pdf"&gt;&lt;code&gt;2025/124-10204-10211.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10212.pdf"&gt;&lt;code&gt;2025/124-10204-10212.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10213.pdf"&gt;&lt;code&gt;2025/124-10204-10213.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10215.pdf"&gt;&lt;code&gt;2025/124-10204-10215.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10278.pdf"&gt;&lt;code&gt;2025/124-10204-10278.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10297.pdf"&gt;&lt;code&gt;2025/124-10204-10297.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10322.pdf"&gt;&lt;code&gt;2025/124-10204-10322.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10204-10495.pdf"&gt;&lt;code&gt;2025/124-10204-10495.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10008.pdf"&gt;&lt;code&gt;2025/124-10223-10008.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10015.pdf"&gt;&lt;code&gt;2025/124-10223-10015.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10017.pdf"&gt;&lt;code&gt;2025/124-10223-10017.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10042.pdf"&gt;&lt;code&gt;2025/124-10223-10042.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10064.pdf"&gt;&lt;code&gt;2025/124-10223-10064.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10067.pdf"&gt;&lt;code&gt;2025/124-10223-10067.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10068.pdf"&gt;&lt;code&gt;2025/124-10223-10068.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10070.pdf"&gt;&lt;code&gt;2025/124-10223-10070.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10071.pdf"&gt;&lt;code&gt;2025/124-10223-10071.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10073.pdf"&gt;&lt;code&gt;2025/124-10223-10073.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10074.pdf"&gt;&lt;code&gt;2025/124-10223-10074.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10076.pdf"&gt;&lt;code&gt;2025/124-10223-10076.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10077.pdf"&gt;&lt;code&gt;2025/124-10223-10077.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10079.pdf"&gt;&lt;code&gt;2025/124-10223-10079.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10082.pdf"&gt;&lt;code&gt;2025/124-10223-10082.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10083.pdf"&gt;&lt;code&gt;2025/124-10223-10083.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10085.pdf"&gt;&lt;code&gt;2025/124-10223-10085.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10086.pdf"&gt;&lt;code&gt;2025/124-10223-10086.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10087.pdf"&gt;&lt;code&gt;2025/124-10223-10087.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10088.pdf"&gt;&lt;code&gt;2025/124-10223-10088.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10101.pdf"&gt;&lt;code&gt;2025/124-10223-10101.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10121.pdf"&gt;&lt;code&gt;2025/124-10223-10121.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10159.pdf"&gt;&lt;code&gt;2025/124-10223-10159.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10164.pdf"&gt;&lt;code&gt;2025/124-10223-10164.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10169.pdf"&gt;&lt;code&gt;2025/124-10223-10169.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10171.pdf"&gt;&lt;code&gt;2025/124-10223-10171.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10173.pdf"&gt;&lt;code&gt;2025/124-10223-10173.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/124-10223-10304.pdf"&gt;&lt;code&gt;2025/124-10223-10304.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10237.pdf"&gt;&lt;code&gt;2025/135-10001-10237.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10238.pdf"&gt;&lt;code&gt;2025/135-10001-10238.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10239.pdf"&gt;&lt;code&gt;2025/135-10001-10239.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10243.pdf"&gt;&lt;code&gt;2025/135-10001-10243.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10245.pdf"&gt;&lt;code&gt;2025/135-10001-10245.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10246.pdf"&gt;&lt;code&gt;2025/135-10001-10246.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10253.pdf"&gt;&lt;code&gt;2025/135-10001-10253.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10255.pdf"&gt;&lt;code&gt;2025/135-10001-10255.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10276.pdf"&gt;&lt;code&gt;2025/135-10001-10276.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10279.pdf"&gt;&lt;code&gt;2025/135-10001-10279.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10283.pdf"&gt;&lt;code&gt;2025/135-10001-10283.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10287.pdf"&gt;&lt;code&gt;2025/135-10001-10287.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10288.pdf"&gt;&lt;code&gt;2025/135-10001-10288.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/135-10001-10297.pdf"&gt;&lt;code&gt;2025/135-10001-10297.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;215&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/144-10001-10213.pdf"&gt;&lt;code&gt;2025/144-10001-10213.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/144-10001-10218.pdf"&gt;&lt;code&gt;2025/144-10001-10218.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/180-10143-10222.pdf"&gt;&lt;code&gt;2025/180-10143-10222.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/180-10143-10384.pdf"&gt;&lt;code&gt;2025/180-10143-10384.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10000.pdf"&gt;&lt;code&gt;2025/206-10001-10000.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10001.pdf"&gt;&lt;code&gt;2025/206-10001-10001.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10002.pdf"&gt;&lt;code&gt;2025/206-10001-10002.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10003.pdf"&gt;&lt;code&gt;2025/206-10001-10003.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10004.pdf"&gt;&lt;code&gt;2025/206-10001-10004.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10005.pdf"&gt;&lt;code&gt;2025/206-10001-10005.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10006.pdf"&gt;&lt;code&gt;2025/206-10001-10006.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10007.pdf"&gt;&lt;code&gt;2025/206-10001-10007.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10008.pdf"&gt;&lt;code&gt;2025/206-10001-10008.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10009.pdf"&gt;&lt;code&gt;2025/206-10001-10009.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10010.pdf"&gt;&lt;code&gt;2025/206-10001-10010.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10011.pdf"&gt;&lt;code&gt;2025/206-10001-10011.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10012.pdf"&gt;&lt;code&gt;2025/206-10001-10012.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10013.pdf"&gt;&lt;code&gt;2025/206-10001-10013.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10014.pdf"&gt;&lt;code&gt;2025/206-10001-10014.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10015.pdf"&gt;&lt;code&gt;2025/206-10001-10015.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10016.pdf"&gt;&lt;code&gt;2025/206-10001-10016.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="/ivanov/diff-jfk/blob/main/2025/new/206-10001-10017.pdf"&gt;&lt;code&gt;2025/206-10001-10017.pdf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/markdown-accessiblity-table&gt;
&lt;/details&gt;

&lt;h2 id="issues-and-discussion"&gt;Issues and Discussion&lt;/h2&gt;
&lt;p&gt;If you want to leave a comment, or just come across something cool or
interesting that you want to share with others, please open a new thread or
join one over in the &lt;a href="https://github.com/ivanov/diff-jfk/discussions"&gt;discussions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please report any issues you come across in the &lt;code&gt;diff-jfk&lt;/code&gt; data. In particular,
I'd like to know if I have mislabelled some of the 2025 releases which I marked
as new, so do let me know if there's a prior version of one of those documents,
so that I can generate a proper diff of those. I'd also like to know if
some of the file contents from NARA have changed. This last part might seem
like an odd, but here's are &lt;a href="http://rgr-cyt.org/2018/01/confusion-at-nara/"&gt;some examples of document id confusion from
2018&lt;/a&gt;: multiple record
identifiers mapping to the same file name, and the same filename having
different version depending on when it was downloaded.&lt;/p&gt;
&lt;h2 id="parting-thoughts"&gt;Parting thoughts&lt;/h2&gt;
&lt;p&gt;It took more time than you might expect to tinker around and connect all of the
dots to produce &lt;code&gt;diff-jfk&lt;/code&gt;. I hope you enjoy perusing it as much as I do. If
you end up finding something interesting, why not share it with others by
posting in the &lt;a href="https://github.com/ivanov/diff-jfk/discussions"&gt;discussions&lt;/a&gt;.
For attribution, please link to either &lt;a href="https://pirsquared.org/blog/diff-jfk.html"&gt;this
post&lt;/a&gt; or the &lt;a href="https://github.com/ivanov/diff-jfk"&gt;diff-jfk
repository&lt;/a&gt;, which you can also star if
you've got a github account and are feeling generous. I also enabled
sponsorship on that repo if you want to support my work financially. &lt;/p&gt;
&lt;h2 id="happy-sleuthing_1"&gt;&lt;a href="https://github.com/ivanov/diff-jfk/tree/main/2025"&gt; &amp;gt;&amp;gt; Happy Sleuthing &amp;lt;&amp;lt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Paul Ivanov&lt;/p&gt;</content><category term="democracy"></category><category term="jfk"></category><category term="pdf"></category><category term="diff"></category><category term="diff-jfk"></category><category term="assasination"></category><category term="visualization"></category></entry><entry><title>Current Challenges in Free Software and Open Source Development</title><link href="//pirsquared.org/blog/current-challenges-in-free-software-and-open-source-development.html" rel="alternate"></link><published>2025-01-24T00:00:00-08:00</published><updated>2025-01-24T00:00:00-08:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2025-01-24:/blog/current-challenges-in-free-software-and-open-source-development.html</id><summary type="html">&lt;p&gt;&lt;em&gt;This is a lightly edited transcript of a talk I gave at Bay Area Drupal Camp in
Oakland on October 24th, 2024 to an audience of about 40 people. I will be inlining
images, but you can also &lt;a href="https://pirsquared.org/talks/badcamp"&gt;peruse the slides directly&lt;/a&gt;. There's a &lt;a href="https://www.youtube.com/watch?v=3lYNljulFC8"&gt;recording available&lt;/a&gt; that has audio synchronized with the slides, but this post leaves out my stumbles, uhs, ums, and other vocal pauses.&lt;/em&gt; &lt;i class="extra"&gt;(Additional context will appear like this)&lt;/i&gt;&lt;/p&gt;
&lt;!-- ![](/talks/badcamp/slides.000.jpg) --&gt;

&lt;p&gt;Thank you all for coming. I just
want to get started by asking you a
little bit about yourself. So how many of
you identify as
developers? &lt;i class="extra"&gt; ( 3/4 of audience raises their hands )&lt;/i&gt; How many of you have
&lt;strong&gt;&lt;em&gt;transcended&lt;/em&gt;&lt;/strong&gt; developers? &lt;i class="extra"&gt;(a fifth of the room) &lt;/i&gt; Still alive, still doing
okay? Okay. How about open source developers? &lt;i class="extra"&gt;(half the room)&lt;/i&gt; Commercial
developers? &lt;i class="extra"&gt;(a fifth)&lt;/i&gt; Okay, so some of the same hands are going up.
Great and competing sessions are also great, so we won&amp;#39;t say anything bad
about them.  I don&amp;#39;t even use Playwright or
what was the other one,  Cypress &amp;mdash;  I
use &lt;a href="https://testcafe.io/"&gt;TestCafe&lt;/a&gt;  I&amp;#39;m, like, weird.&lt;/p&gt;
&lt;p&gt;&lt;a name="001" /&gt;&lt;/p&gt;
&lt;h2 id="_1"&gt;&lt;a href="#001"&gt; &lt;img alt="" src="/talks/badcamp/slides.001.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There we go, a little bit about me &amp;mdash; I&amp;#39;m...
weird.  &lt;/p&gt;
&lt;p&gt;I&amp;#39;ve been in the Python ecosystem for a very long time.
I started off in graduate school &lt;i class="extra"&gt;(2006)&lt;/i&gt; at
UC Berkeley working on matplotlib.  I got my
commit rights there, so that&amp;#39;s  the
community I came from, and then I became one of the
leaders in IPython and the Jupyter world,
a project that&amp;#39;s been rewarded by the ACM with the Software
System Award &lt;i class="extra"&gt;(2017)&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Now, I don&amp;#39;t normally start off
my talks with like "&lt;i&gt;oh look at me &amp;mdash;  I&amp;#39;m a
big shot! Look at &lt;a href="https://awards.acm.org/award_winners/ivanov_4826208"&gt;this big award I got&lt;/a&gt;&lt;/i&gt;"
but this will be relevant, very
relevant, to the talk because the ACM
is the &lt;a href="https://acm.org"&gt;Association for Computing Machinery&lt;/a&gt;, as you may know.
It&amp;#39;s &lt;strong&gt;&lt;em&gt;the&lt;/em&gt;&lt;/strong&gt; Professional Organization for computer
scientists it was founded in 1947, so 77
years ago. &lt;/p&gt;
&lt;p&gt;Since most of the
room raised their hands and said they&amp;#39;re
developers, I&amp;#39;m going to get super nerdy
because we&amp;#39;re all among friends here, and 
talk history and things like that. &lt;/p&gt;
&lt;p&gt;The award is a glass trapezoid sitting on its side, so it
doesn&amp;#39;t actually film very well.
You can kind of maybe see that there&amp;#39;s
this reflection, anyway, but the books in the
background &lt;i class="extra"&gt;(Frank Herbert's &lt;u&gt;Dune&lt;/u&gt;)&lt;/i&gt; are &lt;strong&gt;foreshadowing&lt;/strong&gt;.
So you can kind of mentally place a  🌶️ chili emoji somewhere on there, if you&amp;#39;re
into that sort of thing, because &lt;strong&gt;the spice must flow&lt;/strong&gt;. &lt;i class="extra"&gt;(audience chuckles)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;The other things on the slide is that I used to
work in academia at UC Berkeley, that&amp;#39;s where I stuck around basically
to work on Jupyter, and then I
worked at a couple of startups and a
couple of finance firms, and currently working on a Jupyter notebook search engine over at
&lt;a href="https://spines.dev"&gt;spines.dev&lt;/a&gt;. So that&amp;#39;s
enough about me.&lt;/p&gt;
&lt;p&gt;Contributors to this talk (
&lt;a href="https://dafna.io"&gt;Itay Dafna&lt;/a&gt;,
&lt;a href="https://matthewturk.github.io/"&gt;Matt Turk&lt;/a&gt;, 
&lt;a href="https://github.com/jni/"&gt;Juan Nunez-Iglesias&lt;/a&gt;, 
&lt;a href="https://nicholdav.info/"&gt;David Nicholson&lt;/a&gt;, 
&lt;a href="https://www.willingconsulting.com/"&gt;Carol Willing&lt;/a&gt; 
)&lt;/p&gt;
&lt;p&gt;&lt;a name="002" /&gt;&lt;/p&gt;
&lt;h2 id="_2"&gt;&lt;a href="#002"&gt; &lt;img alt="" src="/talks/badcamp/slides.002.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I want to thank some of my friends that helped
me reason through some of these things
talking about them in particular &lt;a href="https://matthewturk.github.io/"&gt;Matt Turk&lt;/a&gt;
who spent a lot of time back and
forth IM-ing ideas and what to
say and how to say it. So this is the
first attempt at capturing this sort of
thing.&lt;/p&gt;
&lt;p&gt;&lt;a name="003" /&gt;
But enough about them let&amp;#39;s talk
about me again. &lt;i class="extra"&gt;(chuckles)&lt;/i&gt;&lt;/p&gt;
&lt;h2 id="_3"&gt;&lt;a href="#003"&gt; &lt;img alt="" src="/talks/badcamp/slides.003.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I was born 1984, which makes me
40, and the same year the Macintosh
was introduced. You remember
&lt;a href="https://en.wikipedia.org/wiki/1984_(advertisement)"&gt;Apple's smashing the screen Big
Brother commercial&lt;/a&gt;? &lt;/p&gt;
&lt;p&gt;So that was 1984 and
that was also the year of the first
 &lt;a href="https://www.gnu.org/gnu/first-hackers-conference-1984.html"&gt;hackers conference&lt;/a&gt;
 which was just across the
Bay and that happened because
Steven Levy wrote a book &lt;u&gt;Hackers: Heroes
of the computer Revolution&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;How many have read that book? &lt;i class="extra"&gt;(no one raises a hand)&lt;/i&gt; Oh that&amp;#39;s such a good
book, it&amp;#39;s great. This is "&lt;i&gt;hackers&lt;/i&gt;" before that word was associated with
breaking into computers because people weren&amp;#39;t even breaking into computers
yet, people were busy trying to build computers to begin with. &lt;/p&gt;
&lt;p&gt;So at that hacker conference,
Richard Stallman first publicly
explicitly stated the idea that &lt;strong&gt;all
software should be free&lt;/strong&gt; and makes it
clear that free refers to freedom, not
price, and saying that software should be freely accessible to
everyone. &lt;/p&gt;
&lt;p&gt;It was the first time he
did that
publicly, okay and so what&amp;#39;s interesting
about that being 40 years ago, is that if
you go back 40 years in the other
direction.&lt;/p&gt;
&lt;p&gt;&lt;i class="extra"&gt;&lt;em&gt;(I spread out my arms, turning them into a timeline, each arm
measuring 40 years)&lt;/em&gt;&lt;/i&gt; &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# 1944 - - - - - - 1984  - - - - - - 2024
#   \                \                 \
#    no computers    free software     today
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With time
flowing left to right,  my nose is where I was born, 1984.
And all the way on your right, this is where we are today.
At the tip of my opposite hand, there were no computers, basically. 1944 was when the first
computer,  the Harvard Mark 1, was built, and if
you were interested in
computing Bessel functions you had a
computer for that. You didn&amp;#39;t really have
a generic computer yet, so &lt;strong&gt;this&lt;/strong&gt; &lt;i class="extra"&gt;&lt;em&gt;(my armspan)&lt;/em&gt;&lt;/i&gt; is all of
computing history in the modern sense.
This is not talking about just calculators but computers, right.
And so half of the time we&amp;#39;ve spent with
this idea of &lt;strong&gt;free software&lt;/strong&gt; and building
it and sharing it, explicitly. &lt;/p&gt;
&lt;p&gt;Okay, so the oldest
programming language that&amp;#39;s still
in use today,  FORTRAN was specified in 1954 and it took 'em
another 3 years to build a compiler for
it. COBOL was finished in 1959,  LISP in
1960, so that&amp;#39;s all back here.
But what I&amp;#39;m concerned about is the
future, because a tremendous amount of
value has been unlocked from all of this
creative tinkering that people were
doing trying to scratch their own itch.
The &lt;a href="https://www.youtube.com/watch?v=q78r8juDMTo"&gt;previous talk&lt;/a&gt;&lt;i
class="extra"&gt;(CTO of The Drupal Association Tim Lehnen)&lt;/i&gt;  mentioned
the &lt;strong&gt;LAMP&lt;/strong&gt; stack right: &lt;strong&gt;L&lt;/strong&gt;inux &amp;mdash;  okay that&amp;#39;s free
software, &lt;strong&gt;A&lt;/strong&gt;pache &amp;mdash;  yeah that&amp;#39;s free software, 
&lt;strong&gt;M&lt;/strong&gt;ySQL / &lt;strong&gt;M&lt;/strong&gt;aria DB whatever it was, that was
free software too, and &lt;strong&gt;P&lt;/strong&gt; stood for &lt;strong&gt;P&lt;/strong&gt;HP in
this world, it&amp;#39;s &lt;strong&gt;P&lt;/strong&gt;ython where I&amp;#39;m from, all of that is free
software. Linux kernel developer and
maintainer Greg Kroah-Hartman in a &lt;a href="https://youtu.be/at-uDXbX-18"&gt;talk just about a month ago&lt;/a&gt; said that
Debian runs 70% of the world. He talks to a lot of cloud vendors. He&amp;#39;s paid by the Linux Foundation to
work on Linux and he says at least 70% of cloud workloads run Debian, which is a
non-commercial distribution, if you&amp;#39;re not familiar, and 80% or more than 80% he
estimates run non-commercial distributions in general. So he says
that Red Hat, SUSE, Ubuntu are great distros,
but they&amp;#39;re not what the world is using. &lt;/p&gt;
&lt;p&gt;&lt;i class="extra"&gt;(I neglected to explicitly assert here that there would be &lt;strong&gt;no cloud computing without open source and free software&lt;/strong&gt; )&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;And the concern is that this world that is being used right now is
going to shrink and shrivel and die on the vine. &lt;/p&gt;
&lt;p&gt;&lt;a name="004" /&gt;&lt;/p&gt;
&lt;p&gt;Have I painted a dark enough picture?&lt;/p&gt;
&lt;h2 id="_4"&gt;&lt;a href="#004"&gt; &lt;img alt="" src="/talks/badcamp/slides.004.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So the challenges that
I want to talk about today are the three
up here. We&amp;#39;re going to talk about
LLMs for code completion. We&amp;#39;re going to
talk about mixing paid and volunteer
labor and how inherently you can&amp;#39;t get
away from it like that&amp;#39;s that&amp;#39;s a
struggle that will always be there
provided that you &lt;strong&gt;want&lt;/strong&gt; to have hobbyists
around.  And then the last one is this
relicensing of open source software 
that been happening with a lot of
venture backed companies, which people have been referring to&amp;#39;s a
"rug pull" of taking away a license
that was previously "I can do
anything with the software" to now "I can't" and
what to do about that.&lt;/p&gt;
&lt;p&gt;&lt;a name="005" href="#005"&gt;
So let me just start with that first one and say that
&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
GitHub Copilot, and other large language models for code completion trained on publicly available software with no regard for the licenses of that software, acts as a &lt;b&gt;license laundering cudgel&lt;/b&gt; that denigrates the work of open source developers who have contributed their code under a legal framework for how their code can be used. If their code was contributed under a copyleft license, like the GPL which Richard Stallman introduced a couple of years after that 1984 meeting, their expectation is that no user of their code will ever lose the ability to modify the software. If it was contributed under a permissive license, like the BSD or MIT licenses, the expectation was that inclusion of their code would result in an attribution to the project they contributed to. Tools like GitHub Copilot makes all of those expectation of the original authors &lt;b&gt;null and void&lt;/b&gt;, enabling theft of their work, all in the name of making it "&lt;i&gt;easier&lt;/i&gt;" for other programmers.
&lt;/h3&gt;

&lt;h2 id="_5"&gt;&lt;a href="#005"&gt; &lt;img alt="" src="/talks/badcamp/slides.005.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Okay so I called this a
pyramid scheme in the abstract and 
here&amp;#39;s what I
mean: normalizing
plagiarism. It&amp;#39;s also a heist. This is
a picture of the Louvre, if you&amp;#39;re not
familiar with it, and it&amp;#39;s on the scale of
taking everything from the Louvre. That&amp;#39;s what
I think. Talk about "value capture", right from the previous talk.&lt;/p&gt;
&lt;p&gt;And for a pyramid scheme, you need two
things. Okay, it&amp;#39;s
loosely defined as a pyramid scheme, it&amp;#39;s
just an effective metaphor, I think.
You need to have some schemers that want to
corrupt other parties. They want to
to get more people into &lt;strong&gt;the
game&lt;/strong&gt;, &lt;i&gt;"oh yeah,  let&amp;#39;s  get them in there"&lt;/i&gt; and then you
need somebody profiting at the top.
Sort of, the higher up in the pyramid
you are, the more profit you&amp;#39;ll get okay.&lt;/p&gt;
&lt;p&gt;So these are the two things that I&amp;#39;ll
need to show, or that I will be end up
showing. &lt;/p&gt;
&lt;p&gt;Hopefully it&amp;#39;s self-evident but
let&amp;#39;s roll with it anyway.&lt;/p&gt;
&lt;p&gt;So let&amp;#39;s start with the base and work
our way up.&lt;/p&gt;
&lt;p&gt;If enough people
participate in a plagiarism, we expand
the world of plagiarist. We normalize
it. I&amp;#39;m just repeating myself here.
Let&amp;#39;s take a look at how the corruption
pyramid looks like at its base.&lt;/p&gt;
&lt;p&gt;Fundamentally, no one using it, or rather the
system is built in such a way that you are meant to not care where the code came from and I
think that &lt;strong&gt;&lt;em&gt;matters&lt;/em&gt;&lt;/strong&gt; and I think we &lt;strong&gt;&lt;em&gt;should&lt;/em&gt;&lt;/strong&gt; care where the code came from.&lt;/p&gt;
&lt;p&gt;So GitHub does their little meeting or big meeting, GitHub Universe they call
it, I think it&amp;#39;s this week or
next week across the bay in San
Francisco. And every year they release
the State of Open Source as they see it.
This year&amp;#39;s
survey hasn&amp;#39;t yet come out, but in &lt;a href="https://github.blog/news-insights/research/the-state-of-open-source-and-ai/#the-state-of-open-source"&gt;last
year&amp;#39;s
survey&lt;/a&gt;
there was a nice little banner the in the middle of it
telling you: &lt;em&gt;"GitHub
Copilot: don&amp;#39;t fly solo. Try it,
it&amp;#39;s free. &lt;b&gt;First one&amp;#39;s
free.&lt;/b&gt;"&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="006" /&gt;&lt;/p&gt;
&lt;h2 id="_6"&gt;&lt;a href="#006"&gt; &lt;img alt="" src="/talks/badcamp/slides.006.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Okay, in the middle of their report
they say &lt;i&gt;"speaking of generative AI,
almost a third of Open Source projects
use GitHub Copilot."&lt;/i&gt; Well, that sounds
like &lt;b&gt;a lot&lt;/b&gt;, although you know "at least
one star"? I can star my own projects. &lt;i&gt;Nevermind.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Then not five sentences later they repeat the same
claim: &lt;i&gt;"open source maintainers are
adopting generative of AI"&lt;/i&gt; and then let&amp;#39;s take
a look here oh &lt;i&gt;"this follows our program
to offer a GitHub Copilot &lt;strong&gt;free&lt;/strong&gt; to open
source maintainers"&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;In 2023 there were &lt;i&gt;"301 million total contributions to
open source projects across GitHub"&lt;/i&gt;. Wow,
that&amp;#39;s great, and "commercially backed
projects continued to attract most of
the open source contributions" &amp;mdash; that&amp;#39;s
also interesting.&lt;/p&gt;
&lt;p&gt;&lt;a name="007" /&gt;
Okay, so, hmmm... I mean I know I&amp;#39;m
a little conspiratorial here, but this
is what this sounds like to
me.&lt;/p&gt;
&lt;h2 id="_7"&gt;&lt;a href="#007"&gt; &lt;img alt="" src="/talks/badcamp/slides.007.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;i class="extra"&gt;(laughter, Tim Lehnen sitting near the front says: "But I &lt;strong&gt;like&lt;/strong&gt; cookies?!")&lt;/i&gt; You do like …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;This is a lightly edited transcript of a talk I gave at Bay Area Drupal Camp in
Oakland on October 24th, 2024 to an audience of about 40 people. I will be inlining
images, but you can also &lt;a href="https://pirsquared.org/talks/badcamp"&gt;peruse the slides directly&lt;/a&gt;. There's a &lt;a href="https://www.youtube.com/watch?v=3lYNljulFC8"&gt;recording available&lt;/a&gt; that has audio synchronized with the slides, but this post leaves out my stumbles, uhs, ums, and other vocal pauses.&lt;/em&gt; &lt;i class="extra"&gt;(Additional context will appear like this)&lt;/i&gt;&lt;/p&gt;
&lt;!-- ![](/talks/badcamp/slides.000.jpg) --&gt;

&lt;p&gt;Thank you all for coming. I just
want to get started by asking you a
little bit about yourself. So how many of
you identify as
developers? &lt;i class="extra"&gt; ( 3/4 of audience raises their hands )&lt;/i&gt; How many of you have
&lt;strong&gt;&lt;em&gt;transcended&lt;/em&gt;&lt;/strong&gt; developers? &lt;i class="extra"&gt;(a fifth of the room) &lt;/i&gt; Still alive, still doing
okay? Okay. How about open source developers? &lt;i class="extra"&gt;(half the room)&lt;/i&gt; Commercial
developers? &lt;i class="extra"&gt;(a fifth)&lt;/i&gt; Okay, so some of the same hands are going up.
Great and competing sessions are also great, so we won&amp;#39;t say anything bad
about them.  I don&amp;#39;t even use Playwright or
what was the other one,  Cypress &amp;mdash;  I
use &lt;a href="https://testcafe.io/"&gt;TestCafe&lt;/a&gt;  I&amp;#39;m, like, weird.&lt;/p&gt;
&lt;p&gt;&lt;a name="001" /&gt;&lt;/p&gt;
&lt;h2 id="_1"&gt;&lt;a href="#001"&gt; &lt;img alt="" src="/talks/badcamp/slides.001.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There we go, a little bit about me &amp;mdash; I&amp;#39;m...
weird.  &lt;/p&gt;
&lt;p&gt;I&amp;#39;ve been in the Python ecosystem for a very long time.
I started off in graduate school &lt;i class="extra"&gt;(2006)&lt;/i&gt; at
UC Berkeley working on matplotlib.  I got my
commit rights there, so that&amp;#39;s  the
community I came from, and then I became one of the
leaders in IPython and the Jupyter world,
a project that&amp;#39;s been rewarded by the ACM with the Software
System Award &lt;i class="extra"&gt;(2017)&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Now, I don&amp;#39;t normally start off
my talks with like "&lt;i&gt;oh look at me &amp;mdash;  I&amp;#39;m a
big shot! Look at &lt;a href="https://awards.acm.org/award_winners/ivanov_4826208"&gt;this big award I got&lt;/a&gt;&lt;/i&gt;"
but this will be relevant, very
relevant, to the talk because the ACM
is the &lt;a href="https://acm.org"&gt;Association for Computing Machinery&lt;/a&gt;, as you may know.
It&amp;#39;s &lt;strong&gt;&lt;em&gt;the&lt;/em&gt;&lt;/strong&gt; Professional Organization for computer
scientists it was founded in 1947, so 77
years ago. &lt;/p&gt;
&lt;p&gt;Since most of the
room raised their hands and said they&amp;#39;re
developers, I&amp;#39;m going to get super nerdy
because we&amp;#39;re all among friends here, and 
talk history and things like that. &lt;/p&gt;
&lt;p&gt;The award is a glass trapezoid sitting on its side, so it
doesn&amp;#39;t actually film very well.
You can kind of maybe see that there&amp;#39;s
this reflection, anyway, but the books in the
background &lt;i class="extra"&gt;(Frank Herbert's &lt;u&gt;Dune&lt;/u&gt;)&lt;/i&gt; are &lt;strong&gt;foreshadowing&lt;/strong&gt;.
So you can kind of mentally place a  🌶️ chili emoji somewhere on there, if you&amp;#39;re
into that sort of thing, because &lt;strong&gt;the spice must flow&lt;/strong&gt;. &lt;i class="extra"&gt;(audience chuckles)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;The other things on the slide is that I used to
work in academia at UC Berkeley, that&amp;#39;s where I stuck around basically
to work on Jupyter, and then I
worked at a couple of startups and a
couple of finance firms, and currently working on a Jupyter notebook search engine over at
&lt;a href="https://spines.dev"&gt;spines.dev&lt;/a&gt;. So that&amp;#39;s
enough about me.&lt;/p&gt;
&lt;p&gt;Contributors to this talk (
&lt;a href="https://dafna.io"&gt;Itay Dafna&lt;/a&gt;,
&lt;a href="https://matthewturk.github.io/"&gt;Matt Turk&lt;/a&gt;, 
&lt;a href="https://github.com/jni/"&gt;Juan Nunez-Iglesias&lt;/a&gt;, 
&lt;a href="https://nicholdav.info/"&gt;David Nicholson&lt;/a&gt;, 
&lt;a href="https://www.willingconsulting.com/"&gt;Carol Willing&lt;/a&gt; 
)&lt;/p&gt;
&lt;p&gt;&lt;a name="002" /&gt;&lt;/p&gt;
&lt;h2 id="_2"&gt;&lt;a href="#002"&gt; &lt;img alt="" src="/talks/badcamp/slides.002.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I want to thank some of my friends that helped
me reason through some of these things
talking about them in particular &lt;a href="https://matthewturk.github.io/"&gt;Matt Turk&lt;/a&gt;
who spent a lot of time back and
forth IM-ing ideas and what to
say and how to say it. So this is the
first attempt at capturing this sort of
thing.&lt;/p&gt;
&lt;p&gt;&lt;a name="003" /&gt;
But enough about them let&amp;#39;s talk
about me again. &lt;i class="extra"&gt;(chuckles)&lt;/i&gt;&lt;/p&gt;
&lt;h2 id="_3"&gt;&lt;a href="#003"&gt; &lt;img alt="" src="/talks/badcamp/slides.003.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I was born 1984, which makes me
40, and the same year the Macintosh
was introduced. You remember
&lt;a href="https://en.wikipedia.org/wiki/1984_(advertisement)"&gt;Apple's smashing the screen Big
Brother commercial&lt;/a&gt;? &lt;/p&gt;
&lt;p&gt;So that was 1984 and
that was also the year of the first
 &lt;a href="https://www.gnu.org/gnu/first-hackers-conference-1984.html"&gt;hackers conference&lt;/a&gt;
 which was just across the
Bay and that happened because
Steven Levy wrote a book &lt;u&gt;Hackers: Heroes
of the computer Revolution&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;How many have read that book? &lt;i class="extra"&gt;(no one raises a hand)&lt;/i&gt; Oh that&amp;#39;s such a good
book, it&amp;#39;s great. This is "&lt;i&gt;hackers&lt;/i&gt;" before that word was associated with
breaking into computers because people weren&amp;#39;t even breaking into computers
yet, people were busy trying to build computers to begin with. &lt;/p&gt;
&lt;p&gt;So at that hacker conference,
Richard Stallman first publicly
explicitly stated the idea that &lt;strong&gt;all
software should be free&lt;/strong&gt; and makes it
clear that free refers to freedom, not
price, and saying that software should be freely accessible to
everyone. &lt;/p&gt;
&lt;p&gt;It was the first time he
did that
publicly, okay and so what&amp;#39;s interesting
about that being 40 years ago, is that if
you go back 40 years in the other
direction.&lt;/p&gt;
&lt;p&gt;&lt;i class="extra"&gt;&lt;em&gt;(I spread out my arms, turning them into a timeline, each arm
measuring 40 years)&lt;/em&gt;&lt;/i&gt; &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# 1944 - - - - - - 1984  - - - - - - 2024
#   \                \                 \
#    no computers    free software     today
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With time
flowing left to right,  my nose is where I was born, 1984.
And all the way on your right, this is where we are today.
At the tip of my opposite hand, there were no computers, basically. 1944 was when the first
computer,  the Harvard Mark 1, was built, and if
you were interested in
computing Bessel functions you had a
computer for that. You didn&amp;#39;t really have
a generic computer yet, so &lt;strong&gt;this&lt;/strong&gt; &lt;i class="extra"&gt;&lt;em&gt;(my armspan)&lt;/em&gt;&lt;/i&gt; is all of
computing history in the modern sense.
This is not talking about just calculators but computers, right.
And so half of the time we&amp;#39;ve spent with
this idea of &lt;strong&gt;free software&lt;/strong&gt; and building
it and sharing it, explicitly. &lt;/p&gt;
&lt;p&gt;Okay, so the oldest
programming language that&amp;#39;s still
in use today,  FORTRAN was specified in 1954 and it took 'em
another 3 years to build a compiler for
it. COBOL was finished in 1959,  LISP in
1960, so that&amp;#39;s all back here.
But what I&amp;#39;m concerned about is the
future, because a tremendous amount of
value has been unlocked from all of this
creative tinkering that people were
doing trying to scratch their own itch.
The &lt;a href="https://www.youtube.com/watch?v=q78r8juDMTo"&gt;previous talk&lt;/a&gt;&lt;i
class="extra"&gt;(CTO of The Drupal Association Tim Lehnen)&lt;/i&gt;  mentioned
the &lt;strong&gt;LAMP&lt;/strong&gt; stack right: &lt;strong&gt;L&lt;/strong&gt;inux &amp;mdash;  okay that&amp;#39;s free
software, &lt;strong&gt;A&lt;/strong&gt;pache &amp;mdash;  yeah that&amp;#39;s free software, 
&lt;strong&gt;M&lt;/strong&gt;ySQL / &lt;strong&gt;M&lt;/strong&gt;aria DB whatever it was, that was
free software too, and &lt;strong&gt;P&lt;/strong&gt; stood for &lt;strong&gt;P&lt;/strong&gt;HP in
this world, it&amp;#39;s &lt;strong&gt;P&lt;/strong&gt;ython where I&amp;#39;m from, all of that is free
software. Linux kernel developer and
maintainer Greg Kroah-Hartman in a &lt;a href="https://youtu.be/at-uDXbX-18"&gt;talk just about a month ago&lt;/a&gt; said that
Debian runs 70% of the world. He talks to a lot of cloud vendors. He&amp;#39;s paid by the Linux Foundation to
work on Linux and he says at least 70% of cloud workloads run Debian, which is a
non-commercial distribution, if you&amp;#39;re not familiar, and 80% or more than 80% he
estimates run non-commercial distributions in general. So he says
that Red Hat, SUSE, Ubuntu are great distros,
but they&amp;#39;re not what the world is using. &lt;/p&gt;
&lt;p&gt;&lt;i class="extra"&gt;(I neglected to explicitly assert here that there would be &lt;strong&gt;no cloud computing without open source and free software&lt;/strong&gt; )&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;And the concern is that this world that is being used right now is
going to shrink and shrivel and die on the vine. &lt;/p&gt;
&lt;p&gt;&lt;a name="004" /&gt;&lt;/p&gt;
&lt;p&gt;Have I painted a dark enough picture?&lt;/p&gt;
&lt;h2 id="_4"&gt;&lt;a href="#004"&gt; &lt;img alt="" src="/talks/badcamp/slides.004.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So the challenges that
I want to talk about today are the three
up here. We&amp;#39;re going to talk about
LLMs for code completion. We&amp;#39;re going to
talk about mixing paid and volunteer
labor and how inherently you can&amp;#39;t get
away from it like that&amp;#39;s that&amp;#39;s a
struggle that will always be there
provided that you &lt;strong&gt;want&lt;/strong&gt; to have hobbyists
around.  And then the last one is this
relicensing of open source software 
that been happening with a lot of
venture backed companies, which people have been referring to&amp;#39;s a
"rug pull" of taking away a license
that was previously "I can do
anything with the software" to now "I can't" and
what to do about that.&lt;/p&gt;
&lt;p&gt;&lt;a name="005" href="#005"&gt;
So let me just start with that first one and say that
&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
GitHub Copilot, and other large language models for code completion trained on publicly available software with no regard for the licenses of that software, acts as a &lt;b&gt;license laundering cudgel&lt;/b&gt; that denigrates the work of open source developers who have contributed their code under a legal framework for how their code can be used. If their code was contributed under a copyleft license, like the GPL which Richard Stallman introduced a couple of years after that 1984 meeting, their expectation is that no user of their code will ever lose the ability to modify the software. If it was contributed under a permissive license, like the BSD or MIT licenses, the expectation was that inclusion of their code would result in an attribution to the project they contributed to. Tools like GitHub Copilot makes all of those expectation of the original authors &lt;b&gt;null and void&lt;/b&gt;, enabling theft of their work, all in the name of making it "&lt;i&gt;easier&lt;/i&gt;" for other programmers.
&lt;/h3&gt;

&lt;h2 id="_5"&gt;&lt;a href="#005"&gt; &lt;img alt="" src="/talks/badcamp/slides.005.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Okay so I called this a
pyramid scheme in the abstract and 
here&amp;#39;s what I
mean: normalizing
plagiarism. It&amp;#39;s also a heist. This is
a picture of the Louvre, if you&amp;#39;re not
familiar with it, and it&amp;#39;s on the scale of
taking everything from the Louvre. That&amp;#39;s what
I think. Talk about "value capture", right from the previous talk.&lt;/p&gt;
&lt;p&gt;And for a pyramid scheme, you need two
things. Okay, it&amp;#39;s
loosely defined as a pyramid scheme, it&amp;#39;s
just an effective metaphor, I think.
You need to have some schemers that want to
corrupt other parties. They want to
to get more people into &lt;strong&gt;the
game&lt;/strong&gt;, &lt;i&gt;"oh yeah,  let&amp;#39;s  get them in there"&lt;/i&gt; and then you
need somebody profiting at the top.
Sort of, the higher up in the pyramid
you are, the more profit you&amp;#39;ll get okay.&lt;/p&gt;
&lt;p&gt;So these are the two things that I&amp;#39;ll
need to show, or that I will be end up
showing. &lt;/p&gt;
&lt;p&gt;Hopefully it&amp;#39;s self-evident but
let&amp;#39;s roll with it anyway.&lt;/p&gt;
&lt;p&gt;So let&amp;#39;s start with the base and work
our way up.&lt;/p&gt;
&lt;p&gt;If enough people
participate in a plagiarism, we expand
the world of plagiarist. We normalize
it. I&amp;#39;m just repeating myself here.
Let&amp;#39;s take a look at how the corruption
pyramid looks like at its base.&lt;/p&gt;
&lt;p&gt;Fundamentally, no one using it, or rather the
system is built in such a way that you are meant to not care where the code came from and I
think that &lt;strong&gt;&lt;em&gt;matters&lt;/em&gt;&lt;/strong&gt; and I think we &lt;strong&gt;&lt;em&gt;should&lt;/em&gt;&lt;/strong&gt; care where the code came from.&lt;/p&gt;
&lt;p&gt;So GitHub does their little meeting or big meeting, GitHub Universe they call
it, I think it&amp;#39;s this week or
next week across the bay in San
Francisco. And every year they release
the State of Open Source as they see it.
This year&amp;#39;s
survey hasn&amp;#39;t yet come out, but in &lt;a href="https://github.blog/news-insights/research/the-state-of-open-source-and-ai/#the-state-of-open-source"&gt;last
year&amp;#39;s
survey&lt;/a&gt;
there was a nice little banner the in the middle of it
telling you: &lt;em&gt;"GitHub
Copilot: don&amp;#39;t fly solo. Try it,
it&amp;#39;s free. &lt;b&gt;First one&amp;#39;s
free.&lt;/b&gt;"&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="006" /&gt;&lt;/p&gt;
&lt;h2 id="_6"&gt;&lt;a href="#006"&gt; &lt;img alt="" src="/talks/badcamp/slides.006.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Okay, in the middle of their report
they say &lt;i&gt;"speaking of generative AI,
almost a third of Open Source projects
use GitHub Copilot."&lt;/i&gt; Well, that sounds
like &lt;b&gt;a lot&lt;/b&gt;, although you know "at least
one star"? I can star my own projects. &lt;i&gt;Nevermind.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Then not five sentences later they repeat the same
claim: &lt;i&gt;"open source maintainers are
adopting generative of AI"&lt;/i&gt; and then let&amp;#39;s take
a look here oh &lt;i&gt;"this follows our program
to offer a GitHub Copilot &lt;strong&gt;free&lt;/strong&gt; to open
source maintainers"&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;In 2023 there were &lt;i&gt;"301 million total contributions to
open source projects across GitHub"&lt;/i&gt;. Wow,
that&amp;#39;s great, and "commercially backed
projects continued to attract most of
the open source contributions" &amp;mdash; that&amp;#39;s
also interesting.&lt;/p&gt;
&lt;p&gt;&lt;a name="007" /&gt;
Okay, so, hmmm... I mean I know I&amp;#39;m
a little conspiratorial here, but this
is what this sounds like to
me.&lt;/p&gt;
&lt;h2 id="_7"&gt;&lt;a href="#007"&gt; &lt;img alt="" src="/talks/badcamp/slides.007.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;i class="extra"&gt;(laughter, Tim Lehnen sitting near the front says: "But I &lt;strong&gt;like&lt;/strong&gt; cookies?!")&lt;/i&gt; You do like cookies? I like cookies, too. I have coffee, I don&amp;#39;t have
a cookie, right now. Wouldn&amp;#39;t it be nice to have a cookie?
I&amp;#39;d like a cookie...&lt;/p&gt;
&lt;p&gt;I&amp;#39;m not going to convince &lt;em&gt;them&lt;/em&gt;, the makers of
these tools how to do it, but I think
that there&amp;#39;s a different way to live.&lt;/p&gt;
&lt;p&gt;So
hopefully I&amp;#39;ve made the case for sort of
the base of the pyramid and the
pyramid keeps wanting to perpetuate
itself in the hype cycle that 
wishes to &lt;em&gt;make the whole world feel it&amp;#39;s
normal to steal other people&amp;#39;s work
without
attribution&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a name="008" /&gt;
Okay so where&amp;#39;s the top of
the pyramid? &lt;em&gt;Somebody&lt;/em&gt; has to be profiting
from
this.&lt;/p&gt;
&lt;h2 id="_8"&gt;&lt;a href="#008"&gt; &lt;img alt="" src="/talks/badcamp/slides.008.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Well in the Q2 earnings report,
I mean you can you can read faster
than I can but basically, GitHub
Copilot as of July of this year makes
more money than all of the GitHub
business did when Microsoft acquire it
acquired it 6 years
ago.&lt;/p&gt;
&lt;p&gt;So Microsoft acquired GitHub for for
$7.5 billion 6 years ago. Today, GitHub
Copilot makes more money for GitHub
than GitHub did back then.&lt;/p&gt;
&lt;p&gt;&lt;a name="009" /&gt;
Moreover, that&amp;#39;s not
all. If you license Copilot business or
Copilot Enterprise directly from GitHub
this document applies to you. &lt;/p&gt;
&lt;h2 id="_9"&gt;&lt;a href="#009"&gt; &lt;img alt="" src="/talks/badcamp/slides.009.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The
first one&amp;#39;s okay you get to keep your
own code.
That&amp;#39;s that sounds great until you
read the next one which tells you that,
oh by the way, you&amp;#39;re on the hook if
you&amp;#39;re doing something wrong. If
you&amp;#39;re violating somebody&amp;#39;s rights,
that&amp;#39;s on you, that&amp;#39;s not on us. We&amp;#39;re
just &lt;i&gt;&lt;b&gt;mAkInG
sUgGeStIoNs&lt;/b&gt;&lt;/i&gt; &lt;i class="extra"&gt;(chuckles)&lt;/i&gt;
"&lt;i&gt;I&amp;#39;m not stealing other
people's work without giving them
credit, I'm making a suggestion.&lt;/i&gt;" So they
got users' money so that the
users themselves can potentially
infringe others rights.&lt;/p&gt;
&lt;p&gt;&lt;a name="010" /&gt;
I think there&amp;#39;s also a secondary pyramid scheme,
one that might work out for those of us
in the room that are already good at developing software.&lt;/p&gt;
&lt;h2 id="_10"&gt;&lt;a href="#010"&gt;  &lt;img alt="" src="/talks/badcamp/slides.010.jpg"&gt; &lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The case is that we have been, for 40
years, writing lots of code most code
is buggy so we&amp;#39;ve got lots of work to do.
It&amp;#39;s job security for those of us that know how to
code.&lt;/p&gt;
&lt;p&gt;I would claim that these tools
that make it easier to learn how to code,
they help to make it easier for
you to get &lt;em&gt;fish&lt;/em&gt;, they don&amp;#39;t teach you &lt;em&gt;how
to fish.&lt;/em&gt; You get the end product
faster and there&amp;#39;s evidence for
this I don&amp;#39;t have the citation handy 
&lt;i class="extra"&gt;(Here the &lt;a href="https://cacm.acm.org/news/the-impAact-of-ai-on-computer-science-education"&gt;CACM article: "The Impact of AI on Computer Science Education
"&lt;/a&gt;
about Professor Eric Klopfer's experiment in his undergraduate computer science
class at MIT)&lt;/i&gt;,
but there was a study
done with three groups of students to
complete a programming project. One
of the groups got to use something like
Chat-GPT, then the second group it was something more like Copilot where
they weren&amp;#39;t talking back and
forth with getting code suggestions
but it was just inline code generation.
And then the last group got to use a
search engine and had to do it.&lt;/p&gt;
&lt;p&gt;So guess
who completed the task
fastest? ChatGPT, right. Guess who was
unable to, or who was the worst at
figuring out how to change that same
code for a follow-up task? ChatGPT. &lt;/p&gt;
&lt;p&gt;So
the search engine User Group 
took the longest to finish their
task but they were they all understood
what that code did, and they were able to
to change their code for followup task.&lt;/p&gt;
&lt;p&gt;&lt;a name="productivity" /&gt;&lt;/p&gt;
&lt;h2 id="on-productivity"&gt;&lt;a href="#productivity"&gt; On "Productivity"&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Communications of the
ACM is a journal that gets published
every month from the ACM and in March
of this year (2024) they released a little
video previewing
the front cover article on
"Measuring GitHub&amp;#39;s Copilot&amp;#39;s Impact on
Productivity" and I was enraged as I
hopefully demonstrated earlier on.  &lt;i class="extra"&gt;(chuckles)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;I wrote a letter to the editor 
the contents of which I read to you up
front and I the subject of that line
was "Measuring GitHub&amp;#39;s Integrity?" or it could have also been
"Measuring GitHub&amp;#39;s impact on the
erosion of trust" or  "the erosion of professional
ethics"&lt;/p&gt;
&lt;h2&gt;
We&amp;#39;re sitting here, I&amp;#39;m supposed
to be an ethical professional, and we&amp;#39;re
talking about
productivity.
&lt;/h2&gt;

&lt;h2&gt;
I mean, listen, we&amp;#39;re talking
about...
&lt;i&gt;productivity&lt;/i&gt;? 
&lt;/h2&gt;

&lt;h2&gt;
Not ethics.
&lt;/h2&gt;

&lt;h2&gt;
&lt;b&gt;Not&lt;/b&gt; ethics.
&lt;/h2&gt;

&lt;h2&gt;
Productivity.
&lt;/h2&gt;

&lt;h2&gt;
We&amp;#39;re &lt;i&gt; talking...  &amp;nbsp;&amp;nbsp;&amp;nbsp;  about... &amp;nbsp;&amp;nbsp;&amp;nbsp; productivity.
&lt;/i&gt;
&lt;/h2&gt;

&lt;h2&gt;
&lt;b&gt;Not
ethics&lt;/b&gt;... that we go out there and project
into the world,  we&amp;#39;re talking about
productivity.
&lt;/h2&gt;

&lt;p&gt;So they posted this video
and I was fuming and I decided I was
going to do something about it I was
going to &lt;b&gt;leave a comment on the
video&lt;/b&gt;. &lt;i class="extra"&gt;(slight chuckle)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="011" /&gt;&lt;/p&gt;
&lt;h2 id="_11"&gt;&lt;a href="#011"&gt; &lt;img alt="" src="/talks/badcamp/slides.011.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;And 
something happened, not two minutes later
that comment was
gone and I was like well what&amp;#39;s going on
here? Okay so clearly there was some
glitch in The Matrix let me repost again.
I repost it
again and it was gone two minutes later
and I&amp;#39;m like &lt;b&gt;what&amp;#39;s going on?&lt;/b&gt; Is the
ACM really unable to handle any kind of
criticism? And if you go to &lt;a href="https://www.youtube.com/watch?v=tmMWPe4S2s0"&gt;this
link right now&lt;/a&gt; you will see that there&amp;#39;s three comments
on the video but you have to kind of click around in
order to see them because I&amp;#39;ve been
shadow banned. When I go as a logged in
user I see my comment posted on there
but &lt;strong&gt;none&lt;/strong&gt; of the rest of the world gets
to see it. &lt;/p&gt;
&lt;p&gt;So what&amp;#39;s nefarious about this
well I made the classic now mistake of
including "&lt;b&gt;&lt;i&gt;as a large language model&lt;/i&gt;&lt;/b&gt;" in
my
commentary because YouTube now is used to having bots
writing answers to them and you know how
bots are? They always write "&lt;i&gt;As a
large language model I can do this but I
can&amp;#39;t do that&lt;/i&gt;" so I, I basically became
a bot, as far as YouTube is concerned. &lt;i class="extra"&gt;(slight chuckles)&lt;/i&gt;
So
I was &lt;em&gt;censored&lt;/em&gt; by trying to talk
about this
problem&lt;/p&gt;
&lt;p&gt;Okay, so how comfortable
are we with 
licenses in this if I if I throw up this
picture are we good? &lt;/p&gt;
&lt;p&gt;&lt;a name="012" /&gt;&lt;/p&gt;
&lt;h2 id="_12"&gt;&lt;a href="#012"&gt; &lt;img alt="" src="/talks/badcamp/slides.012.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;i class="extra"&gt;(Note this chart contains an oversimplification, as there isn't
one GPL license, but two versions in use, and they can be incompatible with one another,
per &lt;a href="https://landley.net/talks/ohio-2013.txt"&gt;Rob Landley's OhioLinuxFest 2013
talk&lt;/a&gt;, where he uses the concrete
example of Linux and Samba being both GPL licensed, but not being able to share
code, because one is GPLv2, and the other is GPLv3))&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;We've got BSD up at the
top that&amp;#39;s a permissive license. &lt;/p&gt;
&lt;p&gt;We
got GPL, a copyleft license that&amp;#39;s in
the middle: it&amp;#39;s it can receive works
from other permissive or copyleft licenses but the produced work must remain
GPL. Some people call that
the viral nature of GPL other people
call it the security of their
users. &lt;/p&gt;
&lt;p&gt;Proprietary 
software is out there &amp;mdash;  there&amp;#39;s a lot of
it.  It can only take from the
permissive licensed works, and 
can&amp;#39;t take from GPL. Anything that takes GPL
licensed work has to be GPL.&lt;/p&gt;
&lt;p&gt;So what is the most popular
successful open source project? It&amp;#39;s Linux
kernel. And what license does it use?
GPLv2, which is the same license that
Drupal uses.&lt;/p&gt;
&lt;p&gt;Okay, so Linux had its 91st
birthday, oh-uh sorry 33rd
birthday,
 &lt;i class="extra"&gt;(chuckles, someone, probably Tim again, says "&lt;b&gt;You came from the
 future?&lt;/b&gt;") &lt;/i&gt; Yeah, hehe... Come with me if you want to live.
&lt;i class="extra"&gt;(laughter)&lt;/i&gt; Yes, thank you for that. &lt;/p&gt;
&lt;p&gt;I found out recently &lt;i class="extra"&gt;(via &lt;a
href="https://landley.net/talks/ohio-2013.txt"&gt; Rob Landley's Ohio LinuxFest
2013 talk&lt;/a&gt;)&lt;/i&gt; that
actually the first couple of versions of
Linux weren&amp;#39;t GPL licensed. Linux was GPLed in
1992, so there was some interim where the
license was just "&lt;b&gt;no commercial use&lt;/b&gt;." It
was actually explicitly against
commercial use. &lt;/p&gt;
&lt;p&gt;So the question is: did
GitHub Copilot &lt;i&gt;exclude&lt;/i&gt; GPL code from
the training of the code
assistant?&lt;/p&gt;
&lt;p&gt;&lt;a name="013" /&gt;
I don&amp;#39;t see any head nods and I
see some shaking heads. Okay so I don&amp;#39;t
know, but the world is
bigger than just GitHub, right, and so
there&amp;#39;s another project that 
is called BigCode project and luckily
they did exclude GPL code from their 
training set.&lt;/p&gt;
&lt;h2 id="_13"&gt;&lt;a href="#013"&gt; &lt;img alt="" src="/talks/badcamp/slides.013.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;But it&amp;#39;s not all good and gravy,
right. The spice must flow, right?
I&amp;#39;m not going to be nice to
everyone or anyone. &lt;/p&gt;
&lt;p&gt;Bigcode is an open scientific
collaboration. It&amp;#39;s supported by
Huggingface and Service Now Research.
That&amp;#39;s who funds them and that&amp;#39;s
where the development comes
from. It trained this StarCoder &amp;mdash; &lt;i&gt;StarCoder&lt;/i&gt;  &amp;mdash;
there's a lot of stars today, right
I guess we&amp;#39;re going to the stars, maybe?
We&amp;#39;re all made of stars? I&amp;#39;m not sure.
Stardust, okay? Ziggy, no? Is this thing
on? 
&lt;i class="extra"&gt;(one chuckle)&lt;/i&gt; okay, okay good. &lt;/p&gt;
&lt;p&gt;So the Stack V2
is a data set that has over 600
programming languages. That sounds
impressive. It&amp;#39;s 32 terabytes of code.
Okay and then they cite, because
they&amp;#39;re responsible, you see, they said
that they&amp;#39;re going to be "working on the responsible
development," they&amp;#39;re going to follow
these principles from the Software
Heritage statement on LLMs, which amongst
other things says that they&amp;#39;re here to
"democratize the software creation
process" okay&lt;/p&gt;
&lt;p&gt;Now, hmmm,  &lt;b&gt;be wary&lt;/b&gt; of people that say
"democratize" anything, okay. 
Some have already inferred by my
last name that I come from the former Soviet
Union and you just,  just beware, okay.&lt;/p&gt;
&lt;p&gt;&lt;a name="014" /&gt;
So let&amp;#39;s take a look at the
aggregate licenses in this data set&lt;/p&gt;
&lt;h2 id="_14"&gt;&lt;a href="#014"&gt; &lt;img alt="" src="/talks/badcamp/slides.014.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So the &lt;em&gt;vast&lt;/em&gt; majority of the data set has
&lt;em&gt;no license&lt;/em&gt; on it, whatsoever. And of the little
slice of pie, the less than a quarter of the rest of it,
the majority of that is MIT.&lt;/p&gt;
&lt;p&gt;Okay, so they did do something right, they
left out GPL up front. That&amp;#39;s great, but
what&amp;#39;s wrong is that there are other
conditions outside of the kind of work
that the derivative works may be
combined with that apply, namely, that the
licenses stipulate
&lt;b&gt;attribution&lt;/b&gt; for the original authors of
the work.&lt;/p&gt;
&lt;p&gt;So the question is, are you
in the Stack? is your code in the Stack?
They have an app for that.&lt;/p&gt;
&lt;p&gt;&lt;a name="015" /&gt;&lt;/p&gt;
&lt;h2 id="_15"&gt;&lt;a href="#015"&gt; &lt;img alt="" src="/talks/badcamp/slides.015.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So you can go to &lt;a
href="https://huggingface.co/spaces/bigcode/in-the-stack"&gt;this URL&lt;/a&gt; and
click on that and you're welcome to type in 
your GitHub username. The point is
that &lt;em&gt;I&amp;#39;m&lt;/em&gt;, in the Stack. 83 of my
repositories are in the Stack. &lt;/p&gt;
&lt;p&gt;And
have they considered that not everyone&amp;#39;s
code was written on GitHub? Like, there&amp;#39;s
a bunch of code that pre-dates GitHub. What
happens to that code? And like&amp;mdash; &lt;strong&gt;what the
hell&lt;/strong&gt;, man. Why is it that the authors have
to &lt;b&gt;opt out&lt;/b&gt;? Why is opt-in the
default? &lt;/p&gt;
&lt;p&gt;Like, if only there was some &lt;i&gt;way&lt;/i&gt;
that &lt;i&gt;we&lt;/i&gt; as &lt;i&gt;developers&lt;/i&gt; could indicate to
&lt;i&gt;other&lt;/i&gt; people how we want our code to be used &amp;mdash; &lt;i class="extra"&gt;(laughter)&lt;/i&gt; &lt;/p&gt;
&lt;h2 id="oh-oh-we-do-have-this-mechanism-its-called-a-license"&gt;oh! Oh! We &lt;b&gt;do&lt;/b&gt; have this mechanism &amp;mdash; it&amp;#39;s called &lt;b&gt;a license&lt;/b&gt;.&lt;/h2&gt;
&lt;!-- okay we come back and check in on that at the end of the talk  --&gt;

&lt;p&gt;&lt;a name="016" /&gt;&lt;/p&gt;
&lt;h2 id="_16"&gt;&lt;a href="#016"&gt; &lt;img alt="" src="/talks/badcamp/slides.016.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Alright, so Gabe Newell, is the main guy behind Steam. He&amp;#39;s a
former Microsoft executive that started
Valve Software and he runs it. And he
had this
statement which is that "if property
rights are provisional then your value of
property changes accordingly" and I think
the value of our property has dropped
precipitously when it is no longer even attributable.
Like, &lt;b&gt;good   job&lt;/b&gt;, good job, Tech World. You&amp;#39;re managing to
cannibalize your own roots, basically.
we
gave this thing away for free, all we asked is, most of us asked just
attribute us, right, and you managed to still pirate that. Cool.
That&amp;#39;s going to be a wonderful future
to live in. &lt;/p&gt;
&lt;p&gt;&lt;a name="017" /&gt;
Okay and so ignoring licenses I argue could be seen
as a license to kill the
community 
&lt;i class="extra"&gt;(Tearing up the social contract we operated under 
for the past 40 years. The erosion loop has begun. We will become part of the sediment)&lt;/i&gt;&lt;/p&gt;
&lt;h2 id="_17"&gt;&lt;a href="#017"&gt; &lt;img alt="" src="/talks/badcamp/slides.017.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a name="018" /&gt;&lt;/p&gt;
&lt;p&gt;Others might
say "&lt;i&gt;well, that&amp;#39;s just like, your opinion,
man&lt;/i&gt;" because some developers are embracing
this new reality.&lt;/p&gt;
&lt;h2 id="_18"&gt;&lt;a href="#018"&gt; &lt;img alt="" src="/talks/badcamp/slides.018.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;And Rob Landley is one of them. He
was actually involved in the  GPL
lawsuits because he was the maintainer
of BusyBox, which is like a standalone
micro Linux distribution that lots of
embedded systems use, and he was
interested in getting code back from
these vendors that were shipping
products, routers and things like that,
without providing the code. And he&amp;#39;s like
"&lt;i&gt;I want to see the code&lt;/i&gt;" and he&amp;#39;s seen the
code and he wanted nothing to do with it.
He wanted the lawyers involved &lt;i class="extra"&gt;(Software Freedom Law Center)&lt;/i&gt; to stop doing the
licensing wars and they wouldn&amp;#39;t and
so he decided to rewrite BusyBox from scratch,
which he called Toy Box.
Using a BSD license, he actually created
this &lt;a href="https://landley.net/toybox/license.html"&gt;Zero-Clause BSD license&lt;/a&gt; so you
don&amp;#39;t even need the attribution part of
it, so it&amp;#39;s completely kind of like
free-for-all: "&lt;i&gt;Just use it. Don&amp;#39;t sue me&lt;/i&gt;."
And ToyBox is now shipped in
every Android device and continues to be
used and he continues to work on it.
&lt;i class="extra"&gt;I've left out some of the details of this story, there's more in the &lt;a
href="="https://www.youtube.com/embed/MkJkyMuBm3g"&gt;Toybox vs BusyBox talk&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;There are also commercial companies that are kind
of routing around the GPL in a
different way by just supporting 
projects like LLVM that aren&amp;#39;t GPL licensed, and
that allow them to do the things that they want to do.&lt;/p&gt;
&lt;p&gt;&lt;a name="019" /&gt;
A friend of mine &lt;i class="extra"&gt;(Matt Turk)&lt;/i&gt; also told me that I
should include the Santa Cruz
Operation trial in here.&lt;/p&gt;
&lt;h2 id="_19"&gt;&lt;a href="#019"&gt; &lt;img alt="" src="/talks/badcamp/slides.019.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;These are quotes from &lt;a href="https://lwn.net/Articles/924577/"&gt;Jonathan Corbet&amp;#39;s article&lt;/a&gt; about it.  The SCO lawsuit was filed 
21 years ago, but all of this is to say that this is nothing new: there&amp;#39;s always
somebody knocking, knocking on our door, trying to destroy what we have.&lt;/p&gt;
&lt;p&gt;&lt;a name="020" /&gt;
Okay, so what are the paths forward here?&lt;/p&gt;
&lt;h2 id="_20"&gt;&lt;a href="#020"&gt; &lt;img alt="" src="/talks/badcamp/slides.020.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I think it&amp;#39;s clear that we need to
provide data sets and models that train 
&lt;strong&gt;only&lt;/strong&gt; on attribution-free licenses: like MIT Zero,
like Zero-Clause BSD, or public domain.
I already mentioned Toybox, SQLite is
another example of a project that has one of these licenses, it&amp;#39;s
public domain. We &lt;i&gt;&lt;b&gt;have&lt;/b&gt;&lt;/i&gt; these projects, just don&amp;#39;t take &lt;b&gt;everything&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Gentoo Linux put forth a policy of not allowing any AI
generated code in their distribution in
March of 2024. NetBSD Foundation followed suit
in May. There&amp;#39;s hope on
that front, that we can continue to
work in an ethical manner.&lt;/p&gt;
&lt;p&gt;&lt;a name="021" /&gt;
And there&amp;#39;s a
&lt;a href="https://githubcopilotlitigation.com"&gt;lawsuit&lt;/a&gt; that was
filed.&lt;/p&gt;
&lt;h2 id="_21"&gt;&lt;a href="#021"&gt; &lt;img alt="" src="/talks/badcamp/slides.021.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I didn&amp;#39;t know about that,
my friend David Nicholson told me about it.
So I don&amp;#39;t know how this will
turn out, but I&amp;#39;m glad. I&amp;#39;m glad
somebody&amp;#39;s doing this because this isn&amp;#39;t
right.&lt;/p&gt;
&lt;p&gt;Okay, moving on:&lt;/p&gt;
&lt;p&gt;&lt;a name="022" /&gt;&lt;/p&gt;
&lt;h2 id="oil-and-water"&gt;Oil and water&lt;/h2&gt;
&lt;h2 id="_22"&gt;&lt;a href="#022"&gt; &lt;img alt="" src="/talks/badcamp/slides.022.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The effort and
expectation differences of mixing paid
and volunteer work.&lt;/p&gt;
&lt;p&gt;Popular
collaboratively developed software can
attract a mixture of monetarily
compensated development as well as the
hobbyist unpaid labor that nourish the
software and its nascency. &lt;strong&gt;Business critical gift economies don&amp;#39;t exist,&lt;/strong&gt;
but projects and their participants vary on
the spectrum, from those two opposite
poles and positions shift over time.
Paradoxically, this tension can be both
productive and detrimental at the same
time, depending on the perspective of
those involved.&lt;/p&gt;
&lt;p&gt;&lt;a name="023" /&gt;
So let&amp;#39;s make this a bit
darker &amp;mdash; you&amp;#39;re used to me by now, &lt;i class="extra"&gt;(laughter)&lt;/i&gt; we're
friends.&lt;/p&gt;
&lt;h2 id="_23"&gt;&lt;a href="#023"&gt; &lt;img alt="" src="/talks/badcamp/slides.023.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So the paid workers, I&amp;#39;m going
to call them as oil. Because, you know oil is
&lt;strong&gt;dirty&lt;/strong&gt;, right, it&amp;#39;s dark. Water&amp;#39;s
abundant, it&amp;#39;s pristine and clean. Yeah,
I&amp;#39;m a hippie and things are more
complicated. but let&amp;#39;s do a little
story of Keith Packard.&lt;/p&gt;
&lt;p&gt;&lt;a name="024" /&gt;&lt;/p&gt;
&lt;h2 id="_24"&gt;&lt;a href="#024"&gt; &lt;img alt="" src="/talks/badcamp/slides.024.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Keith Packard is
one of the main developers of the X Window
System. If you&amp;#39;ve ever used Linux and 
or the BSDs, and had a graphical user
interface, you have Keith Packard, 
partially, to thank for that. He&amp;#39;s also
behind Fontconfig and Cairo. So the
story here is in
1988, there&amp;#39;s a problem with a
bunch of the Unix vendors. Linux doesn&amp;#39;t
exist yet, right, there&amp;#39;s a problem that
they have in that Sun Microsystems has
kind of the only working graphical
system that is worth anything and so the
rest of the vendors decide to get
together and work in the open - to fund
this effort that will allow them to leap
frog Sun View and capture the
users. This is the origin of the MIT license, it
comes from &lt;b&gt;this&lt;/b&gt; project and I &lt;a href="https://www.youtube.com/watch?v=cj02_UeUnGQ"&gt;linked 
here the talk itself&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s what Keith had to say is that he would answer email from
people that were paying him first, right?
Makes sense, so even though it was
developed out in the open, and you know
if I was able to type back then, and had
access to the computer, and could speak
English, and lots of things -  but I could
have sent him packages but they would
have just sat in his queue unanswered.&lt;/p&gt;
&lt;p&gt;So that&amp;#39;s an early example,
right, it predates Linux, an early example of
a success story of commercial entities
working together, but even though the
work was out in the open not everyone
could participate in it equally and not
just because they didn&amp;#39;t have the &lt;b&gt;time&lt;/b&gt;,
but because the &lt;b&gt;attention&lt;/b&gt; of those
involved was focused on where the money
was, what their job was. &lt;/p&gt;
&lt;p&gt;&lt;a name="025" /&gt;&lt;/p&gt;
&lt;h2 id="_25"&gt;&lt;a href="#025"&gt; &lt;img alt="" src="/talks/badcamp/slides.025.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Okay, so I think
this tension is always going to be
there. So, there&amp;#39;s a spectrum of being
a paid or a volunteer and you know
you can you can think of yourself like
students don&amp;#39;t get paid grad students do
get paid a little bit as I can tell you...
&lt;i class="extra"&gt;(Tim: "Students &lt;b&gt;pay&lt;/b&gt;")&lt;/i&gt; That&amp;#39;s true,
students &lt;b&gt;do&lt;/b&gt; pay. Yeah, I didn't think of that,
that&amp;#39;s true. Yeah, I guess yeah I was
thinking of students like a high
school student in public school, but yeah
you&amp;#39;re right. a college student &lt;b&gt;does&lt;/b&gt;
end up paying, thank you for that. yeah
good contribution. Uh, you can heckle me,
too you guys, &lt;i class="extra"&gt;(laughter)&lt;/i&gt;
This is fine, we&amp;#39;re all
friends, it&amp;#39;s a small crowd.&lt;/p&gt;
&lt;p&gt;Okay, 
so there&amp;#39;s also on the spectrum of,
well you can be paid, but you could be
paid a lot more if you &lt;em&gt;didn&amp;#39;t&lt;/em&gt; do open
source, for example. But if you &lt;strong&gt;want&lt;/strong&gt; to do
open source, maybe part of your sliding on that scale
of paid to volunteer. you say to yourself &lt;i&gt;"okay I
really care about this stuff and I&amp;#39;d
rather just make less money and continue
to be able to do it"&lt;/i&gt; Yes, maximally, it would
be great to make tons of money doing
this stuff, but realistically maybe I&amp;#39;m
okay with just, you know, paying the bills while while doing
something that I care
about. &lt;/p&gt;
&lt;p&gt;There are different kinds of projects that
get started, right. You can have academic
projects or you can have industry-led
projects, like the story I started
with in this section. And then there&amp;#39;s
another project that Matt Turk told
me about which is that "prove
yourself" project, you  got to
make a splash.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/talks/badcamp/matt_turk_prove_yourself.png"&gt;&lt;/p&gt;
&lt;p&gt;Talking about the
technology that insists on monopolizing
your attention, from a previous talk, you
have projects that insist on &lt;i&gt;"here&amp;#39;s
a cool thing, like it might not be useful, but
it&amp;#39;s cool"&lt;/i&gt; There&amp;#39;s lots of
projects out there that now we&amp;#39;re
used to that operate under the premise of &lt;i&gt;"oh, you have to make a
splash in order to make a contribution"&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a name="026" /&gt;
Okay, but I argue that, other
than just this volunteer-paid axis
there are other axes.&lt;/p&gt;
&lt;h2 id="_26"&gt;&lt;a href="#026"&gt; &lt;img alt="" src="/talks/badcamp/slides.026.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="self-society"&gt;self &amp;lt;---&amp;gt; society &lt;!-- you vs others --&gt;&lt;/h3&gt;
&lt;p&gt;There's an axis of self versus society:
 is it is it about &lt;em&gt;me&lt;/em&gt; or is it
about what I&amp;#39;m taking on into the world.
Some people care about
intellectual curiosity, &lt;i&gt;"I just want
to get something out there and it
happens to be that I'm doing it out in the open"&lt;/i&gt;.
Other people are like &lt;i&gt;"No, I really
want to make an impact in the world"&lt;/i&gt;.&lt;/p&gt;
&lt;h3 id="journey-destination"&gt;journey &amp;lt;---&amp;gt; destination &lt;!-- experience vs end result --&gt;&lt;/h3&gt;
&lt;p&gt;Okay then there&amp;#39;s the journey and
destination. Do I care about the
experience of what it feels like to be
doing this thing or where we end up, in
the product.&lt;/p&gt;
&lt;h3 id="athenian-spartan"&gt;Athenian &amp;lt;---&amp;gt; Spartan &lt;!-- egalitarianism vs hierarchy --&gt;&lt;/h3&gt;
&lt;p&gt;Do we care
about egalitarianism or do we care about
hierarchy? Do we take marching
orders or are we all voting? Do we all
have an &lt;em&gt;equal&lt;/em&gt; voting share, right, what
does &lt;em&gt;that&lt;/em&gt; look like? &lt;/p&gt;
&lt;h3 id="dogmatic-pragmatic"&gt;dogmatic &amp;lt;---&amp;gt; pragmatic &lt;!-- and hopefully sane vs automattic --&gt;&lt;/h3&gt;
&lt;p&gt;Are we going to
be stand for ideals or are we going to
get something
done? Is it about how quickly we&amp;#39;re going to do it, or
does it not matter to us how quickly we
do it because we care about what &lt;em&gt;the
thing&lt;/em&gt; is going to be and how it&amp;#39;s going
to get to get done.&lt;/p&gt;
&lt;h3 id="silly-serious"&gt;silly &amp;lt;---&amp;gt; serious&lt;/h3&gt;
&lt;p&gt;Do we like to have fun? Well,
what kind of fun are we talking
about? Is it okay to be silly or do
we prefer things to be serious, so
that we can have efficiency?&lt;/p&gt;
&lt;h3 id="courteous-abrasive"&gt;courteous &amp;lt;---&amp;gt; abrasive &lt;!-- team vs product --&gt;  &lt;!-- openbsd and 9front good examples of abrasive ---&gt;&lt;/h3&gt;
&lt;p&gt;Are we nice or is it not about
being nice? OpenBSD and the
9front communities are &lt;em&gt;shining&lt;/em&gt;
examples of this abrasive culture that
nevertheless is able to stand up and get
lots of things done. And I wish that
people didn&amp;#39;t take credit away from them
when they assumed that you &lt;em&gt;have&lt;/em&gt; to be
courteous, right. This is &lt;em&gt;controversial&lt;/em&gt;, yes but
&lt;strong&gt;abrasive can be effective&lt;/strong&gt;. You don&amp;#39;t
have to be nice. This is a &lt;em&gt;very
American&lt;/em&gt; notion that everybody has to be
nice. In other cultures, they're much
more comfortable with being in
open conflict, and it&amp;#39;s productive that
way. You &lt;strong&gt;can&lt;/strong&gt; be productive that
way. &lt;/p&gt;
&lt;h3 id="pushing-steering"&gt;pushing &amp;lt;---&amp;gt; steering&lt;/h3&gt;
&lt;p&gt;Are we pushing or are
we steering? Some people don&amp;#39;t &lt;em&gt;want&lt;/em&gt;
to do the work, some people don&amp;#39;t
&lt;em&gt;care&lt;/em&gt; what kind of work they&amp;#39;re do they
just want to &lt;strong&gt;work out&lt;/strong&gt;. &lt;/p&gt;
&lt;h3 id="emotional-intellectual"&gt;emotional &amp;lt;---&amp;gt; intellectual&lt;/h3&gt;
&lt;p&gt;And then there's emotional and intellectual. Is this &lt;strong&gt;work&lt;/strong&gt; or is this a &lt;strong&gt;diversion from
work&lt;/strong&gt;? &lt;/p&gt;
&lt;p&gt;&lt;a name="027" /&gt;&lt;/p&gt;
&lt;h2 id="_27"&gt;&lt;a href="#027"&gt; &lt;img alt="" src="/talks/badcamp/slides.027.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I have &lt;a href="https://x.com/ivanov/status/22214743825580032"&gt;this tweet from
2011&lt;/a&gt; when I was working on Jupyter, 
on a grant for Jupyter. So I was being paid out of a
grant and there were lots of flyby
contributors coming in, and they were
donating code left and right
and I was like: &lt;i&gt;"If
pyramids had a commit log, they could
have been built by volunteers."&lt;/i&gt; 
And you might be thinking, &lt;i&gt;"well, they were paid by slave labor."&lt;/i&gt; No,
they weren&amp;#39;t paid by slave labor. They
were paid laborers, right. This was
established in the 1990s, they
found the graves of the builders of the pyramids, and
they were well compensated for their work. &lt;/p&gt;
&lt;p&gt;So it&amp;#39;s a nice &lt;strong&gt;notion&lt;/strong&gt; that
maybe pyramids could have been built by
volunteers, and I still think maybe they
could be. It depends on what else
is involved. It depends on the
other axes in the project.&lt;/p&gt;
&lt;p&gt;So, would you pitch in and
help build the pyramids, if you knew that
&lt;em&gt;others&lt;/em&gt; are being paid for the
work? Again, I think it depends. I don&amp;#39;t think
it&amp;#39;s &lt;em&gt;clear&lt;/em&gt;, because if I get
to do the code stuff that I like to do,
and somebody&amp;#39;s doing the project
management stuff that I hate doing, then yeah,
that that seems like a fair trade.
Somebody else is organizing the
conference? Yeah, I can pitch in and give
a talk. So it depends.&lt;/p&gt;
&lt;p&gt;That wasn&amp;#39;t dig at &lt;em&gt;this&lt;/em&gt;
conference, this is a great conference. This is
great, you guys are great.&lt;i class="extra"&gt;(chuckles)&lt;/i&gt; I'm just saying. &lt;/p&gt;
&lt;p&gt;So how do you &lt;em&gt;balance&lt;/em&gt;
this paid and volunteer work axis?
Sometimes, you might identify a great volunteer, and you want to
bring them into the fold, right, you want
to compensate them for their work. How do
the other volunteers feel about that?
When the money gets a little bit
tighter, what happens when you kind of
have to let them go? You know
that they were already great to begin
with, maybe they&amp;#39;ll go away, maybe they&amp;#39;ll
stick around. It&amp;#39;s a tough
problem.&lt;/p&gt;
&lt;p&gt;I already mentioned about this game
company that I&amp;#39;m sure if you&amp;#39;ve
 done any PC gaming, you&amp;#39;re well
aware of who they are (Valve). But they&amp;#39;re
now supporting, as of just a
couple couple weeks ago, Arch Linux, a
distribution that they use for
their little Steam Box, err, so Steam, what is
it? &lt;i class="extra"&gt;(audience: "Steam Deck!")&lt;/i&gt;
Yes, the gamer nerds are helping me out, thank you so
much, of which I&amp;#39;m one, but I&amp;#39;m just not a
very eloquent one.&lt;/p&gt;
&lt;p&gt;Then, there&amp;#39;s also a
recent effort that&amp;#39;s 
&lt;a href="https://blog.sentry.io/join-the-pledge/"&gt;
led by the folks at Sentry&lt;/a&gt;
called &lt;a href="https://opensourcepledge.com/"&gt;The Open Source Pledge&lt;/a&gt;, which is asking companies to
pledge to donate at least $2,000 per one of &lt;em&gt;their&lt;/em&gt; internal developers per year
to open source. I have links here to &lt;a href="https://openpath.quest/"&gt;Chad Whitacre&amp;#39;s Blog&lt;/a&gt; where he
writes about this, and he&amp;#39;s been &lt;a href="https://medium.com/gratipay-blog/your-company-should-probably-pay-2000-per-person-for-open-source-9205443e209d"&gt;trying to advocate for this since
2017&lt;/a&gt;
Interestingly, the number of $2K hasn&amp;#39;t changed &lt;i class="extra"&gt;(audience chuckles)&lt;/i&gt;, but anyway ...&lt;/p&gt;
&lt;p&gt;&lt;a name="028" /&gt;&lt;/p&gt;
&lt;h2 id="_28"&gt;&lt;a href="#028"&gt; &lt;img alt="" src="/talks/badcamp/slides.028.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So, I think the tension is always
there. I think the tension is there,
personally for me, the tension is
there, because Jupyter recently formed a
501C6 Foundation, explicitly trying
to seek more money from big companies.
I think that this is a case of hobbyists being squeezed out.
I was one of the people that voted against this.&lt;/p&gt;
&lt;p&gt;Now, I don&amp;#39;t want to, you know, bring my
dirty Jupyter laundry over to you guys
and dump it on you, but it&amp;#39;s just just
an aside. Matt also pointed
out to me that &lt;i&gt;"given Copilot's
voracious maw, it seems like it&amp;#39;s harder to
say what&amp;#39;s a hobbyist project and what
isn&amp;#39;t since the usage of hobbyist code
in commercial products is basically
unknowable"&lt;/i&gt;. I might start off as a
hobbyist, do something clever, get a job
offer out of it,  okay, and then I get some
financial support or a grant, great.&lt;/p&gt;
&lt;p&gt;&lt;a name="029" /&gt;&lt;/p&gt;
&lt;h2 id="_29"&gt;&lt;a href="#029"&gt; &lt;img alt="" src="/talks/badcamp/slides.029.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Innovation happens at the edge.
Innovation happens with individual users.
This is Eric von Hippel's work that Carol Willing was the
one that pointed me to it. The stuff
that I do on my computer is where the
magic happens, right. The stuff that you
all do on your computers is where the
magic happens. It&amp;#39;s not
organizations that make that magic
happen. Organizations provide the &lt;strong&gt;fuel&lt;/strong&gt; to
make that magic happen. Producers have to
worry about the size of the market. When
you did something cool, it&amp;#39;s not enough.
When you did something cool, it&amp;#39;s cool
enough for you, it might be interesting,
but it might not be profitable or it
might not be worth pursuing as a
commercial enterprise.&lt;/p&gt;
&lt;p&gt;&lt;a name="030" /&gt;
It can be lonely to tinker
and do things by yourself and no talk
about open source would be complete
without a slide about
burnout. &lt;i class="extra"&gt;(excerpt from page 39 of the &lt;a href="https://explore.tidelift.com/homepage/2024-tidelift-state-of-the-open-source-maintainer-report"&gt;2024 Tidelift State of the Open Source Maintainer Report&lt;/a&gt;)&lt;/i&gt;&lt;/p&gt;
&lt;h2 id="_30"&gt;&lt;a href="#030"&gt; &lt;img alt="" src="/talks/badcamp/tidelift_excerpt.png"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Recall that property of oil to hold more heat.
There&amp;#39;s a lot of things that I
put up with when I&amp;#39;m being &lt;em&gt;compensated&lt;/em&gt;
for it, monetarily. There&amp;#39;s a
four-letter word that comes to mind, and it&amp;#39;s
JIRA. &lt;i class="extra"&gt;(laughter)&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Money can be a salve to things that we don&amp;#39;t like doing but...
you don&amp;#39;t want to end up in a Dune world, where all the water
evaporates.  "Try our one size fits all miracle cure" &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/talks/badcamp/matt_turk_burnout.png"&gt;&lt;/p&gt;
&lt;p&gt;Okay, so what is this formula?&lt;/p&gt;
&lt;h3 id="13bh-v"&gt;(1/3)&lt;strong&gt;&lt;em&gt;Bh&lt;/em&gt;&lt;/strong&gt; = &lt;strong&gt;&lt;em&gt;V&lt;/em&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Math Pop Quiz! ...Anyone? &lt;/p&gt;
&lt;p&gt;&lt;i class="extra"&gt;(audience member:
one third of the business-hour is
the velocity of project?)&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a name="031" /&gt;
Okay, you're close,  I&amp;#39;ll give you a hint.&lt;/p&gt;
&lt;h2 id="_31"&gt;&lt;a href="#031"&gt; &lt;img alt="" src="/talks/badcamp/slides.031.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;B&lt;/em&gt;&lt;/strong&gt; is the size of the user
base.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;h&lt;/em&gt;&lt;/strong&gt; is the height of entitlement 
&lt;i class="extra"&gt;(audience begins cracking chuckles)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="032" /&gt;
&lt;strong&gt;&lt;em&gt;V&lt;/em&gt;&lt;/strong&gt; is the volume of outrage
&lt;i class="extra"&gt;(laughter)&lt;/i&gt;&lt;/p&gt;
&lt;h2 id="_32"&gt;&lt;a href="#032"&gt; &lt;img alt="" src="/talks/badcamp/slides.032.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is the formula for the rage
pyramid.
It's a problem in open source, it&amp;#39;s a
challenge. &lt;/p&gt;
&lt;p&gt;&lt;a name="033" /&gt;
All right, last thing to talk
about.&lt;/p&gt;
&lt;h2 id="_33"&gt;&lt;a href="#033"&gt; &lt;img alt="" src="/talks/badcamp/slides.033.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Silver spoons lead to later forks. 
Pay the piper: relicensing trends in commercially supported source-available projects.&lt;/p&gt;
&lt;p&gt;With increasing frequency, previously open source software projects backed by a
commercial entity are shifting away from traditional licenses. Recent examples
include Sentry, Terraform, Redis, and CockroachDB. Why are they doing that and
what are affected users and developers doing in response?&lt;/p&gt;
&lt;p&gt;&lt;a name="034" /&gt;&lt;/p&gt;
&lt;h2 id="_34"&gt;&lt;a href="#034"&gt; &lt;img alt="" src="/talks/badcamp/slides.034.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So why are they doing that? This is a shorter section.
To make money. They fear hyperscalers. They&amp;#39;ve received
insufficient return on investment from
trying to foster contributors.&lt;/p&gt;
&lt;p&gt;What are we doing in response? Largely, we&amp;#39;re
forking. Note that the forks already
happened when they changed their license.
That was the original fork, they just
happened to take the original name along
with that fork.&lt;/p&gt;
&lt;p&gt;&lt;a name="035" /&gt;
Here's &amp;#39;s where the talk, from being spicy turns into a bit of self
flagellation.&lt;/p&gt;
&lt;h2 id="_35"&gt;&lt;a href="#035"&gt; &lt;img alt="" src="/talks/badcamp/slides.035.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Philanthropy.
This is how you should think of open source software, regardless of who is making it.&lt;/p&gt;
&lt;p&gt;You can&amp;#39;t be mad at a donor, that you relied on for a long time, that
stops giving to your cause. I mean, you &lt;em&gt;can&lt;/em&gt; get
mad about &lt;em&gt;anything&lt;/em&gt;,  you can be Hulk, right? But you wouldn&amp;#39;t begrudge a past-time top
contributor from not being around anymore, because they wish to spend their
time elsewhere. You shouldn&amp;#39;t begrudge a business that&amp;#39;s choosing to spend its
money elsewhere.&lt;/p&gt;
&lt;p&gt;Okay, we&amp;#39;re all trying our best.
I mean, not me, &lt;em&gt;I&amp;#39;m not&lt;/em&gt;, but &lt;strong&gt;&lt;em&gt;other&lt;/em&gt;&lt;/strong&gt;
people, right?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://openpath.quest/2024/the-historical-case-for-fair-source/"&gt;Fair Source&lt;/a&gt;
is an
alternative to closed source. Again, this is a recent
development, also from Chad Whitacre and
the other folks at Sentry, leading the charge here. I don&amp;#39;t know
if this will work out, but there&amp;#39;s
already eight companies adopting it.&lt;/p&gt;
&lt;p&gt;The idea is that it &lt;em&gt;transitions&lt;/em&gt; to
being a traditional open source license
after some time. I don&amp;#39;t know if
it&amp;#39;ll work out, but people are allowed
to make decisions, and make changes in
how they they live in the world.&lt;/p&gt;
&lt;p&gt;&lt;a name="036" /&gt;&lt;/p&gt;
&lt;h2 id="_36"&gt;&lt;a href="#036"&gt; &lt;img alt="" src="/talks/badcamp/slides.036.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;And it&amp;#39;s
not all bad, because, for example just
recently, I think in August of this year,
after 4 years of &lt;strong&gt;not&lt;/strong&gt; being open source,
Elasticsearch is &lt;strong&gt;back&lt;/strong&gt; to being open
source again. So sometimes they change
their mind and they come back and you
can read about how how it is that they
did that (&lt;a href="https://www.elastic.co/blog/elasticsearch-is-open-source-again"&gt;Elastic Blog&lt;/a&gt;; &lt;a href="https://techcrunch.com/2024/09/29/elastic-founder-on-why-they-returned-to-open-source-four-years-after-going-proprietary/"&gt;Techcrunch&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a name="037" /&gt;
Then there&amp;#39;s other disruptive
changes.&lt;/p&gt;
&lt;h2 id="_37"&gt;&lt;a href="#037"&gt; &lt;img alt="" src="/talks/badcamp/slides.037.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So the left-pad incident: the thing that doesn&amp;#39;t get
talked about the left-pad incident enough is
it&amp;#39;s sort of been painted as like &lt;i&gt;"oh one developer got &lt;b&gt;mad&lt;/b&gt; and decided to
just &lt;b&gt;screw everybody&lt;/b&gt;"&lt;/i&gt;. And no, that&amp;#39;s not
what happened. 
npm decided to side with one of their
commercial users. Kik was a company and they
wanted the name that this developer,
who happened to also develop left-pad,
had been
using. And when they took away his &lt;code&gt;kik&lt;/code&gt;...
&lt;em&gt;(ahem)&lt;/em&gt; When they &lt;em&gt;kicked&lt;/em&gt; him
out... No? Too much? Yeah it's good? Okay, I'll
leave it in. Okay, and he says
that this is &lt;strong&gt;not&lt;/strong&gt; driven by logic &amp;mdash; I&amp;#39;m sorry it &lt;strong&gt;was&lt;/strong&gt; driven by logic.
&lt;i class="extra"&gt;(I got some help from the audience here as I confused
myself)&lt;/i&gt;
It&amp;#39;s not driven by logic, anger, or greed. It&amp;#39;s an exclusive nor? &lt;i class="extra"&gt;(audience chuckles)&lt;/i&gt;
Thank you for the
laugh, appreciate that. So he says
that &lt;i&gt;"
Left-pad was like a 'death' and 're-birth' moment for me. 
The part of me passionate about open-source was dead, and something new took over. Now, I'm passionate about business, marketing, running companies / teams in different ways, as much as I'm about programming
&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="038" /&gt;
Okay, and then the other disruptive challenge are the ongoing
WordPress Saga. But let&amp;#39;s remind
ourselves of the rage pyramid.&lt;/p&gt;
&lt;h2 id="_38"&gt;&lt;a href="#038"&gt; &lt;img alt="" src="/talks/badcamp/slides.038.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Rage&lt;/em&gt;&lt;/strong&gt; still
applies here, because previously
I used the rage pyramid in defense of
maintainers, and this time it&amp;#39;s worth
mentioning that commercial
developers are allowed to do what they
want to do. The open source
licenses allow them to do it and we&amp;#39;re
allowed to fork.&lt;/p&gt;
&lt;p&gt;&lt;a name="042" /&gt;
Okay so we&amp;#39;re almost home.&lt;/p&gt;
&lt;h2 id="_39"&gt;&lt;a href="#042"&gt; &lt;img alt="" src="/talks/badcamp/slides.042.jpg"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The three things that I talked about is
that I tried to give you the kinds of
flavors of challenges that exists in developing
open source software today.
The big alarm bell is this attribution
theft. Then business cycles come and
go, have their booms and busts, and there
should always be tension between free and open source projects
and the paid contributors inside of
them. And finally forking is a right:
you have to adjust your expectations
accordingly.&lt;/p&gt;
&lt;p&gt;Thank you for your time and attention.
&lt;i class="extra"&gt;[Applause]&lt;/i&gt;&lt;/p&gt;</content><category term="technology"></category><category term="open source"></category><category term="code generation"></category><category term="license laundering"></category><category term="python"></category><category term="jupyter"></category></entry><entry><title>NumFOCUS concerns</title><link href="//pirsquared.org/blog/numfocus-concerns.html" rel="alternate"></link><published>2024-04-18T00:00:00-07:00</published><updated>2024-04-18T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2024-04-18:/blog/numfocus-concerns.html</id><summary type="html">&lt;p&gt;I want to shed some light and raise awareness about what's been going on with NumFOCUS.&lt;/p&gt;
&lt;p&gt;This is a long post that I started writing in late February. The basic gist that I am trying to get across is that&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;From the perspective of many sponsored and affiliated projects, NumFOCUS has
   been struggling to meet their needs in an adequate or timely manner. At a
   Town Hall meeting in February, NumFOCUS announced it is moving in a new
   direction, which caught many by surprise.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over the years, NumFOCUS has lacked transparency in how its board is
   selected, had a mixture of &lt;a href="#resignations"&gt;early-resignations&lt;/a&gt; as well board
   members staying &lt;a href="#term-limits"&gt;well beyond term limits&lt;/a&gt;, has &lt;a href="#NF-europe"&gt;struggled to
   incorporate a
   European affiliate for 9 years&lt;/a&gt;, and is currently overdue in
   &lt;a href="https://github.com/numfocus/TownHallCommunityFeedback/issues/4"&gt;providing minutes for the second half of 2023, or any part of
   2024&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NumFOCUS initiated an &lt;a href="#elections"&gt;effort to run an election for open
   board seats&lt;/a&gt; and proposed changing
   its governance structure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Related to 1 and 2, some projects are considering and actively &lt;a href="#nf-alternatives"&gt;pursuing
   alternative venues for fiscal sponsorship&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I have been in touch with many members of the community, including a
half-dozen former and one current NumFOCUS board members, to get their
perspective, which I include below. I welcome your corrections, clarifications,
and thoughts.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;You can join the discussion on
&lt;a href="https://www.linkedin.com/posts/paulivanov_numfocus-concerns-activity-7186907078387535873-tB3T"&gt;LinkedIn&lt;/a&gt;,
&lt;a href="https://mastodon.sdf.org/@ivanov/112295425103723212"&gt;Mastodon&lt;/a&gt;,
&lt;a href="https://twitter.com/ivanov/status/1781141199778415016"&gt;Twitter&lt;/a&gt; (most of the responses are on the
&lt;a href="https://www.linkedin.com/posts/paulivanov_numfocus-concerns-activity-7186907078387535873-tB3T"&gt;LinkedIn post&lt;/a&gt;).&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Outline:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#brief-overview-of-concerns-stemming-from-the-numfocus-town-hall-meeting"&gt;Brief overview of concerns stemming from the NumFOCUS Town Hall meeting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#feedback-from-former-board-members-and-community-members"&gt;Feedback from former board members and community members&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#responses-from-numfocus"&gt;Responses from NumFOCUS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#501c6"&gt;501c6&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#numfocus-origin-story"&gt;NumFOCUS origin story&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#linux-foundation-voltron-of-bureaucracy"&gt;Linux Foundation: Voltron of Bureaucracy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-a-501c6-differs-from-a-501c3"&gt;How a 501c6 differs from a 501c3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#numfocus-europe-still-not-a-thing-9-years-later"&gt;NumFOCUS Europe: still not a thing 9 years later&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#elections"&gt;Elections&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#term-limits-what-are-they-good-for-absolutely-nothing-say-it-again"&gt;Term limits &amp;mdash; what are they good for? Absolutely nothing. Say it again.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#election-committee"&gt;Election committee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#previous-election-non-transparency"&gt;Previous "Election" non-transparency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resignations"&gt;Resignations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#paths-forward-and-alternatives-to-numfocus"&gt;Paths forward and alternatives to NumFOCUS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name="overview"&gt;&lt;/p&gt;
&lt;h2 id="brief-overview-of-concerns-stemming-from-the-numfocus-town-hall-meeting"&gt;&lt;a href="#overview"&gt;Brief overview of concerns stemming from the NumFOCUS Town Hall meeting&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Several weeks ago (February 12, 2024), a new direction was announced at &lt;a href="https://github.com/numfocus/TownHallCommunityFeedback/issues/3"&gt;a town
hall meeting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This public development unfolded over the background of several years of private
discussions among NumFOCUS affiliated projects about the efficacy of NF in
serving the needs of constituent projects.&lt;/p&gt;
&lt;p&gt;In the Town Hall meeting, there was some acknowledgement of pains in the way NF
currently operates, but not specifics as to what those pain points are nor what
the plan is to mitigate them. It was therefore surprising to learn of the plan
to form a 501c6 in addition to the 501c3 while navigating these
(underspecified?) headwinds.  &lt;a href="#501c6"&gt;&amp;gt;&amp;gt; skip to 501c6 section &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;NumFOCUS Executive Director Leah Silen outlined some of the challenges related
to forming a European entity, though I was alarmed to hear about 17 accounting
firms not being sufficient to arrive at a suitable accommodation. &lt;a href="#nf-europe"&gt;&amp;gt;&amp;gt; skip to NF
Europe section &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There was also a theme of AI, which is not representative of interest or
relevance to every project. "AI" was mentioned 37 times, according to &lt;a href="https://github.com/numfocus/TownHallCommunityFeedback/files/14254379/nf_townhall_gmt20240212-175300_recording.transcript.pdf"&gt;the
transcript&lt;/a&gt;.
It wasn't clear if this is a new direction for NumFOCUS as a whole, if it is
related to and somehow bundled with the 501c6 move, or if it's just an
announcement of direction for the Open-Source Science initiative that's a joint
partnership between NF and IBM. (This does not have its own section, but does
get mentioned in the &lt;a href="#feedback"&gt;feedback from former board members and community
members&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Finally, the last concern raised for me was around a proposed election and
change in governance structure of NumFOCUS. &lt;a href="#elections"&gt;&amp;gt;&amp;gt; skip to the Elections section &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At the conclusion of this post, I link to some alternatives to
NumFOCUS   &lt;a href="#nf-alternatives"&gt;&amp;gt;&amp;gt; skip to the paths forward section &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="feedback-from-former-board-members-and-community-members"&gt;&lt;a href="#feedback"&gt;Feedback from former board members and community members&lt;/a&gt; &lt;a name="feedback" /&gt;&lt;/h2&gt;
&lt;p&gt;I posted on &lt;a href="https://mastodon.sdf.org/@ivanov/111943902061475918"&gt;mastodon&lt;/a&gt;,
&lt;a href="https://www.linkedin.com/posts/paulivanov_slide-deck-and-audio-file-issue-3-numfocus-activity-7164409026775117824-r4SK"&gt;linkedin&lt;/a&gt;,
and &lt;a href="https://twitter.com/ivanov/status/1758643871322714216"&gt;twitter&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anyone else have concerns about the proposed new direction of NumFOCUS? I
  finally watched the recording from Monday’s Town Hall and I’d love to talk /
  read your thoughts, be it in public or in private.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In response to my feeler about concerns, here's some of what I heard back.&lt;/p&gt;
&lt;p&gt;One former board member wrote this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I guess it would come as no surprise that I have some concerns. A few include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Misdirected AI thrust.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Repeated claims of funding the projects, without mentioning overhead taken
  from project grants.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Emphasis on organization &amp;amp; personnel growth, instead of focusing on existing
  service delivery.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Complex organizational restructure, when services are not being rendered
  effectively. New structure separates current board from technical board;
  risks isolating projects further.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;501c6: new opportunities for funding (potentially good), but NF has no
  current demonstrated route other than SDG[&lt;sup id="fnref:SDG"&gt;&lt;a class="footnote-ref" href="#fn:SDG"&gt;1&lt;/a&gt;&lt;/sup&gt;] to get funding to projects, and no
  related policies in place.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Board elections: the committee solicited will not control next election of
  board? Board should have more community representation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Board is in contravention of bylaws (president, e.g., has been on the board
  for a year longer than allowed).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Another former board member said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I do have concerns. Unfortunately from my past and current experience with
NumFOCUS, I don’t see a lot of ability to influence change&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A third former board member wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have a confession.  I never ran any grants through NF because I didn't trust them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A fourth former board member wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It has been many years since I have been on the NumFOCUS board...When I was on
the board - strong personalities generally drove much of the direction. ... At
that point there could have been more engagement with community and projects,
but I am saying this with the wisdom of looking back (ah hindsight, if only we
had you sooner).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A community project leader wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The new proposed governance structure seems to come out of the current
board/staff without any input from anyone from the projects (that I know of)
and as [redacted] mentioned the new structure may not really help with getting
the community together&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Another community project leader wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I also found it underwhelming to say the least…   It even annoyed me on the AI
take. I thought we wanted to push science and open source, not please one
specific board member and the investors. Yes, to some extent, our projects are
the backbone of AI, but they presented this initiative as if the AI business
was going to drive what we do in our projects. And the bot thing… come on.&lt;/p&gt;
&lt;p&gt;Instead I would have liked a back to basics. Science and open source. Focus on
that, providing the services they should be already providing for  all the
money taken. And instead of randomly saying AI, talk about what real science
and expertise we bring to the table vs all the BS models out there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A third community project leader wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I personally have a bias against 501(c)(6) NGOs. Seems to be inappropriate for
publicly funded and public-interest scientific software. I understand why they
are doing this experiment, and it may "work", but it will have real governance
consequences.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A fourth wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Within all the buzzwords and stuff, it took them about 70 minutes to mention
scientific computing or science (and even that was a read out loud one of the
zoom comments) I think that summarises it all where the actual priorities lie
and that "projects first" is a well sounding but absolutely empty phrase
without any actions to support it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A fifth wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;it's clear to me that NumFOCUS really signed its own death warrant with that
town hall. So the question is where to next. Things that have been spitballed
in our various conversations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;start a new non-profit&lt;/li&gt;
&lt;li&gt;start a co-op&lt;/li&gt;
&lt;li&gt;find a different sponsor&lt;/li&gt;
&lt;li&gt;take over NumFOCUS
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;More private communication:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have so many thoughts on NF, but so far I have been sharing them in small
support groups only. Basically after this Monday mess I think it's hopeless to
fix it, and we may better look for another nonprofit who actually does the
accounting and paying project bills on time.&lt;/p&gt;
&lt;p&gt;currently the projects seem to serve pydata not the other way around even
though the marketing says the opposite.&lt;/p&gt;
&lt;p&gt;Anyway, after the townhall I kind of lost all the last drops of hope I had
that everything will work out eventually as there was not a single point that
showed a positive change from the current status quo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="responses-from-numfocus"&gt;&lt;a href="#responses-from-numfocus"&gt;Responses from NumFOCUS&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the people first people who reached out to me was Executive Director Leah
Silen, but I was trying to piece something together in writing (this post) and
concentrated my line of inquiry with her around the election and election
committee, so her responses are quoted in the &lt;a href="#elections"&gt;election section&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Current board member Logan Kilpatrick, also reached out on February 20th, 2024
saying "Happy to chat about your NumFOCUS feedback!" but did not respond after I
wrote about my concerns. Logan holds the position of Secretary on the NF board,
so had he responded to me, I could have followed up to ask about why &lt;a href="https://github.com/numfocus/TownHallCommunityFeedback/issues/4"&gt;the board
has not released meeting minutes for the past 11
months&lt;/a&gt;, but I
did not get this opportunity.&lt;/p&gt;
&lt;p&gt;I also emailed Sylvain Corlay, a current board member I know personally from
our long time shared involvement with Jupyter, and he did respond, I am
including some of what he shared with me in this post, starting with
clarification about what I referred to as "underspecified headwinds":&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Regarding the pain points that were encountered, I believe that Leah was
referring to complaints from projects regarding the slow processing of
financial service requests by NumFOCUS. I think that a lot of these issues
have been addressed, especially after the recruitment of Miriam, our new
finance director.&lt;/p&gt;
&lt;p&gt;In my opinion, the growth of NumFOCUS in recent years has presented us with
the typical challenges that any organization encounters during growth.
NumFOCUS deals with a high level of detail on the accounting of projects
(down to the individual travel expense, and regular financial reporting on
grants etc), and the number of affiliated projects has grown from a dozen
to over sixty. The way in which you can operate when you have a dozen
sponsored project and when you get closer to a hundred is not the same -
and the way to address this question required systemic changes - such as
adopting better tools and processes - which understandably took time to
implement. I think that we are better equipped now, and Leah presented
plans around adopting new tools, notably a ticketing system for financial
requests.&lt;/p&gt;
&lt;p&gt;(A side note: While some frustration was understandable, I think that some
of the criticism received was unfair. The consolidated accounting that
NumFOCUS provides for all projects is more complex than it may initially
appear, as I can attest as a business owner.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Because I also asked about the pervading AI preoccupation at the Town Hall,
Sylvain responded to that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don't think this is very central in our plans for NumFOCUS, but several
 people have said that they felt that the PyData ecosystem and NumFOCUS had
 "missed" AI.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There's more from Sylvain in the &lt;a href="#501c6"&gt;501c6&lt;/a&gt; and &lt;a href="#NF-europe"&gt;NumFOCUS Europe&lt;/a&gt; sections.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="501c6"&gt;&lt;a href="#501c6"&gt;501c6&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="numfocus-origin-story"&gt;NumFOCUS origin story&lt;/h3&gt;
&lt;p&gt;NumFOCUS started as an organization in 2012. Here's a snippet from the &lt;a href="https://numfocus.org/history"&gt;NumFOCUS
history page&lt;/a&gt; where I just correct one inaccuracy,
the part about Anthony coming up with the NumFOCUS name, by crossing it off:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the early Oughts, the open source scientific computing community was
reaching a critical point of maturity for Numeric/Numpy, IPython, Matplotlib,
and SciPy. By 2010, a critical mass of projects were in need of a more formal
structure to provide support and help to organize the community.&lt;/p&gt;
&lt;p&gt;…enter NumFOCUS!&lt;/p&gt;
&lt;p&gt;Travis Oliphant (author of NumPy), Fernando Pérez (author of IPython), Perry
Greenfield (author of Numarray and Astropy), John Hunter (author of
Matplotlib), Jarrod Millman (release manager for SciPy), and Anthony Scopatz
&lt;strike&gt;(who came up with the name "NumFOCUS")&lt;/strike&gt; became the founding board of NumFOCUS&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a name="focus"/&gt;Have you ever wondered why FOCUS is capitalized? The name came from Travis
Oliphant in January 2012, in a thread he started with a dozen
people[&lt;sup id="fnref:initial_foundation_thread"&gt;&lt;a class="footnote-ref" href="#fn:initial_foundation_thread"&gt;2&lt;/a&gt;&lt;/sup&gt;]
whose subject was "New Foundation Name?" After a few of us tossed in some …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I want to shed some light and raise awareness about what's been going on with NumFOCUS.&lt;/p&gt;
&lt;p&gt;This is a long post that I started writing in late February. The basic gist that I am trying to get across is that&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;From the perspective of many sponsored and affiliated projects, NumFOCUS has
   been struggling to meet their needs in an adequate or timely manner. At a
   Town Hall meeting in February, NumFOCUS announced it is moving in a new
   direction, which caught many by surprise.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over the years, NumFOCUS has lacked transparency in how its board is
   selected, had a mixture of &lt;a href="#resignations"&gt;early-resignations&lt;/a&gt; as well board
   members staying &lt;a href="#term-limits"&gt;well beyond term limits&lt;/a&gt;, has &lt;a href="#NF-europe"&gt;struggled to
   incorporate a
   European affiliate for 9 years&lt;/a&gt;, and is currently overdue in
   &lt;a href="https://github.com/numfocus/TownHallCommunityFeedback/issues/4"&gt;providing minutes for the second half of 2023, or any part of
   2024&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NumFOCUS initiated an &lt;a href="#elections"&gt;effort to run an election for open
   board seats&lt;/a&gt; and proposed changing
   its governance structure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Related to 1 and 2, some projects are considering and actively &lt;a href="#nf-alternatives"&gt;pursuing
   alternative venues for fiscal sponsorship&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I have been in touch with many members of the community, including a
half-dozen former and one current NumFOCUS board members, to get their
perspective, which I include below. I welcome your corrections, clarifications,
and thoughts.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;You can join the discussion on
&lt;a href="https://www.linkedin.com/posts/paulivanov_numfocus-concerns-activity-7186907078387535873-tB3T"&gt;LinkedIn&lt;/a&gt;,
&lt;a href="https://mastodon.sdf.org/@ivanov/112295425103723212"&gt;Mastodon&lt;/a&gt;,
&lt;a href="https://twitter.com/ivanov/status/1781141199778415016"&gt;Twitter&lt;/a&gt; (most of the responses are on the
&lt;a href="https://www.linkedin.com/posts/paulivanov_numfocus-concerns-activity-7186907078387535873-tB3T"&gt;LinkedIn post&lt;/a&gt;).&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Outline:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#brief-overview-of-concerns-stemming-from-the-numfocus-town-hall-meeting"&gt;Brief overview of concerns stemming from the NumFOCUS Town Hall meeting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#feedback-from-former-board-members-and-community-members"&gt;Feedback from former board members and community members&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#responses-from-numfocus"&gt;Responses from NumFOCUS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#501c6"&gt;501c6&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#numfocus-origin-story"&gt;NumFOCUS origin story&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#linux-foundation-voltron-of-bureaucracy"&gt;Linux Foundation: Voltron of Bureaucracy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-a-501c6-differs-from-a-501c3"&gt;How a 501c6 differs from a 501c3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#numfocus-europe-still-not-a-thing-9-years-later"&gt;NumFOCUS Europe: still not a thing 9 years later&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#elections"&gt;Elections&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#term-limits-what-are-they-good-for-absolutely-nothing-say-it-again"&gt;Term limits &amp;mdash; what are they good for? Absolutely nothing. Say it again.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#election-committee"&gt;Election committee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#previous-election-non-transparency"&gt;Previous "Election" non-transparency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resignations"&gt;Resignations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#paths-forward-and-alternatives-to-numfocus"&gt;Paths forward and alternatives to NumFOCUS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name="overview"&gt;&lt;/p&gt;
&lt;h2 id="brief-overview-of-concerns-stemming-from-the-numfocus-town-hall-meeting"&gt;&lt;a href="#overview"&gt;Brief overview of concerns stemming from the NumFOCUS Town Hall meeting&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Several weeks ago (February 12, 2024), a new direction was announced at &lt;a href="https://github.com/numfocus/TownHallCommunityFeedback/issues/3"&gt;a town
hall meeting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This public development unfolded over the background of several years of private
discussions among NumFOCUS affiliated projects about the efficacy of NF in
serving the needs of constituent projects.&lt;/p&gt;
&lt;p&gt;In the Town Hall meeting, there was some acknowledgement of pains in the way NF
currently operates, but not specifics as to what those pain points are nor what
the plan is to mitigate them. It was therefore surprising to learn of the plan
to form a 501c6 in addition to the 501c3 while navigating these
(underspecified?) headwinds.  &lt;a href="#501c6"&gt;&amp;gt;&amp;gt; skip to 501c6 section &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;NumFOCUS Executive Director Leah Silen outlined some of the challenges related
to forming a European entity, though I was alarmed to hear about 17 accounting
firms not being sufficient to arrive at a suitable accommodation. &lt;a href="#nf-europe"&gt;&amp;gt;&amp;gt; skip to NF
Europe section &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There was also a theme of AI, which is not representative of interest or
relevance to every project. "AI" was mentioned 37 times, according to &lt;a href="https://github.com/numfocus/TownHallCommunityFeedback/files/14254379/nf_townhall_gmt20240212-175300_recording.transcript.pdf"&gt;the
transcript&lt;/a&gt;.
It wasn't clear if this is a new direction for NumFOCUS as a whole, if it is
related to and somehow bundled with the 501c6 move, or if it's just an
announcement of direction for the Open-Source Science initiative that's a joint
partnership between NF and IBM. (This does not have its own section, but does
get mentioned in the &lt;a href="#feedback"&gt;feedback from former board members and community
members&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Finally, the last concern raised for me was around a proposed election and
change in governance structure of NumFOCUS. &lt;a href="#elections"&gt;&amp;gt;&amp;gt; skip to the Elections section &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At the conclusion of this post, I link to some alternatives to
NumFOCUS   &lt;a href="#nf-alternatives"&gt;&amp;gt;&amp;gt; skip to the paths forward section &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="feedback-from-former-board-members-and-community-members"&gt;&lt;a href="#feedback"&gt;Feedback from former board members and community members&lt;/a&gt; &lt;a name="feedback" /&gt;&lt;/h2&gt;
&lt;p&gt;I posted on &lt;a href="https://mastodon.sdf.org/@ivanov/111943902061475918"&gt;mastodon&lt;/a&gt;,
&lt;a href="https://www.linkedin.com/posts/paulivanov_slide-deck-and-audio-file-issue-3-numfocus-activity-7164409026775117824-r4SK"&gt;linkedin&lt;/a&gt;,
and &lt;a href="https://twitter.com/ivanov/status/1758643871322714216"&gt;twitter&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anyone else have concerns about the proposed new direction of NumFOCUS? I
  finally watched the recording from Monday’s Town Hall and I’d love to talk /
  read your thoughts, be it in public or in private.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In response to my feeler about concerns, here's some of what I heard back.&lt;/p&gt;
&lt;p&gt;One former board member wrote this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I guess it would come as no surprise that I have some concerns. A few include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Misdirected AI thrust.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Repeated claims of funding the projects, without mentioning overhead taken
  from project grants.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Emphasis on organization &amp;amp; personnel growth, instead of focusing on existing
  service delivery.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Complex organizational restructure, when services are not being rendered
  effectively. New structure separates current board from technical board;
  risks isolating projects further.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;501c6: new opportunities for funding (potentially good), but NF has no
  current demonstrated route other than SDG[&lt;sup id="fnref:SDG"&gt;&lt;a class="footnote-ref" href="#fn:SDG"&gt;1&lt;/a&gt;&lt;/sup&gt;] to get funding to projects, and no
  related policies in place.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Board elections: the committee solicited will not control next election of
  board? Board should have more community representation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Board is in contravention of bylaws (president, e.g., has been on the board
  for a year longer than allowed).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Another former board member said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I do have concerns. Unfortunately from my past and current experience with
NumFOCUS, I don’t see a lot of ability to influence change&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A third former board member wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have a confession.  I never ran any grants through NF because I didn't trust them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A fourth former board member wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It has been many years since I have been on the NumFOCUS board...When I was on
the board - strong personalities generally drove much of the direction. ... At
that point there could have been more engagement with community and projects,
but I am saying this with the wisdom of looking back (ah hindsight, if only we
had you sooner).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A community project leader wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The new proposed governance structure seems to come out of the current
board/staff without any input from anyone from the projects (that I know of)
and as [redacted] mentioned the new structure may not really help with getting
the community together&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Another community project leader wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I also found it underwhelming to say the least…   It even annoyed me on the AI
take. I thought we wanted to push science and open source, not please one
specific board member and the investors. Yes, to some extent, our projects are
the backbone of AI, but they presented this initiative as if the AI business
was going to drive what we do in our projects. And the bot thing… come on.&lt;/p&gt;
&lt;p&gt;Instead I would have liked a back to basics. Science and open source. Focus on
that, providing the services they should be already providing for  all the
money taken. And instead of randomly saying AI, talk about what real science
and expertise we bring to the table vs all the BS models out there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A third community project leader wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I personally have a bias against 501(c)(6) NGOs. Seems to be inappropriate for
publicly funded and public-interest scientific software. I understand why they
are doing this experiment, and it may "work", but it will have real governance
consequences.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A fourth wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Within all the buzzwords and stuff, it took them about 70 minutes to mention
scientific computing or science (and even that was a read out loud one of the
zoom comments) I think that summarises it all where the actual priorities lie
and that "projects first" is a well sounding but absolutely empty phrase
without any actions to support it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A fifth wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;it's clear to me that NumFOCUS really signed its own death warrant with that
town hall. So the question is where to next. Things that have been spitballed
in our various conversations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;start a new non-profit&lt;/li&gt;
&lt;li&gt;start a co-op&lt;/li&gt;
&lt;li&gt;find a different sponsor&lt;/li&gt;
&lt;li&gt;take over NumFOCUS
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;More private communication:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have so many thoughts on NF, but so far I have been sharing them in small
support groups only. Basically after this Monday mess I think it's hopeless to
fix it, and we may better look for another nonprofit who actually does the
accounting and paying project bills on time.&lt;/p&gt;
&lt;p&gt;currently the projects seem to serve pydata not the other way around even
though the marketing says the opposite.&lt;/p&gt;
&lt;p&gt;Anyway, after the townhall I kind of lost all the last drops of hope I had
that everything will work out eventually as there was not a single point that
showed a positive change from the current status quo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="responses-from-numfocus"&gt;&lt;a href="#responses-from-numfocus"&gt;Responses from NumFOCUS&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the people first people who reached out to me was Executive Director Leah
Silen, but I was trying to piece something together in writing (this post) and
concentrated my line of inquiry with her around the election and election
committee, so her responses are quoted in the &lt;a href="#elections"&gt;election section&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Current board member Logan Kilpatrick, also reached out on February 20th, 2024
saying "Happy to chat about your NumFOCUS feedback!" but did not respond after I
wrote about my concerns. Logan holds the position of Secretary on the NF board,
so had he responded to me, I could have followed up to ask about why &lt;a href="https://github.com/numfocus/TownHallCommunityFeedback/issues/4"&gt;the board
has not released meeting minutes for the past 11
months&lt;/a&gt;, but I
did not get this opportunity.&lt;/p&gt;
&lt;p&gt;I also emailed Sylvain Corlay, a current board member I know personally from
our long time shared involvement with Jupyter, and he did respond, I am
including some of what he shared with me in this post, starting with
clarification about what I referred to as "underspecified headwinds":&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Regarding the pain points that were encountered, I believe that Leah was
referring to complaints from projects regarding the slow processing of
financial service requests by NumFOCUS. I think that a lot of these issues
have been addressed, especially after the recruitment of Miriam, our new
finance director.&lt;/p&gt;
&lt;p&gt;In my opinion, the growth of NumFOCUS in recent years has presented us with
the typical challenges that any organization encounters during growth.
NumFOCUS deals with a high level of detail on the accounting of projects
(down to the individual travel expense, and regular financial reporting on
grants etc), and the number of affiliated projects has grown from a dozen
to over sixty. The way in which you can operate when you have a dozen
sponsored project and when you get closer to a hundred is not the same -
and the way to address this question required systemic changes - such as
adopting better tools and processes - which understandably took time to
implement. I think that we are better equipped now, and Leah presented
plans around adopting new tools, notably a ticketing system for financial
requests.&lt;/p&gt;
&lt;p&gt;(A side note: While some frustration was understandable, I think that some
of the criticism received was unfair. The consolidated accounting that
NumFOCUS provides for all projects is more complex than it may initially
appear, as I can attest as a business owner.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Because I also asked about the pervading AI preoccupation at the Town Hall,
Sylvain responded to that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don't think this is very central in our plans for NumFOCUS, but several
 people have said that they felt that the PyData ecosystem and NumFOCUS had
 "missed" AI.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There's more from Sylvain in the &lt;a href="#501c6"&gt;501c6&lt;/a&gt; and &lt;a href="#NF-europe"&gt;NumFOCUS Europe&lt;/a&gt; sections.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="501c6"&gt;&lt;a href="#501c6"&gt;501c6&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="numfocus-origin-story"&gt;NumFOCUS origin story&lt;/h3&gt;
&lt;p&gt;NumFOCUS started as an organization in 2012. Here's a snippet from the &lt;a href="https://numfocus.org/history"&gt;NumFOCUS
history page&lt;/a&gt; where I just correct one inaccuracy,
the part about Anthony coming up with the NumFOCUS name, by crossing it off:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the early Oughts, the open source scientific computing community was
reaching a critical point of maturity for Numeric/Numpy, IPython, Matplotlib,
and SciPy. By 2010, a critical mass of projects were in need of a more formal
structure to provide support and help to organize the community.&lt;/p&gt;
&lt;p&gt;…enter NumFOCUS!&lt;/p&gt;
&lt;p&gt;Travis Oliphant (author of NumPy), Fernando Pérez (author of IPython), Perry
Greenfield (author of Numarray and Astropy), John Hunter (author of
Matplotlib), Jarrod Millman (release manager for SciPy), and Anthony Scopatz
&lt;strike&gt;(who came up with the name "NumFOCUS")&lt;/strike&gt; became the founding board of NumFOCUS&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a name="focus"/&gt;Have you ever wondered why FOCUS is capitalized? The name came from Travis
Oliphant in January 2012, in a thread he started with a dozen
people[&lt;sup id="fnref:initial_foundation_thread"&gt;&lt;a class="footnote-ref" href="#fn:initial_foundation_thread"&gt;2&lt;/a&gt;&lt;/sup&gt;]
whose subject was "New Foundation Name?" After a few of us tossed in some
initial ideas as well as desirable properties of the new name, Travis pitched
the following :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Foundation for Open and Usable Code for Science -- or&lt;/p&gt;
&lt;p&gt;Foundation for Open Code Usable for Science (FOCUS)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;which Anthony Scopatz suggested be modified:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;+1 with the following modification "Foundation for Open Code for Usable
Science."  There are many codes "usable for science" but very few that make
science more transparent and usable.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A few days later, Travis followed up&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So, what about NumFOCUS for the name of the foundation?   Initially it will
represent "NumPy Foundation for Open Code for Usable Science"  But, later the
Num can just represent anything relating to Numerical Computing.&lt;/p&gt;
&lt;p&gt;Unless there are strong objections (or better alternatives that emerge in the
next few days), I think I will go ahead and start the legal process with this
name.   I will give another 3 days for other ideas to emerge, then with the
help of legal zoom start things going.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There was some assent, and no alternatives or opposition, so Travis moved
forward with the plan, reporting that "NumFocus, Inc." was formed as a Texas
non-profit corporation a week later (January 14th, 2012).&lt;/p&gt;
&lt;p&gt;&lt;img alt="NumFOCUS original logo from January 2012" src="/blog/images/nf_concerns/NumFOCUS_Logo_2012.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Travis Oliphant and Peter Wang also founded a company at the same time,
Continuum Analytics, which later renamed to Anaconda to reflect and capitalize
on the recoginition of its popular Python distribution. Again back to the
&lt;a href="https://numfocus.org/history"&gt;NumFOCUS history page&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Continuum Analytics (now Anaconda) provided integral support on many levels
during the early years of NumFOCUS. This included space for the first NumFOCUS
office, support staff, and salary of the Executive Director. They also
launched the first PyData and contributed many resources and funds to the
early events which made it possible for event proceeds to directly support
NumFOCUS.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So NumFOCUS, from inception, has had some form of corporate sponsorship. The
executive directory mentioned is Leah Silen, who has been the executive
directory of NumFOCUS for as long as NF has had an executive director. Being a
501c3 non-profit allows individuals and corporations which pay taxes in the
United States to donate to NumFOCUS and deduct those donations on their tax
returns. There was a period of time where there was some notion of "becoming a
member" of NumFOCUS though donation as an individual, but that has gone away,
though there is still a way for corporations to get perks for donating, for
example, if they donate $50,000 dollars or more, they get a seat on the
Advisory Council.&lt;/p&gt;
&lt;p&gt;When I first found out that NF proposed forming a 501c6, alarm bells started
going off in my head, because of the reputation of and my experiences with
another 501c6: The Linux Foundation. And by a happy coincidence, I had just
stumbled across a pithy and apt description of what's wrong with the Linux
Foundation.&lt;/p&gt;
&lt;h3 id="linux-foundation-voltron-of-bureaucracy"&gt;&lt;a href="#linux-foundation-voltron-of-bureaucracy"&gt;Linux Foundation: Voltron of Bureaucracy&lt;/a&gt;&lt;/h3&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/Sk9TatW9ino?si=viS-7IyRNSQ0siBF&amp;amp;clip=UgkxvSOqbXRUlokYpASX4q1mr-_jpdhVZF3l&amp;amp;clipt=EKjIowIYiJ2nAg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;For the impatient, I include Rob Landley's words from the clip above, but I
    recommend the original source video for its superior delivery:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Linux Foundation was formed when two black holes of bureaucracy combined
to form Voltron of Bureaucracy. ...and when they combined, the focus shifted
from maintaining this standard, to asking donors for money.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Linux Foundation has a well deserved reputation for being pay-to-play. It's
where vendors with big pocket books send money.  Rob Landley has a more a more
&lt;a href="https://landley.net/notes-2010.html#18-07-2010"&gt;meaty post explaining the LF situation in
2010&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;...the Linux Foundation has set itself up to translate between Fortune 500
companies and individual hobbyist developers. And it's very good at talking to
Fortune 500 companies, because that's where its money comes from. But it's not
very good at talking to hobbyists, because it's a giant bureaucracy, which is
the antithesis of hobbyist "playing around with stuff".&lt;/p&gt;
&lt;p&gt;...The Linux Foundation tries to influence and monitor Linux development, to
provide results for the corporations that fund it. It sponsors conferences,
writes white papers, maintains a technical advisory board... It's a bit like a
modern Usenix, really.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Around that same time, I was a member of the Linux Foundation (2010-2012) - I
 was young and naive. I thought it was amazing to have an organization that
 includes individuals: a grad student tinkerer like me, along with professional
 developers who get to work on the Linux kernel full-time. After seeing Jim
 Zemlin, the Linux Foundation Executive Director, give a talk at Xerox PARC in 2010
 using a Mac and making excuses how Linux isn't quite there for doing
 presentations, which clearly demonstrated what total corporate shill he was,
 especially given his "vision" for Linux was that a) it was already everywhere,
 and b) in the future, it will be &lt;em&gt;more&lt;/em&gt; everywhere. I thought that  things
 could turn for the better,  it was a temporary accident that  someone both
 dismissive and vacuously bombastic about Linux was leading the
 &lt;em&gt;Linux&lt;/em&gt; Foundation. I was wrong. Zemlin is still the LF Executive director
 now.&lt;/p&gt;
&lt;p&gt;Rob Landley had a much closer view of the Linux Foundation transformation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Oh I worked for them back in 2007. (The Documentation fellowship.) There was
some definite frog boiling going on there over the years, they got more
bureaucratic as time went on. The purge of all hobbyists from Linux development
didn't happen until... it wasn't until 2013 they started asking "&lt;a href="https://lwn.net/Articles/563538/"&gt;do we still
have any hobbyists in this community, what IS a hobbyist
anyway?&lt;/a&gt;"&lt;/p&gt;
&lt;p&gt;&lt;a href="https://lwn.net/Articles/563578/"&gt;And then ignoring the replies&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://octodon.social/@biocrusoe/111952223071532624"&gt;Michael Crusoe pointed&lt;/a&gt;
to a post by Matthew Garrett from 2016 titled &lt;a href="https://mjg59.dreamwidth.org/39546.html"&gt;Linux Foundation quietly drops
community representation&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="how-a-501c6-differs-from-a-501c3"&gt;How a 501c6 differs from a 501c3&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://softwarefreedom.org/blog/2016/apr/11/lf/"&gt;A 2016 post by Eben Moglen&lt;/a&gt; (that
Rob Landley referred me to) contains this explanation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Linux Foundation, which was formed by merging OSDL and the Free Standards
Group, is a trade association, which is a special form of legal entity under
US tax law. It is not a charity, or a public service organization. It’s an
association of businesses, paying dues, in order to achieve common business
purposes, which in the case of LF results in a wide range of activities, all
centered around promoting the success of Linux. Because it does not pay
federal income taxes, and its exemption—like those of charitable or public
benefit organizations—comes from section 501c of the Internal Revenue Code,
lay observers might suppose that it has some “community benefit” function, but
the precise opposite is true.
The tax-exemption rationale for trade associations is that their primary
income is the dues paid to them for achievement of business purposes. Since
that expenditure would be a business expense netted against revenue for the
member businesses if they performed the same tasks individually, there is a
sharp disincentive to group together for common business purposes unless the
dues are also untaxed in the hands of the recipient. It is axiomatic to their
identity that trade associations aren’t charities, that they only benefit
their donors (as opposed to 501c3 tax exempt charities, which must not benefit
their donors specially), and that they pursue business goals, not social
interests.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;NumFOCUS Board member Sylvain Corlay explained this about the 501c6&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On the subject of the 501c6, some projects expressed disappointment that
NumFOCUS was not actively engaged in fundraising on their behalf. While we
offer assistance with grant proposals and fund small development grants,
there is no dedicated effort to secure additional funding for projects such
as Jupyter. This is something that we want to be more deliberate about.&lt;/p&gt;
&lt;p&gt;A successful funding model employed by other open-source foundations, and
which requires using a 501c6, is a membership model for companies, as
exemplified by the Linux Foundation. This model provides revenue recurrence
and aligns well with building a relationship with regular donors. (It also
matches well with how large corporations are used to engage with such
open-source foundations.) Finally, such a membership model scales really
well compared to a grant-based funding model.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think that the 501c6 direction was the wrong one for NumFOCUS to pursue. The
reason is that we have a nonprofit, that was created to serve the public good,
now transforming itself to also serve the needs of the business community. I'm
not against someone wanting to set up a 501c6 for scientific open source
projects, I just think that NF doing this, without consulting projects, given
how much dissatisfaction there has been with NF on their core services they're
supposed to provide projects, is particularly
treacherous[&lt;sup id="fnref:treacherous-action-not-people"&gt;&lt;a class="footnote-ref" href="#fn:treacherous-action-not-people"&gt;3&lt;/a&gt;&lt;/sup&gt;].&lt;/p&gt;
&lt;p&gt;&lt;a name="sk" /&gt;
To project the LF situation into our ecosystem, the hobbyists there are the
academics here, if you squint. And if scikit-learn, one of the breakout
superstar projects, &lt;a href="#skZoom"&gt;can't get help from NF to get a credit card so they can run
CI with GPUs for months at a time&lt;/a&gt;, it'll only get worse when NF starts to
consider businesses who pay NF real money and expect real service as a 501c6.
Like it'll be Nvidia, Microsoft, Google, Facebook, etc, as "members", and sure,
you and me will be "members", too, I'm sure we'll all be treated equally.&lt;/p&gt;
&lt;p&gt;&lt;a class="thumb-link" href="#skZoom"&gt;
&lt;img alt="Scikit-learn credit card woes" src="/blog/images/nf_concerns/scikit-learn-card.png" width=100%&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="#sk" class="lightbox" name="skZoom" &gt;
&lt;img alt="Scikit-learn credit card woes" src="/blog/images/nf_concerns/scikit-learn-card.png"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can click on the image above,  but I also reproduce the text from a
scikit-learn developer posting on the NumFOCUS slack #general channel in October
2023:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So from the scikit-learn side, we started the process of trying to get a PEX
credit card in May so that we can pay for GPUs in our CI.&lt;/p&gt;
&lt;p&gt;After some discussions, we filed the form in June for the card, and I put my
info there as for the name on the card.&lt;/p&gt;
&lt;p&gt;Now, being October, apparently the account requested for me is on hold or
blocked (talking to @Mir Mueller
 about it), and my guess is that it's because my name sounds too middle eastern for the bank. My nationality on the request is not even Iran, I'm using my German nationality to request it, and it's still blocked (for now at least).
With conversations with many members of the staff, including @Leah Silen I've
been asking for a European entity since 2019 at least, and I think NumFocus
now does have a European entity, which AFAIK is not used. The reason I've
asked for it has been two folds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;donors can deduct donations from their taxes if they're in Europe and they
 donate to a European NGO kind of entity.&lt;/li&gt;
&lt;li&gt;we can fund and financially deal with people who come from countries against
 whom US is very hostile, like me.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the context of diversity and getting people from the global south, it's
also important that we could actually do that, and it's not just all talks.&lt;/p&gt;
&lt;p&gt;Believe if or not, it's really not fun to have to deal with such issues and
after 4 months still not be able to have a simple PEX card. For people like
me, it would be really nice if we could actually deal with the European
entity, and have our dealings with that entity instead of having to deal with
the US system. So the question is, how can we get to actually do this and
what's needed for it to happen?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The mention of "asking for a European entity since 2019 at least" is a good
segue to the next concern.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="numfocus-europe-still-not-a-thing-9-years-later"&gt;&lt;a href="#NF-europe"&gt;NumFOCUS Europe: still not a thing 9 years later&lt;/a&gt; &lt;a name="NF-europe" /&gt;&lt;/h2&gt;
&lt;p&gt;From the board meeting notes for December 1, 2014 (page 50 of &lt;a href="https://docs.google.com/document/d/1dxE98yMxlNOBGAVvVR03RIf_IR1thuAhS8fe6XGx2pI/edit?pli=1"&gt;NumFOCUS Meeting
 Minutes
 2014-2015&lt;/a&gt;)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Moving forward to establish NumFOCUS as a charitable organization in Europe as
a Dutch “foundation” to receive donations from European entities at a cost of
$1,500.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And a note on the same page:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;France has more potential members?
  - However France is worst place to set up&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Fast forward to 2024, and the "What is our status in Europe?" comes up again at
the Town Hall,  at 1 hour and 2 minutes into &lt;a href="https://numfocus-org.zoom.us/rec/play/dd4-bgySgHYBoa4BK31lyNlNTmz0Ptgv6aWODxroeJyUfsZmXsGK06wAi7OMJ6jNMtWROG8qQOWJ0Wj4.3q0VVPiBJovl5MRO?canPlayFromShare=true&amp;amp;from=share_recording_detail&amp;amp;continueMode=true&amp;amp;componentName=rec-play&amp;amp;originRequestUrl=https%3A%2F%2Fnumfocus-org.zoom.us%2Frec%2Fshare%2FLeWTcIRjp8Sg3SPQCy0VH3IyLm67Qqw8LPSNumApl2GBolqPVdy0GEjgWhafg7nN.MdI23PW1JQzBI3MG"&gt;the
recording&lt;/a&gt;
(passcode is &lt;code&gt;NFtownhall2024-12-02&lt;/code&gt; )&lt;/p&gt;
&lt;p&gt;These are Leah Silen's quotes from the Town Hall:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Boy. This has been so much more of a challenge than we ever could imagine.
this, as soon we had the bank account. Everything set up, we decided to go the
Volunteer Association in France that was established over 2 years ago.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then mentions difficulties in getting an accountant and a bank account set up...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We're also looking at other countries now to move forward. The other country
we initially had thought about setting up a organization a branch in the
Netherlands, and we are. We've got all our documentation about halfway
finished with that. "&lt;/p&gt;
&lt;p&gt;3 people working on this right now. So I think. I think Miriam reached out to
like something crazy like 17 accounting. And financial firms in France, mostly
in Paris. And literally, yeah. Haven't gotten a response back. So we're
working on it. And if this doesn't work, we're we're not gonna yeah, we need
to pivot and come up with a different plan&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is where things stand 9 years later.&lt;/p&gt;
&lt;p&gt;Actually, turns out there's even been a bit more progress. A current board
member, Sylvain Corlay, who joined the board in 2018, provided some more context
in an email to me on March 1st:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When I joined the board, I was really keen on pushing forward the subject of
building the organization in Europe - however there was a lot of resistance in
the beginning about it on the NumFOCUS board...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Momentum was lost for personal, professional, and later pandemic reasons.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So we had lost the initial energy to get this done. We are back on pushing
this subject because having EU-based operations would be very beneficial at
many levels for NumFOCUS.&lt;/p&gt;
&lt;p&gt;An unforeseen challenge arose when we discovered that non-EU individuals
cannot have admin access to French bank accounts. To address this, we have
partnered with a bank that grants both myself and Didrik[&lt;sup id="fnref:Pinte"&gt;&lt;a class="footnote-ref" href="#fn:Pinte"&gt;4&lt;/a&gt;&lt;/sup&gt;] administrative
access, while US-based individuals have "accountant access" to view all
transactions.&lt;/p&gt;
&lt;p&gt;In our search for an accounting firm, I initially hoped to engage the same
firm that QuantStack uses. However they declined because they did not work
with nonprofits. (Typically, voluntary associations do not employ accounting
firms). NumFOCUS staff reached out to multiple accounting firms without
success. However, in the meantime, we managed to get the accounting firm that
we use for QuantStack to agree to take this on, and to give NumFOCUS a hefty
discount on their rates. So we are now moving forward&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So there's some progress here, and that's good news. It's too bad that there's
no way for anyone to know this, because &lt;a href="https://github.com/numfocus/TownHallCommunityFeedback/issues/4"&gt;the board has not released meeting
minutes for the past 11
months&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="elections"&gt;&lt;a href="#elections"&gt;Elections&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After I made my post following the Town Hall, Leah Silen reached out to me to
talk about my concerns, but I had not yet synthesized my thoughts. In my reply to
her I decided to focus on just the elections, expressed interest in the Election
Committee, and asked about how many seats will be getting filled, and based on
Leah's reply, the plan was that there would be four seats.&lt;/p&gt;
&lt;p&gt;&lt;a name="term-limits" /&gt;&lt;/p&gt;
&lt;h3 id="term-limits-what-are-they-good-for-absolutely-nothing-say-it-again"&gt;&lt;a href="#term-limits"&gt;Term limits &amp;mdash; what are they good for? Absolutely nothing. Say it again.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I followed up, wondering if the intent was to have the board shrinking to seven
member, as I believe Logan Kilpatrick, Rosie Pongracz, and Larry Gray are the
only board members who are not over their term limit, or are some board members
who are over their term limit intending to stay on the board longer.&lt;/p&gt;
&lt;p&gt;Leah replied&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Because Katrina and James are officers, their terms are ending in July. We
wanted to give the 4 new members who will be elected as soon as possible an
opportunity to take advantage of their organizational knowledge and not
have a majority of the board brand new at one time. We'll be holding
another election in Q3 to fill these slots and fill any others required to
move to the two-board structure - Technical and Administrative Boards.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;How could Katrina Riehl and James Powell terms be ending in July if they are
both over the term limit for serving on the board? They both began serving their
terms in October 2018 [&lt;sup id="fnref:2018-board"&gt;&lt;a class="footnote-ref" href="#fn:2018-board"&gt;5&lt;/a&gt;&lt;/sup&gt;] , each term lasts 2 years, and there's a
possibility of renewal for an additional term, so 4 years later - back in 2022,
should have been when their board tenure ended.&lt;/p&gt;
&lt;p&gt;I understand the appeal of this approach, it's a "nice to have" for
institutional knowledge to be passed on with overlapping board transition.
Abiding by the bylaws of the organization, however, should be "non-negotiable".
What does it say about the integrity or priorities of an organization that is
willing to allow board members to continue to serve on the board, in violation
of &lt;a href="https://numfocus.org/wp-content/uploads/2020/04/NumFOCUS-Bylaws-Approved-16-May-2019.pdf"&gt;its own bylaws&lt;/a&gt;?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Each director shall hold office for a two year term with an option to renew
for an additional
two year term, for which he or she is elected and until his or her successor
shall have been elected and qualified or until his or her earlier resignation,
removal or death.
&lt;div style="float: right"&gt;&lt;a href="https://numfocus.org/wp-content/uploads/2020/04/NumFOCUS-Bylaws-Approved-16-May-2019.pdf"&gt;&amp;mdash; Article 3: Directors; Section 5: Election and Term of Office&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I am opposed to this plan, and find it problematic. A possible resolution would
be to have current board members who are over the term limit, but are wishing to
continue to serve NumFOCUS to do so by joining the Advisory Council.&lt;/p&gt;
&lt;p&gt;Article 5 Section 2 of the &lt;a href="https://numfocus.org/wp-content/uploads/2020/04/NumFOCUS-Bylaws-Approved-16-May-2019.pdf"&gt;NumFOCUS
bylaws&lt;/a&gt;
state that&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Board of Directors may, by resolution, establish a council of advisors
(the “Advisory Council”) to be comprised of one or more individuals chosen
by the Board of Directors at its sole discretion. The Board of Directors
shall not be bound by any advice or decision of the Advisory Council. The
members of the Advisory Council shall not have the rights or privileges of
directors as set forth in these bylaws and shall have no power or authority
over the operation of this corporation. A member of the Advisory Council
may be removed at any time by the Board of Directors with or without cause.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="election-committee"&gt;&lt;a href="#election-committee"&gt;Election committee&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There's a small and seemingly shrinking set of volunteers who stepped up to help
with the coming election. This &lt;a href="https://github.com/numfocus/elections"&gt;github
repository&lt;/a&gt; has a link to
the &lt;a href="https://docs.google.com/document/d/1zEYZfbOug2xMzvKTQ-1txtrgj-5-FOslle7Dd2RBzOM/edit#heading=h.lb4hte78frnp"&gt;meeting
minutes&lt;/a&gt;,
and the &lt;a href="https://github.com/numfocus/elections/issues"&gt;issues&lt;/a&gt; contain
discussion of what's being worked on.&lt;/p&gt;
&lt;p&gt;In some way, this whole post, and specifically this &lt;a href="#elections"&gt;Elections&lt;/a&gt; portion of it,
is among my contributions to &lt;a href="https://github.com/numfocus/elections/issues/5"&gt;Issue #5: communicate context to
community&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of the reasons the elections committee is shrinking [&lt;sup id="fnref:chair-resignation"&gt;&lt;a class="footnote-ref" href="#fn:chair-resignation"&gt;6&lt;/a&gt;&lt;/sup&gt;] and having trouble
making progress is because of a moving of goal posts. I guess I haven't spoken
to other members of the elections committee about this, but that is one of the
reasons I'm having a difficult time trying to engage on the elections front. As
a concrete example, at the third meeting of the Election Committee (March 18th),
Leah informed us that there would be seven seats in the upcoming election,
instead of four, because the Board and Executive Director decided to move up the
previous plan to split the board into administrative and technical boards to
this upcoming election. I asked if the bylaws have been changed, and was told
that they will be. But there's no way for anyone to know this, because &lt;a href="https://github.com/numfocus/TownHallCommunityFeedback/issues/4"&gt;the
board has not released meeting minutes for the past 11
months&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="previous-election-non-transparency"&gt;&lt;a href="#2018-election"&gt;Previous "Election" non-transparency&lt;/a&gt; &lt;a name="2018-election" /&gt;&lt;/h3&gt;
&lt;p&gt;In May 2014, there was &lt;a href="https://web.archive.org/web/20150906135054/http://numfocus.org/news/2014/05/12/numfocus-elections-2014/"&gt;a post from Andy
Terrel&lt;/a&gt;
describing that&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The current board was elected without terms kept in mind. While we love all
our board members, we realize that a rotating board has many advantages. Going
forward we would like to have yearly elections with each board member elected
to a two year term. By alternating between half the board being elected each
year, we will have a fair amount of overlap to keep the day to day affairs in
order. Board members will not be limited to a specific number of terms.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At some point, the "half the board being elected each year" idea fell through,
and was revised to allow the board member to renew for a second term without
an election.&lt;/p&gt;
&lt;p&gt;In 2018, there was an announcement of an election for the board.&lt;/p&gt;
&lt;p&gt;I ran for a seat, along with 24 other people, and took a look at the bylaws and
found that it wasn't really an election, because the new board members would be
elected by the current board, per the bylaws. I suggested they change the word
"election" to "endorsement" - because the input the board was seeking from the
community was not actually binding in terms of who would get to be on the board.
That change was accepted by Andy Terrel.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/nf_concerns/endorsement_period.png"&gt;&lt;/p&gt;
&lt;p&gt;I made my suggestion on August 3rd. A blog post from July 20th announcing the
election was edited, such that &lt;a href="https://numfocus.org/blog/numfocus-to-hold-2018-elections-for-board-of-directors"&gt;it appears now that this was always called an
endorsement&lt;/a&gt;,
but that change could not have been made until at the earliest the very last day
of the Nomination period. Andy &lt;a href="https://numfocus.org/blog/2018-board-of-directors-selection-process-challenges"&gt;acknowledges after the board is selected&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In hindsight, we should not have used the word “&lt;strong&gt;election&lt;/strong&gt;” anywhere, as many
 assume that the candidates with the highest vote counts will automatically be
 selected. We needed to apply a selection step in the process to ensure the
 resulting board had diversity, members willing to serve as officers, and the
 right mix of background and expertise to lead a rapidly growing non-profit
 organization.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;a href="https://numfocus.github.io/numfocus-board/2018/20180712/"&gt;July 12, 2018 NF board meetings&lt;/a&gt; include the following plan for the election&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;ul&gt;&lt;li&gt;Election process?
&lt;ol&gt;&lt;li&gt;Nomination process; any member can nominate.&lt;/li&gt;
&lt;li&gt;Voting by all members in leadership positions → to be defined in detail, e.g. 5 hours a month of community work.&lt;/li&gt;
&lt;li&gt;Consensus ratification (can include possible adaptation for diversity, community representation, etc.)&lt;/li&gt; &lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Come back to this process by email. Nomination email end next week. Target voting date: end of August, one month before Summit.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But then the board, in announcing "election" results only said who was added to
the board, and not the results of that endorsement (née election).&lt;/p&gt;
&lt;p&gt;What &lt;a href="https://numfocus.org/blog/2018-numfocus-board-selection-results"&gt;they did
announce&lt;/a&gt; was
that "212 out of 763 eligible donating and volunteering members submitted
endorsements", and that of the 25 candidates, &lt;em&gt;twelve&lt;/em&gt; received more than an
arbitrary 5% of the vote, which made the board deem them as "finalists", and five
new board members were selected from among these finalists.&lt;/p&gt;
&lt;p&gt;I tried to cajole board members (both then current, and then incoming) to
release this data to the public, and though some were sympathetic, they as a
body did not budge and kept it under wraps and out of scrutiny.&lt;/p&gt;
&lt;p&gt;Here are some excerpts of me trying to convince board members to release the
voting totals in 2018.&lt;/p&gt;
&lt;p&gt;From an email thread with then board member Andy Terrel:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think the trouble with the current outcome is it's completely opaque: it
feels like a backroom deal.&lt;/p&gt;
&lt;p&gt;I assert that any reason behind not releasing the numbers should be outweighed
by the benefit of being transparent and honest about what happened. This
applies equally in terms of reflecting community input, and in terms of being
able to see if and how the board incorporated that information into their
decision making process.&lt;/p&gt;
&lt;p&gt;The board made some decisions, but there is no way to evaluate, scrutinize, or
analyze that decision due to the absence of information. It may be
uncomfortable that a prominent member of the community received too few, it
may be uncomfortable that the someone with a wide level of community support
was "passed over" for a board position for someone with less support. But
whatever the realities are, they are just that: real. And we can have
uncomfortable conversations if need be, or change the process for the future,
but let's not sweep it under the rug. The current optics of the situation are
that the board feels it knows what's best, made some difficult decisions, but
does not wish to have any oversight or accountability for those decisions.&lt;/p&gt;
&lt;p&gt;I'm very glad you wrote up the post &lt;a href="https://numfocus.org/blog/2018-board-of-directors-selection-process-challenges"&gt;reflecting the
challenges&lt;/a&gt;
with this process, this is a good thing and let's not stop there. Whatever
challenges we have, we can only face them if we are honest about them. As
Supreme Court Justice Louis Brandeis wrote over a hundred years ago: "Sunlight
is said to be the best of disinfectants."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;From email thread with then board member Lorena Barba:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I disagree that I am seeking answers where there are none. I am seeking
transparency and clarity for what that broad-brush fuzzy indication of
endorsement actually looked like. I do not think it is appropriate to keep the
community in the dark about the actual totals.&lt;/p&gt;
&lt;p&gt;I am not seeking justification for the board that was selected. Nor am I seeking
to challenge it in any way. It already &lt;a href="https://numfocus.org/blog/2018-board-of-directors-selection-process-challenges"&gt;has been
acknowledged&lt;/a&gt;
that the process had its challenges and could be improved in the future, but
those of us out of the loop cannot help improve it without understanding the
facts about how it went.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;From email explaining to Matplotlib lead developer Tom Caswell what likely transpired:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;according to the minutes from August 27th - the advisory council provided 5
candidates recommended for positions on the board, and one to be added to the
advisory council. The Board met and did just that on the 29th:
&lt;a href="https://numfocus.github.io/numfocus-board/2018/20180827/"&gt;https://numfocus.github.io/numfocus-board/2018/20180827/&lt;/a&gt;
But the advisory council also recommended that the vote totals be released,
and were left with the impression that they would be. That's where things
stood until the board met to do the selection. I'm inferring that since Peter
Wang was the one proposed to be added to the board, it is most likely him that
has a high number of votes that was passed over for a board position. I don't
know why that is, but I do know it's not healthy to sweep that under the rug.
I can speculate it may have something to do with the fact that Peter is still
CTO of Continuum (Anaconda) while Travis is no longer there. It might also be
the fact that Peter did not put any effort into his candidacy explanation
paragraph. Who knows, but the point is that the Advisory board made the
recommendation that I can only assume was followed but without following the
numbers disclosure aspect. Uncomfortable though it may be, when there are so
many doubts looming over an organization, not releasing those numbers and
being tight lipped about it does further damage. Trust is being eroded.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So that was how the election went down in 2018.&lt;/p&gt;
&lt;h3 id="resignations"&gt;&lt;a href="#resignations"&gt;Resignations&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;All organizations evolve, and board membership changes are expected. But you
might be surprised to learn that two NumFOCUS board members resigned last year.
It's true, Noa Tamir and Stéfan van der Walt resigned, I think in October. I'd
point you to the board meeting minutes that documents this, to make sure I had
it right, but &lt;a href="https://github.com/numfocus/TownHallCommunityFeedback/issues/4"&gt;the board has not released meeting minutes for the past 11
months&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;Those two weren't the only ones who've resigned in the past. Here is what some
of the former board members had to say about their decision to step down.&lt;/p&gt;
&lt;p&gt;One former board member explained :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I resigned, and what it came down to was that I could not put the time or
emotional energy into working to make NumFOCUS the organization I wanted it to
be, instead of the organization that it was...
The conflict in NumFOCUS between what I wanted (which is hard to narrow down,
but I guess could come back to the idea of the student researcher being a key
audience) and what would eventually make NumFOCUS more engaged with the
communities with which it was already familiar (i.e., "data science,"
industry, etc) was getting harder to navigate.  ... So when I resigned, it
was because I was overwhelmed and not able to put in the effort that I wanted
to -- but the reason I felt like I had to put in so much effort was because I
felt like the organization was slipping further and further from what I wanted
to see as its core mission.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Another former board member wrote that :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When I was on the board, I and others talked with many people who we thought
had any kind of power to change things, and nothing changed. So this is not
the first time, or probably even the second.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And when we video chatted added:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I left the board because I couldn't affect change.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A third former board member wrote me that part of the reason for their resignation
was that :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I and others on the board had grave concerns about performance, but that no
one seemed to be held accountable for that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a name="nf-alternatives"/&gt;&lt;/p&gt;
&lt;h2 id="paths-forward-and-alternatives-to-numfocus"&gt;&lt;a href="#nf-alternatives"&gt;Paths forward and alternatives to NumFOCUS&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My operating plan for making this post was to try to capture the various
NumFOCUS transgressions as a way to illustrate why staying there is unlikely to
work, given how many years and board members have churned through there, all
while keeping the same executive director. Or that staying with NF will require
a great deal of energy to keep the experience for individuals and projects
from going sideways further. But a concern I have is that, aside
from caring about the scientific-adjacent open source community, I don't
actually have a need for an alternative to NumFOCUS to exist. I do not have
any grants and no plans to apply for grants, so I worry about trying to put
in a bunch of effort to stand something up while the people who actually
have the grants figure out a better alternative for themselves (or just bite
the bullet and stay with NF).&lt;/p&gt;
&lt;p&gt;In responding to my email Rob Landley included this piece of wisdom:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anyway, you don't "fix" stuff like this, the tree falls and a new tree grows in
its place from a sprout&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are those who think that trying to reform NumFOCUS is a lost cause.
 Here's someone who's given up on trying to influence NumFOCUS, but also
saying that it would be too much effort to create a new nonprofit.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NumFOCUS was founded to serve the needs of this community. I don't think many
of us have the appetite of going through that process again, and there are
options.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://jupyter.org/governance/linux-proposal.html"&gt;Jupyter has proposed departing NumFOCUS to transition to The Linux
  Foundation&lt;/a&gt; for its fiscal
  sponsorship. Though I focused on LF being a 501c6 in the &lt;a href="#linux-foundation-voltron-of-bureaucracy"&gt;Linux Foundation:
  Voltron of Bureaucracy&lt;/a&gt; section
  above, turns out they also &lt;a href="https://projects.propublica.org/nonprofits/organizations/460503801/202133169349304378/IRS990ScheduleR"&gt;own and operate two 501c3
  foundations&lt;/a&gt;:
  The Linux Kernel Organization and LF Charities. The latter is the one Jupyter
  proposes transferring to, though Jupyter also proposes forming a Jupyter
  Foundation 501c6. I have not participated in developing this proposal, it was
  researched and proposed by the Jupyter Executive Council.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some projects are looking into the &lt;a href="https://www.oscollective.org/"&gt;Open Source Collective&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There's also &lt;a href="https://www.codeforsociety.org/"&gt;Code for Science and Society&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some of the people who asses a low probability of success for a NumFOCUS
turnaround nevertheless also think that a more responsive NumFOCUS would be the
best outcome.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;You can join the discussion on
&lt;a href="https://www.linkedin.com/posts/paulivanov_numfocus-concerns-activity-7186907078387535873-tB3T"&gt;LinkedIn&lt;/a&gt;,
&lt;a href="https://mastodon.sdf.org/@ivanov/112295425103723212"&gt;Mastodon&lt;/a&gt;,
&lt;a href="https://twitter.com/ivanov/status/1781141199778415016"&gt;Twitter&lt;/a&gt; (most of the responses are on the
&lt;a href="https://www.linkedin.com/posts/paulivanov_numfocus-concerns-activity-7186907078387535873-tB3T"&gt;LinkedIn post&lt;/a&gt;).&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:SDG"&gt;
&lt;p&gt;SDG refers to "&lt;a href="https://numfocus.org/programs/small-development-grants"&gt;Small Development Grants&lt;/a&gt;"&amp;#160;&lt;a class="footnote-backref" href="#fnref:SDG" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:initial_foundation_thread"&gt;
&lt;p&gt;The dozen on the "New Foundation Name?" thread in January 2012 were:
Francesc Alted,
Chuck Harris,
Paul Ivanov,
Jonathan March,
Jarrod Millman,
Travis Oliphant,
Fernando Perez,
Ilan Schnell,
Anthony Scopatz,
Andy Terrel,
Peter Wang,
Mark Wiebe&amp;#160;&lt;a class="footnote-backref" href="#fnref:initial_foundation_thread" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:treacherous-action-not-people"&gt;
&lt;p&gt;I was deliberate here to apply the
"treacherous" label to the action, not the people. Some are misinterpreting
my words as "calling the board treacherous" &amp;mdash; I am not. The
distinction is akin to calling some act "irresponsible" without
characterizing the people who err as "irresponsible".&amp;#160;&lt;a class="footnote-backref" href="#fnref:treacherous-action-not-people" title="Jump back to footnote 3 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:Pinte"&gt;
&lt;p&gt;Didrik Pinte is a former NF board member (2012-2019).&amp;#160;&lt;a class="footnote-backref" href="#fnref:Pinte" title="Jump back to footnote 4 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2018-board"&gt;
&lt;p&gt;Along with Sylvain Corlay, Jane Herriman, Stefan van der Walt, &lt;a href="https://numfocus.github.io/numfocus-board/2018/20181011/"&gt;October 11th,
2018&lt;/a&gt; is the first
time Katrina Riehl and James Powell are listed in the minutes as board members.&amp;#160;&lt;a class="footnote-backref" href="#fnref:2018-board" title="Jump back to footnote 5 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:chair-resignation"&gt;
&lt;p&gt;I referred here to the fact that fewer people were
attending each subsequent meeting and also fewer people were engaging with
the committee's work asynchronously. But also it so happened that the next
day after I originally made this post, &lt;a href="https://github.com/numfocus/elections/issues/9"&gt;the chair of our committee announced
he is stepping away from the effort and provides a
postmortem&lt;/a&gt;&amp;#160;&lt;a class="footnote-backref" href="#fnref:chair-resignation" title="Jump back to footnote 6 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="technology"></category><category term="numfocus"></category><category term="governance"></category><category term="science"></category><category term="python"></category><category term="jupyter"></category></entry><entry><title>Money and California Propositions (2020)</title><link href="//pirsquared.org/blog/ca-props2020.html" rel="alternate"></link><published>2020-10-29T00:00:00-07:00</published><updated>2020-10-29T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2020-10-29:/blog/ca-props2020.html</id><content type="html">&lt;p&gt;Ten years ago, I made &lt;a href="//pirsquared.org/blog/ca-prop.html"&gt;some plots for how much money was contributed to and spent by the various proposition campaigns in California&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I decided to update these for this election, and here's the result:&lt;/p&gt;
&lt;!--
&lt;a href="#nov2020v-zoom" class="thumb-link" name="nov2020v" &gt;
&lt;img alt="Money Raised for CA Propositions November 2020 Election. Visualization by Paul Ivanov"
title="Money Raised for CA Propositions November 2020 Election. Visualization by Paul Ivanov"
src="//pirsquared.org/images/CA-props/CA-Props-Nov2020-Contributions-Subplots.png"&gt;
&lt;/a&gt;
&lt;a href="#nov2020v" class="lightbox" name="nov2020v-zoom" &gt;
--&gt;

&lt;p&gt;&lt;img alt="Money Raised for CA Propositions November 2020 Election. Visualization by Paul Ivanov"
title="Money Raised for CA Propositions November 2020 Election. Visualization by Paul Ivanov"
src="//pirsquared.org/images/CA-props/CA-Props-Nov2020-Contributions-Subplots.png"
width=100%&gt;&lt;/p&gt;
&lt;!-- &lt;/a&gt;
--&gt;

&lt;p&gt;Just in case you didn't get the full picture, here is the same data plotted on a common scale:&lt;/p&gt;
&lt;p&gt;&lt;a href="#nov2020-zoom" class="thumb-link" name="nov2020" &gt;
&lt;img alt="Money Raised for CA Propositions November 2020 Election shown with a common scale. Visualization by Paul Ivanov"
title="Money Raised for CA Propositions November 2020 Election shown with a common scale. Visualization by Paul Ivanov"
src="//pirsquared.org/images/CA-props/CA-Props-Nov2020-Contributions.png"
width=100%&gt;
&lt;/a&gt;
&lt;a href="#nov2020" class="lightbox" name="nov2020-zoom" &gt;
&lt;img alt="Money Raised for CA Propositions November 2020 Election shown with a common scale. Visualization by Paul Ivanov"
title="Money Raised for CA Propositions November 2020 Election shown with a common scale. Visualization by Paul Ivanov"
src="//pirsquared.org/images/CA-props/CA-Props-Nov2020-Contributions.png" &gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, whereas 10 years ago, we had a total of ~$58 million on the election, the
overwhelming amount of in support, this time, we had ~$662 million, an 11 fold increase!&lt;/p&gt;
&lt;p&gt;The Cal-Access &lt;a href="//cal-access.sos.ca.gov/Campaign/Measures/"&gt;Campaign Finance Activity: Propositions &amp;amp; Ballot Measures&lt;/a&gt; source I used last time was still there, but there are way more propositions this time (12 vs 5), and the money details are broken out by committee, with some propositions have a dozen committees. Another wrinkle is that website has protected by some fancy scraping protection. I could browse it just fine in Firefox, even with Javascript turned off, but couldn't download it using wget, curl, or python, even after setting up &lt;em&gt;all&lt;/em&gt; of the same headers, not just the User-Agent one. I would just get something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;META&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;NAME=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;robots&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;CONTENT=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;noindex,nofollow&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&lt;/span&gt;
&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/_Incapsula_Resource?SWJIYLWA=5074a744e2e3d891814e9a2dace20bd4,719d34d31c8e3a6e6fffd425f7e032f3&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;or this&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;height:100%&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;head&amp;gt;&amp;lt;META&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;NAME=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ROBOTS&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;CONTENT=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;NOINDEX,&lt;/span&gt;
&lt;span class="s"&gt;NOFOLLOW&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;meta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;format-detection&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;telephone=no&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;meta&lt;/span&gt;
&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;viewport&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;initial-scale=1.0&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;meta&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;X-UA-Compatible&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;IE=edge,chrome=1&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;margin:0px;height:100%&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;iframe&lt;/span&gt;
&lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;main-iframe&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/_Incapsula_Resource?SWUDNSAI=9&amp;amp;xinfo=7-5676648-0%200NNN%20RT%281603990408902%200%29%20q%280%20-1%20-1%20-1%29%20r%280%20-1%29%20B12%284%2c316%2c0%29%20U19&amp;amp;incident_id=258000270014056206-28484364857902791&amp;amp;edet=12&amp;amp;cinfo=04000000&amp;amp;rpinfo=0&amp;amp;cts=P7QQVpGir0pkf9hcyxbNqBbXI4e5zF975eQFSdodvpp8NdgYKJeqrlW3TSO8Zzh5&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;frameborder=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;100%&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;marginheight=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;0px&amp;quot;&lt;/span&gt;
&lt;span class="na"&gt;marginwidth=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;0px&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Request&lt;span class="w"&gt; &lt;/span&gt;unsuccessful.&lt;span class="w"&gt; &lt;/span&gt;Incapsula&lt;span class="w"&gt; &lt;/span&gt;incident&lt;span class="w"&gt; &lt;/span&gt;ID:
258000270014056206-28484364857902791&lt;span class="nt"&gt;&amp;lt;/iframe&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Luckily, while I was working on the scraper, I took a break and found &lt;a href="https://www.sos.ca.gov/campaign-lobbying/cal-access-resources/measure-contributions/2020-ballot-measure-contribution-totals"&gt;another
source that already has the tabulations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The only catch is that this source was last updated two weeks ago, so it's not
the freshest data. Also, last time I had data for both contributions and for
money spent, but this summed page only has contribution totals, not spending
totals (the spending figures are still there)&lt;/p&gt;
&lt;p&gt;But I figured it's good enough to get the big picture.&lt;/p&gt;
&lt;p&gt;Also, here's the python code used to generate these plots (largely reused from
last time, so don't expect it to be pretty).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Create contributions  bar charts of committees supporting and opposing&lt;/span&gt;
&lt;span class="c1"&gt;# various propositions on the California Ballot for November 2020&lt;/span&gt;
&lt;span class="c1"&gt;# created by Paul Ivanov (https://pirsquared.org)&lt;/span&gt;

&lt;span class="c1"&gt;# figure(0) - Contributions by Proposition (as subplots)&lt;/span&gt;
&lt;span class="c1"&gt;# figure(2) - Contributions on a common scale&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;matplotlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;locale&lt;/span&gt;

&lt;span class="c1"&gt;# fun times! without this next line, I got a&lt;/span&gt;
&lt;span class="c1"&gt;# ValueError: Currency formatting is not possible using the &amp;#39;C&amp;#39; locale.&lt;/span&gt;
&lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setlocale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LC_ALL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;en_US.UTF-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;elec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Nov2020&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;election&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="s2"&gt;&amp;quot;November 2020 Election&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# This part was done by hand by collecting data from CalAccess:&lt;/span&gt;
&lt;span class="c1"&gt;# https://www.sos.ca.gov/campaign-lobbying/cal-access-resources/measure-contributions/&lt;/span&gt;
&lt;span class="c1"&gt;# proposition: (yes, no) &lt;/span&gt;
&lt;span class="n"&gt;cont&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;14&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12810328&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
        &lt;span class="s1"&gt;&amp;#39;15&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;56320926&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60905901&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
        &lt;span class="s1"&gt;&amp;#39;16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;19926905&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1172614&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;17&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1363887&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
        &lt;span class="s1"&gt;&amp;#39;18&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;835064&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
        &lt;span class="s1"&gt;&amp;#39;19&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;37794775&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;45050&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
        &lt;span class="s1"&gt;&amp;#39;20&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4829677&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20471086&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
        &lt;span class="s1"&gt;&amp;#39;21&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40184953&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;59379159&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
        &lt;span class="s1"&gt;&amp;#39;22&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;188937777&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15896808&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
        &lt;span class="s1"&gt;&amp;#39;23&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6917438&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;104405156&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
        &lt;span class="s1"&gt;&amp;#39;24&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5907002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48368&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;25&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;13446871&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10181122&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;The two args are the value and tick position&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$0&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;1e3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;$&lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;1e6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;$&lt;/span&gt;&lt;span class="si"&gt;%1.0f&lt;/span&gt;&lt;span class="s1"&gt;K&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;1e-3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;$&lt;/span&gt;&lt;span class="si"&gt;%1.0f&lt;/span&gt;&lt;span class="s1"&gt;M&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;1e-6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.ticker&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FuncFormatter&lt;/span&gt;
&lt;span class="n"&gt;formatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FuncFormatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;yes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mf"&gt;6.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;blue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# color for yes/no stance&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;red&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;blue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# color for yes/no stance&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;blue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# color for yes/no stance&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;             &lt;span class="c1"&gt;# alpha for yes/no stance&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;             &lt;span class="c1"&gt;# alpha for yes/no stance&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Yes&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;No &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;       &lt;span class="c1"&gt;# text  for yes/no stance&lt;/span&gt;

&lt;span class="n"&gt;raised&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;spent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Contributed to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Spent on&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# reuse code by injecting title specifics&lt;/span&gt;
&lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Contributions&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Expenditures&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;footer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;Total &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; 1/1/2020-10/14/2020  (1/1/2020-10/16/2020 for Prop 15)&lt;/span&gt;
&lt;span class="s2"&gt;Data from http://www.sos.ca.gov/campaign-lobbying/cal-access-resources/&lt;/span&gt;
&lt;span class="s2"&gt;measure-contributions/2020-ballot-measure-contribution-totals &lt;/span&gt;
&lt;span class="s2"&gt;cc-by Paul Ivanov (https://pirsquared.org)&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="c1"&gt;# will inject field[col] in all plots&lt;/span&gt;

&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mf"&gt;.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.54&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;.9&lt;/span&gt; &lt;span class="c1"&gt;# spine/ticklabel color&lt;/span&gt;
&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mf"&gt;.52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.12&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# spine/ticklabel color&lt;/span&gt;
&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mf"&gt;.82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.12&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# spine/ticklabel color&lt;/span&gt;
&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;gray&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mf"&gt;85.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;107&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="c1"&gt;# darkolivegreen&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;savefig.dpi&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fixup_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot; Tufte-fy the axis labels - use different color than data&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;spines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="c1"&gt;# liberate the data! hide right and top spines&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;top&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;right&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_left&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# don&amp;#39;t tick on the right&lt;/span&gt;

    &lt;span class="c1"&gt;# there&amp;#39;s gotta be a better way to set all of these colors, but I don&amp;#39;t&lt;/span&gt;
    &lt;span class="c1"&gt;# know that way, I only know the hard way&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_ticklines&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_ticklines&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_ticklabels&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_ticklabels&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;major&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;linestyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;adjust_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bottom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.052&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hspace&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.646815834767644&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;left&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.13732508948909858&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;right&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.92971038073543777&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;top&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.94082616179001742&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wspace&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.084337349397590383&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# subplots for each proposition (Fig 0 and Fig 1)&lt;/span&gt;
&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; 
&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clf&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dpi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;#p = i+14    #prop number&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;stance&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;align&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grouping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lbl&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# drop the cents, since we&amp;#39;ve rounded&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ticks&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ticklabels&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Yes on &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;No on &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="c1"&gt;# put a big (but faded) &amp;quot;Proposition X&amp;quot; in the center of this subplot&lt;/span&gt;
    &lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;k&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transAxes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Proposition&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_major_formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# plugin our currency labeler&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_major_locator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_nbins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;# put fewer tickmarks/labels&lt;/span&gt;

    &lt;span class="n"&gt;fixup_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;adjust_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.13732508948909858&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.92971038073543777&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots_adjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;adjust_dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Figure title, subtitle&lt;/span&gt;
&lt;span class="n"&gt;extra_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;serif&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;top&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transFigure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Money &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; CA Propositions&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.975&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;election&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#footer&lt;/span&gt;
&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bottom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;footer&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_figheight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;20.&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_figwidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CA-Props-&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;-&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;-Subplots.png&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="c1"&gt;# all props on one figure (Fig 2 and Fig 3)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clf&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;adjust_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.045&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.98&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bottom&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots_adjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;adjust_dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_figheight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;6.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_figwidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;extra_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;serif&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;top&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transFigure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Money &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; CA Propositions&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;election&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;footer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;footer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#.replace(&amp;quot;\nc&amp;quot;, &amp;quot;c&amp;quot;)&lt;/span&gt;
&lt;span class="c1"&gt;#footer = footer.replace(&amp;quot;\n&amp;quot;, &amp;quot;&amp;quot;) + &amp;quot;\n&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bottom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#f.text(adjust_dict[&amp;#39;left&amp;#39;],0.0,footer%field[col], **extra_args)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;footer&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;stance&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;abscissa&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;.30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;()])&lt;/span&gt;
    &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lbl&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# drop the cents, since we&amp;#39;ve rounded&lt;/span&gt;
    &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; Total &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;lbl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abscissa&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;align&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lbl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grouping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lbl&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# drop the cents, since we&amp;#39;ve rounded&lt;/span&gt;
        &lt;span class="c1"&gt;#ha = &amp;#39;center&amp;#39; if i != 2 else &amp;quot;right&amp;quot; # tweek by hand to make numbers show up&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abscissa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;center&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xmin&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ticks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ticklabels&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Prop &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;fixup_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# plt.legend(prop=dict(family=&amp;#39;monospace&amp;#39;,size=9)) # this makes legend tied&lt;/span&gt;
&lt;span class="c1"&gt;# to the subplot, tie it to the figure, instead&lt;/span&gt;
&lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_legend_handles_labels&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figlegend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;upper right&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;monospace&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_frame&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_major_formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# plugin our currency labeler&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CA-Props-&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;-&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;.png&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="democracy"></category><category term="python"></category><category term="visualization"></category><category term="greens"></category><category term="money"></category><category term="election"></category></entry><entry><title>aka: also known as</title><link href="//pirsquared.org/blog/aka.html" rel="alternate"></link><published>2020-10-08T00:00:00-07:00</published><updated>2020-10-08T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2020-10-08:/blog/aka.html</id><content type="html">&lt;p&gt;I was chatting with Anthony Scopatz last week, and one of the things we covered
was how it'd be cool to have a subcommand launcher, kind of like &lt;code&gt;git&lt;/code&gt;, where
the subcommands were swappable. If you're not familiar, &lt;code&gt;git&lt;/code&gt; automatically
calls out to &lt;code&gt;git-something&lt;/code&gt; (note the dash) whenever you run &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;something
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and &lt;code&gt;something&lt;/code&gt; is not one of the builtin git commands. For me, &lt;code&gt;~/bin&lt;/code&gt; is in my &lt;code&gt;PATH&lt;/code&gt;, so &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;lost
git:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lost&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;command.&lt;span class="w"&gt; &lt;/span&gt;See&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;git --help&amp;#39;&lt;/span&gt;.
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;echo how rude!&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/bin/git-lost&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;+x&lt;span class="w"&gt; &lt;/span&gt;~/bin/git-lost
$&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;lost
how&lt;span class="w"&gt; &lt;/span&gt;rude!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And so what Anthony was talking about was having two commands that are supposed
to do the same thing, and being able to switch between them. For example: maybe
we have &lt;code&gt;git-away&lt;/code&gt; and &lt;code&gt;git-gone&lt;/code&gt; and both
of them perform a similar function, and we wish call our preferred one when we run &lt;code&gt;git lost&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;One way to do this would be to copy or symlink our chosen version as &lt;code&gt;git-lost&lt;/code&gt;,
and replace that file whenever we wanted to switch between &lt;code&gt;git-away&lt;/code&gt; and
&lt;code&gt;git-gone&lt;/code&gt;. Another would be to rename both as &lt;code&gt;git-lost&lt;/code&gt; and store them in
different folders, adjusting our &lt;code&gt;PATH&lt;/code&gt; variable so the preferred version of
&lt;code&gt;git-lost&lt;/code&gt; would get called.&lt;/p&gt;
&lt;p&gt;Now with &lt;code&gt;git&lt;/code&gt; itself, you can do this by making a git alias. Here are some of
my frequently used aliases from my &lt;code&gt;~/.gitconfig&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[alias]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;diffw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;diff --word-diff=color --ignore-cr-at-eol&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;rev-parse --show-toplevel&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;lgo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;log&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;lazy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;commit -a -m.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;git diffw&lt;/code&gt; will highlight only parts of the line that were added and removed,
instead of whole lines
&lt;br&gt;
&lt;code&gt;git root&lt;/code&gt; prints the top-most directory of the current
git repository
&lt;br&gt;
&lt;code&gt;git lgo&lt;/code&gt; is a typo for &lt;code&gt;git log&lt;/code&gt; (I also have several versions
of &lt;code&gt;checkout&lt;/code&gt; typos)
&lt;br&gt;
&lt;code&gt;git lazy&lt;/code&gt; is for those frequent times when having to think of a commit message
is too onerous.&lt;/p&gt;
&lt;p&gt;So we would add &lt;code&gt;lost=away&lt;/code&gt; to our alias block to have &lt;code&gt;git lost&lt;/code&gt; call
&lt;code&gt;git-away&lt;/code&gt; and change that alias to &lt;code&gt;lost=gone&lt;/code&gt; when we wanted to have
&lt;code&gt;git lost&lt;/code&gt; call &lt;code&gt;git-gone&lt;/code&gt;, instead.&lt;/p&gt;
&lt;p&gt;I wondered what a simple, generic version of such capability might look like
and wrote a short shell script and then a README file that's ten times longer
than the script itself to explain it. :)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;---------------------&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;aka&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;also&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;known&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="o"&gt;/---------------------/&lt;/span&gt;

&lt;span class="nx"&gt;Simple&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;persistent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;based&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;aliasing&lt;/span&gt;

&lt;span class="nx"&gt;Usage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;aka&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;alias&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="nx"&gt;show&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stored&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;aliases&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nx"&gt;aka&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NAME&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CMD&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;an&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CMD&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nx"&gt;aka&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NAME&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CMD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;optionally&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;more&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;By default, aliases are stored in the &lt;code&gt;.aka&lt;/code&gt; file of the current working
directory. Optionally, the location of that file can be modified by setting the
&lt;code&gt;AKA_FILE&lt;/code&gt; environment variable. Tested on Debian, OpenBSD, and OpenWRT, &lt;code&gt;aka&lt;/code&gt;
uses portable shell syntax and should work everywhere that has a typical &lt;code&gt;/bin/sh&lt;/code&gt;&lt;/p&gt;
&lt;h1 id="examples"&gt;Examples:&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;demo&lt;span class="w"&gt; &lt;/span&gt;more

$&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;demo&lt;span class="w"&gt; &lt;/span&gt;--version
more&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;util-linux&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.36

$&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;demo&lt;span class="w"&gt; &lt;/span&gt;git

$&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;demo&lt;span class="w"&gt; &lt;/span&gt;--version
git&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.28.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The command you alias can have parameters&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;l&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-f

$&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;l
.aka&lt;span class="w"&gt; &lt;/span&gt;..&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;aka_tiny&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;README&lt;span class="w"&gt; &lt;/span&gt;.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And you can pass additional parameters&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;l&lt;span class="w"&gt; &lt;/span&gt;-tR
..&lt;span class="w"&gt; &lt;/span&gt;aka_tiny&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;.git&lt;span class="w"&gt; &lt;/span&gt;.aka&lt;span class="w"&gt; &lt;/span&gt;README&lt;span class="w"&gt; &lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can see all of the currently stored aliases&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;
&lt;span class="nv"&gt;l&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ls -f&amp;#39;&lt;/span&gt;
&lt;span class="nv"&gt;demo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;git&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And edit them using your favorite text editor&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;.aka
&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;demo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;git&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;l&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ls -f&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Everything that is not aliased will get executed as a regular command.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;--version
Python&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.8.6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="why-would-anyone-want-this"&gt;Why would anyone want this?&lt;/h2&gt;
&lt;p&gt;A practical use case might be to have&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c_proj&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;└──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aka&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;make install&amp;#39;&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;go_proj&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;└──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aka&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;go run&amp;#39;&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;python_proj&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;└──&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aka&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;pip install .&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now you can &lt;code&gt;aka doit&lt;/code&gt; to your heart's content inside each of those folders, and
have that execute the appropriate build commands for the type of project it is.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;x&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;doit&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;done&lt;/span&gt;
make:&lt;span class="w"&gt; &lt;/span&gt;***&lt;span class="w"&gt; &lt;/span&gt;No&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;make&lt;span class="w"&gt; &lt;/span&gt;target&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;install&amp;#39;&lt;/span&gt;.&lt;span class="w"&gt;  &lt;/span&gt;Stop.
go&lt;span class="w"&gt; &lt;/span&gt;run:&lt;span class="w"&gt; &lt;/span&gt;no&lt;span class="w"&gt; &lt;/span&gt;go&lt;span class="w"&gt; &lt;/span&gt;files&lt;span class="w"&gt; &lt;/span&gt;listed
ERROR:&lt;span class="w"&gt; &lt;/span&gt;Directory&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;installable.&lt;span class="w"&gt; &lt;/span&gt;Neither&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;setup.py&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nor&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;pyproject.toml&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;found.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;Grab &lt;code&gt;aka&lt;/code&gt;, make it executable, and place it somewhere in your path.&lt;/p&gt;
&lt;p&gt;The standard version of aka (~40 lines) that prints usage and has comments
explaining the code is here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://git.sr.ht/~pi/aka/blob/main/aka"&gt;https://git.sr.ht/~pi/aka/blob/main/aka&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you just want the business logic, functional equivalent (~10 lines) is here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://git.sr.ht/~pi/aka/blob/main/aka_tiny"&gt;https://git.sr.ht/~pi/aka/blob/main/aka_tiny&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aka&lt;/code&gt; is a tiny portable shell script that gets executed via &lt;code&gt;/bin/sh&lt;/code&gt;, sources
&lt;code&gt;AKA_FILE&lt;/code&gt; and evals the positional parameters, thus applying aliases and
whatever other shell script shenanigans stored in &lt;code&gt;AKA_FILE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For example, this means that you can put something like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;alias my=&amp;#39;AKA_FILE=~/.my_aliases aka&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;in your shell's startup files, and thereafter use the &lt;code&gt;my&lt;/code&gt; command as an &lt;code&gt;aka&lt;/code&gt;
invocation that always sources &lt;code&gt;~/.my_aliases&lt;/code&gt; file in your home directory,
regardless of where you run it.&lt;/p&gt;
&lt;h2 id="notes"&gt;Notes&lt;/h2&gt;
&lt;p&gt;Initial prototype uses aliases, which may not work for programs that depend on
establishing their behavior based on the &lt;code&gt;argv[0]&lt;/code&gt; name they were called by
(busybox, for example).&lt;/p&gt;
&lt;p&gt;If you want to create aliases that include quotes, multiple commands, output
redirection, or job control, you either have to escape the special characters
like &lt;code&gt;&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;amp;&lt;/code&gt; with backslashes when creating the alias, or edit &lt;code&gt;.aka&lt;/code&gt; file
to add them directly in there:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;redir_example&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;hi&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;log.txt
$&lt;span class="w"&gt; &lt;/span&gt;aka&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;double_date&lt;span class="w"&gt; &lt;/span&gt;date&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;date
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the example above, if we don't put a backslash in front of the semicolon, we
will be terminating our aka alias for &lt;code&gt;double_date&lt;/code&gt; with just one call do &lt;code&gt;date&lt;/code&gt;,
and calling the second &lt;code&gt;date&lt;/code&gt; command immediately.&lt;/p&gt;
&lt;p&gt;And finally, &lt;code&gt;aka&lt;/code&gt; stores the aliases using single quotes, so if you have
commands where you need to preserve single quotes, you should edit the &lt;code&gt;.aka&lt;/code&gt;
file by hand to change the alias definition to use double quotes.&lt;/p&gt;
&lt;h2 id="related-projects"&gt;Related Projects&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://direnv.net"&gt;https://direnv.net&lt;/a&gt;: 
"direnv is an extension for your shell. It augments existing shells with a new
feature that can load and unload environment variables depending on the current
directory." The direnv website has links to a half dozen similar projects.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://manpages.debian.org/stretch/dpkg/update-alternatives.1.en.html"&gt;Debian's update-alternatives&lt;/a&gt;
Debian's alternatives system is similar: it lets you switch out raw &lt;code&gt;XX&lt;/code&gt;
command for &lt;em&gt;all&lt;/em&gt; users, which is why you have to run update-alternatives as
root. With aka, you're defining the &lt;code&gt;aka XX&lt;/code&gt; commands and they only apply on a
per-folder basis (or per &lt;code&gt;AKA_FILE&lt;/code&gt; environment variable, if set).&lt;/p&gt;
&lt;h2 id="license"&gt;License&lt;/h2&gt;
&lt;p&gt;aka is distributed under a 3-clause BSD license.&lt;/p&gt;
&lt;h2 id="author"&gt;Author&lt;/h2&gt;
&lt;p&gt;aka was written by &lt;a href="https://pirsquared.org"&gt;Paul Ivanov&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://sr.ht/~pi/aka"&gt;https://sr.ht/~pi/aka&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="changelog"&gt;Changelog&lt;/h2&gt;
&lt;p&gt;2020-10-02: initial version&lt;/p&gt;
&lt;p&gt;2020-10-03: added &lt;code&gt;AKA_FILE&lt;/code&gt; environment variable&lt;/p&gt;
&lt;p&gt;2020-10-08: publicly announced&lt;/p&gt;
&lt;p&gt;2020-10-28: added notes about multiple commands, redirection, and quotes&lt;/p&gt;
&lt;h2 id="source-code"&gt;Source code&lt;/h2&gt;
&lt;p&gt;Standard ~40 line &lt;code&gt;aka&lt;/code&gt; with comments and usage printing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;# aka, written by Paul Ivanov: https://git.sr.ht/~pi/aka&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-eq&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;-h&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# print usage on 0 arguments&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-ge&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;-h&lt;span class="p"&gt;|&lt;/span&gt;--help&lt;span class="p"&gt;|&lt;/span&gt;-help&lt;span class="p"&gt;|&lt;/span&gt;-H&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Usage: aka alias               show stored aliases&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;       aka alias NAME CMD...   store an alias for CMD&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;       aka NAME [...]          run CMD, optionally with more arguments&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="nv"&gt;aliasFile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AKA_FILE&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;./.aka&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# Is this an alias creation? If so, we should have at least 3 arguments,&lt;/span&gt;
&lt;span class="c1"&gt;# such as:&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# $ aka alias pager more&lt;/span&gt;
&lt;span class="c1"&gt;#    \     \     \    \&lt;/span&gt;
&lt;span class="c1"&gt;#     $0    $1    $2   $3&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-ge&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# cmd=&amp;#39;pager&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# make &amp;#39;more&amp;#39; the new $1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# remove previous aliases for &amp;#39;pager&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;alias &lt;/span&gt;&lt;span class="nv"&gt;$cmd&lt;/span&gt;&lt;span class="s2"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;~
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;alias &lt;/span&gt;&lt;span class="nv"&gt;$cmd&lt;/span&gt;&lt;span class="s2"&gt;=&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;~&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;~&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c1"&gt;# Load up aliases...&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# ...and execute command&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Tiny ~10 line &lt;code&gt;aka&lt;/code&gt; without comments:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;# aka, written by Paul Ivanov: https://git.sr.ht/~pi/aka&lt;/span&gt;
&lt;span class="nv"&gt;aliasFile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AKA_FILE&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;./.aka&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-ge&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;alias &lt;/span&gt;&lt;span class="nv"&gt;$cmd&lt;/span&gt;&lt;span class="s2"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;~
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;alias &lt;/span&gt;&lt;span class="nv"&gt;$cmd&lt;/span&gt;&lt;span class="s2"&gt;=&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;~&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;~&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$aliasFile&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="technology"></category><category term="shell"></category><category term="hello-world"></category><category term="git"></category></entry><entry><title>Lazy River of Curious Content 0</title><link href="//pirsquared.org/blog/lazy-river-0.html" rel="alternate"></link><published>2020-05-17T00:00:00-07:00</published><updated>2020-05-17T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2020-05-17:/blog/lazy-river-0.html</id><content type="html">&lt;p&gt;This is the first post of what I'm calling a &lt;a href="https://en.wikipedia.org/wiki/Lazy_river"&gt;Lazy
River&lt;/a&gt; of Curious Content.
This is a way to review stuff that I've been doing, dealing with, or find
interesting &lt;s&gt;during the week&lt;/s&gt; recently (&lt;em&gt;This was
originally written two weeks ago, May 3rd, my shoddy internet connectivity kept
me from posting it.&lt;/em&gt;). I'm loosely following the format that Justin Sherrill
uses with great effect over at
&lt;a href="https://dragonflydigest.com"&gt;https://dragonflydigest.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hackmd.io/dnJSEwjSSHCkzWFSZwbxeA"&gt;Learn NixOS by turning a Raspberry Pi into a Wireless
Router&lt;/a&gt; Friend of the show, Anthony
Scopatz, tried NixOS for the first time and provides a detailed report:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"While I had read the NixOS pamphlets, and listened politely when the
faithful came knocking on my door at inconvenient times, I had never walked
the path of functional Linux enlightenment myself"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reading through that made me file away a todo of writing up how I use
&lt;a href="https://propellor.branchable.com/"&gt;propellor&lt;/a&gt; (and why). But those todo
sometimes just pile up for a while...&lt;/p&gt;
&lt;p&gt;&lt;a href="https://evrone.com/rob-pike-interview"&gt;An interview of one of my long time nerd-crushes, Rob
Pike&lt;/a&gt;. The questions focus on the Go
programming language, but read carefully, specifically the tone and considerate
nature of intent.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://minnie.tuhs.org/pipermail/tuhs/2020-April/020895.html"&gt;Owning up to still getting it wrong
sometimes&lt;/a&gt;. Over
on The Unix Historical Society list, there was a thread about the origin and
meaning of Plan 9 from Bell Labs. Venerable computing deity Ken Thompson sends a
private message to aforementioned computing demi-god Rob Pike, Rob forwards the
admonishment back to the list.&lt;/p&gt;
&lt;p&gt;I started playing with &lt;a href="https://krita.org"&gt;Krita&lt;/a&gt; a few weeks ago, using a
tablet input device. I found out about Krita and felt empowered to try it thanks
to &lt;a href="https://www.youtube-nocookie.com/embed/A7olKdIEtNQ?rel=0"&gt;this excellent explanatory video tutorial by David
Revoy&lt;/a&gt;. Again,
recurring theme of humility and gentle nature of creative high-output
individuals. Thank you, David!&lt;/p&gt;
&lt;p&gt;Fellow San Francisco Randonneurs cyclist Roy Ross passed away unexpectedly. A
gentle soul. &lt;a href="https://groups.google.com/forum/#!topic/sfrandon/-QBVg0o1lwc"&gt;This thread on
SFR&lt;/a&gt; gives a some
sense of a quiet
Deborah Ford put up &lt;a href="https://www.deborahford.photography/Collections/Roy-Ross/"&gt;some great photos of
Roy&lt;/a&gt;, and the Metin
Uz &lt;a href="https://photos.app.goo.gl/qkoaRTKD3BSFqU517"&gt;shared an album, with others pitching
in&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I set up a &lt;a href="https://mumble.info"&gt;mumble&lt;/a&gt; server and have been mumbling with some
old friends and family. &lt;/p&gt;
&lt;p&gt;After Matthew and I chatted, I re-read his post about &lt;a href="http://asterisk.dynevor.org/xfree-forked.html"&gt;the
XFree / X.Org fork and open source
governance&lt;/a&gt; project
death, then went hoping around some links and came across
Rick Moen's &lt;a href="http://linuxmafia.com/faq/Licensing_and_Law/forking.html"&gt;fear of forking
essay&lt;/a&gt;, and he
followed up with &lt;a href="http://steve-yegge.blogspot.com/2008/04/xemacs-is-dead-long-live-xemacs.html"&gt;this bit of Emacs / XEmacs
history&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I showed Matthias and Camille my first tracing using Krita, and Matthias made me
aware of Grease Pencil - a way to do animations in Blender, and Camille sent me
an awesome and sweet comic book she made about their cat.&lt;/p&gt;
&lt;p&gt;Matthias showed me that there's a way in Git now to have &lt;code&gt;git blame&lt;/code&gt; ignore
stylistic commit changes - &lt;a href="https://github.com/ipython/ipython/pull/12091"&gt;see ipython
PR#12091&lt;/a&gt; for how to set it
up, and &lt;a href="https://github.com/ipython/ipython/pull/12277"&gt;#12277&lt;/a&gt; where we start
using it. This was a pet-peeve of mine back when Nelle started to apply
semi-automated PEP-8 formatting to parts of the matplotlib
codebase - that it was making it more difficult to use &lt;code&gt;git blame&lt;/code&gt; to track down
when lines were changed functionally, and why. &lt;/p&gt;
&lt;p&gt;And then, while we were chatting about a custom LaTeX completer PR that he has
open, he arrived at "wouldn't it be cool to throw and exception with the
table-flip emoji in your code?" ... and a short while later, he made that work:&lt;/p&gt;
&lt;video controls&gt;
&lt;source src="/video/table_flip.mp4"&gt;
No Video? download the mp4 from &lt;a href="//pirsquared.org/video/table_flip.mp4"&gt;pirsquared.org/video/table_flip.mp4&lt;/a&gt;
&lt;/video&gt;

&lt;p&gt;You can also see it in it's &lt;a
href="https://twitter.com/Mbussonn/status/1256437581744451586"&gt;original tweet
form and send Matthias some love.&lt;/a&gt; And by the way, &lt;a href="https://matthiasbussonnier.com/posts/37-joining-quansight.md/"&gt;Matthias has a new gig at
Quansight&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've also tried out &lt;a href="https://mupen64plus.org"&gt;Mupen64Plus&lt;/a&gt; - a
Nintendo 64 emulator (which I found out about via OpenBSD ports list). I found
some ROMs that fell off the back of a truck, but without a proper controller,
it's kind of difficult to play (I tried with an SNES-like USB controller, no
dice). So now I've ordered a USB N64-like controller.&lt;/p&gt;</content><category term="life"></category><category term="lazy-river"></category><category term="mumble"></category><category term="hello-world"></category></entry><entry><title>pheriday 3: infrastructure</title><link href="//pirsquared.org/blog/pheriday-infrastructure.html" rel="alternate"></link><published>2020-04-03T00:00:00-07:00</published><updated>2020-04-03T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2020-04-03:/blog/pheriday-infrastructure.html</id><summary type="html">&lt;p&gt;&lt;audio controls style="min-width: 50%" class="body"&gt;
&lt;source src="///pirsquared.org/pheridays/2020-04-03.ogg" type="audio/ogg"&gt;
&lt;source src="///pirsquared.org/pheridays/2020-04-03.m4a" type="audio/mp4"&gt;
&lt;source src="///pirsquared.org/pheridays/2020-04-03.mp3" type="audio/mpeg"&gt;&lt;/p&gt;
&lt;!-- TKTK - add captioning to the above: --&gt;
&lt;p&gt;Looks like we can't inline audio for your browser. That's cool, just find the
direct file links below.
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;paul's habitual errant ramblings (on Fr)idays&lt;/p&gt;
&lt;p&gt;pheridays: 3&lt;/p&gt;
&lt;p&gt;2020-04-10: A week ago, I recorded a 5 minute audio segment of some stuff I've
been thinking about, but when I started to write it up I stumbled into and kept
dropping down a deep technostalgic hole.&lt;/p&gt;
&lt;p&gt;fall down along with me:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pirsquared.org/blog/pheriday-infrastructure.html"&gt;https://pirsquared.org/blog/pheriday-infrastructure.html&lt;/a&gt;&lt;/p&gt;
&lt;!-- &lt;br&gt;[gopher://sdf.org/1/users/ivanov/pheridays/2012-08-03](gopher://sdf.org/1/users/ivanov/pheridays/2012-08-03) (yes, gopher!) ([proxy](http://gopher.floodgap.com/gopher/gw?a=sdf.org/1/users/ivanov/pheridays/2012-08-03))
--&gt;

&lt;p&gt;The recording is just shy of five minutes long, you can also download it in
different formats, depending on your needs, if the audio tag above doesn't suit
you:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&lt;a href="///pirsquared.org/pheridays/2020-04-03.ogg"&gt;
https://pirsquared.org/pheridays/2020-04-03.ogg&lt;/a&gt;
(2.9 Mb) &lt;br&gt;
&lt;a href="///pirsquared.org/pheridays/2020-04-03.mp3"&gt;
https://pirsquared.org/pheridays/2020-04-03.mp3&lt;/a&gt;
(4.5 Mb)&lt;br&gt;
&lt;a href="///pirsquared.org/pheridays/2020-04-03.m4a"&gt;
https://pirsquared.org/pheridays/2020-04-03.m4a&lt;/a&gt;
(6.3 Mb) &lt;br&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;!-- audio with multiple sources --&gt;
&lt;p&gt;Stuff I mentioned in the audio:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://propellor.branchable.com/"&gt;Propellor&lt;/a&gt; - "configuration management
system using Haskell and Git" by &lt;a href="https://joeyh.name/"&gt;Joey Hess&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://openwrt.org/"&gt;OpenWRT&lt;/a&gt; - specifically - &lt;a href="https://www.bufferbloat.net/projects/bloat/wiki/What_can_I_do_about_Bufferbloat/"&gt;reducing
Bufferbloat&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.mumble.info/"&gt;Mumble&lt;/a&gt; - "a free, open source, low latency, high
quality voice chat application."&lt;/p&gt;
&lt;p&gt;&lt;a href="https://sourcehut.org/"&gt;sourcehut.org&lt;/a&gt; - "the hacker's forge" also know as
&lt;a href="https://sr.ht"&gt;sr.ht&lt;/a&gt; by &lt;a href="https://drewdevault.com/"&gt;Drew DeVault&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jitsi.org/"&gt;Jitsi&lt;/a&gt; - "Multi-platform open-source video conferencing"&lt;/p&gt;
&lt;p&gt;&lt;a href="https://igniterealtime.org/projects/openfire/"&gt;OpenFire&lt;/a&gt; -  "real time
collaboration (RTC) server licensed under the Open Source Apache License."
Extensible XMPP server, with plugins, like a Jitsi-based video meeeting one
claled  OpenFire Meetings.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Though this is the fourth installment, the last time I recorded and posted a
rambling  was back almost 8 years ago! In fact, it was
&lt;a href="//pirsquared.org/blog/pheriday-termcasting.html"&gt;2012-08-03&lt;/a&gt;, so 7 years and 8 months, to the day.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Having control of your infrastructure is a longtime thread for me.&lt;/p&gt;
&lt;p&gt;For starters - there's the bicycle. That's been my primary and preferred mode
of transportation for 30 years. As a kid, I was empowered by the sense of
freedom, independence, and self-sufficiency that came with a bike. All these
years later, I'm still a fan. You can see &lt;a href="//www.blog.pythonlibrary.org/2019/10/07/pydev-of-the-week-paul-ivanov/"&gt;just how happy I am on a bike at the
top of this interview
&lt;/a&gt;,
thanks to a sweet photo that was taken by Robert Sexton right by the Golden Gate
Bridge at the end of the Lucas Valley Populaire in 2015.&lt;/p&gt;
&lt;p&gt;Those of you who knew me back in college might remember how at UC Davis I ran my
own "pirate" internet radio station
- KPVL - with the cheeky tagline of "More broadcasters than listeners". (I say
  "pirate" because it has not relation to the actual &lt;a
  href="https://https://en.wikipedia.org/wiki/KPVL"&gt;KPVL&lt;/a&gt; radio station). But
there are earlier remnants and traces of my efforts to exercise control and
build my own reality.&lt;/p&gt;
&lt;p&gt;I think it was in 1999 that my brother Mike and I started using Redhat (6), then
Mandrake Linux 6.5, dual booting on a computer at home and I separately around
the same time I got myself an sdf.org account. Though I wasn't sophisticated
enough to have a constant internet connection in high school, I was lucky enough
to get an account on Robert Chin's laya.com server. The url was - p.laya.com -
it's long gone, but luckily, Archive.org has a copy from 2001.&lt;/p&gt;
&lt;p&gt;Wow. I just took a look and so much came flooding back.&lt;/p&gt;
&lt;p&gt;Here's the thing: April is an anniversary of sorts for me. Back in 1999, it
marks my first time breaking anonymity and pseudonimity and using my real name
on the internet. I've written about this before  &lt;a href="//pirsquared.org/blog/publishers-block.html"&gt;under the title of Publisher's
block&lt;/a&gt; ten years ago - just about half way
between now and then. This time, though, let me inline the piece I
&lt;a href="//shad0kn1ght.tripod.com/basement/again/Excuses.txt"&gt;linked&lt;/a&gt; to as proof
of the deliberate nature of my lack of anonymity.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;An account of my life at 15, as I live it.
traces of my awareness of the world, I can look back at later
My first attempt at a memoir
My goal is to capture my many thoughts emotions, behaviors, incidents, and
acquaintances
and to arrive only at an exponential number of those,
hoping yet being afraid that it might be zero
making everything about me: one
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I'm glad I can now reflect on the kind of kid I was, thanks to the amazing folks
who had the foresight to start archiving all of the web for The Way Back Machine.
I used that p.laya.com page as a todo list and notes for myself using a hipster
combination of the default file index listing with a FOOTER.html.  It was
captured in 2001, I was in 17, but some of this was
written when I was 15 or 16 (I found contents from November 2000), I make
mention to my &lt;em&gt;then&lt;/em&gt; freeshell.org account (it's now been ivanov@ since 2012). I
link to the source code of a MUD -
ftp://ftp.game.org/pub/mud/diku/merc/rom/tartarus/tartarus.tgz - which is a
broken link now, &lt;a href="ftp://smaug.org/pub/mud/diku/merc/rom/tartarus/"&gt;but I found a mirror over here:
&lt;/a&gt;
which is amazing, because just a week or two ago, I was hanging out with
fellow SciPy 2020 program co-chairs &lt;a href="https://munkm.github.io/"&gt;Madicken Munk&lt;/a&gt;
and &lt;a href="https://github.com/gforsyth"&gt;Gil Forsyth&lt;/a&gt; over video chat after one of
our meetings and I was happily reporting about how one of the
positive things to come out of the shelter in place for me is that "I've fixed
my mutt configuration and started using it again!" - but they &lt;em&gt;both&lt;/em&gt; heard
"mutt" as "MUD" and got &lt;b&gt;very&lt;/b&gt; excited by that prospect. So much so that we
all agreed that we'll have to follow up and actually follow through to build a
MUD.  And I brought up how at some point in high school I was mildly active in a
pair of MUDs, and wanted to make my own, but never got around to it.&lt;/p&gt;
&lt;p&gt;The last link I left for myself on there points to
&lt;a href="http://pinkmonkey.com"&gt;pinkmonkey.com&lt;/a&gt; - a homeschooling resource - which is
probably handy for the parents with little ones these days.&lt;/p&gt;
&lt;p&gt;Here's the most concrete infrastructure project I can find from then: I
collected bookmarks from my friends to share them. The "service" lived at
http://p.laya.com/bookmarks - and predates del.icio.us and pinboard. I
bet I "advertised" it in my AIM profile.&lt;/p&gt;
&lt;p&gt;If you're curious, there's a link to the archive.org copy near the end of this
post, but I had this urge to show it to you much closer to its original glory.&lt;/p&gt;
&lt;p&gt;Let me set the scene: It's Friday in April, the year is 2020, I'm running
Windows 10 on my work laptop in poorly connected home in California, where a
pandemic has most of the state's residents staying put at home for the several
weeks already, and I decided to make a screenshot using the tool du jour of
yesteryear&lt;/p&gt;
&lt;h1 id="netscape-navigator"&gt;Netscape Navigator!&lt;/h1&gt;
&lt;p&gt;The timestamp on my bookmark website says I last updated it on: Thu Aug 30
20:14:14 PDT 2001&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.oldversion.com/windows/netscape/"&gt;OldVersion.com tells me&lt;/a&gt; that the
latest release for Windows that Netscape 4.79 was released in November of that
year, and the closest antecedent version available is 4.72 (from February 2000).&lt;/p&gt;
&lt;p&gt;I downloaded it  and tried fiddling around with the compatibility settings, but
without any luck.&lt;/p&gt;
&lt;p&gt;Then I tried 4.79, and nope, that didn't work, either. So then I tried Netscape
6.01 - release February 2001.&lt;/p&gt;
&lt;p&gt;I happened to have Chrome running at the time because in Firefox I have
1500 tabs open -- &lt;strong&gt;fifteen hundred and seven!&lt;/strong&gt; ;) -- whereas in Chrome it's
under 500, so I was trying to tread lightly. How do I know these numbers? For
Chrome I found an extension that allows me to copy into the clipboard all open
tabs' urls as plain text. It helpfully announces how many such tabs were copied.
In Firefox one of the webextension examples gives you a counter.&lt;/p&gt;
&lt;p&gt;Do you remember the web without tabs? Time was, you wanted to visit another
webpage, you got two option: you navigate away from whatever you're looking at
now, or you hit Ctrl-N to make an new window. I think most people used one or a
few windows. But you were not gonna be crazy and open more than a dozen windows.
I would have, and probably tried but I couldn't. And session saving across
crashes or clean exits? Forget it! That what your history and bookmarks are for,
grasshopper.&lt;/p&gt;
&lt;p&gt;But let's get back to the task at hand: this was the lower right of my screen...&lt;/p&gt;
&lt;p&gt;&lt;img alt="Downloaded Netscape601.exe" src="/blog/images/infra/lower-left-of-my-screen.jpg"&gt;&lt;/p&gt;
&lt;p&gt;and I decide to start taking screenshots of this journey,  click it, and let
Windows 10 apply the compatibility settings, and then I'm faced with&lt;/p&gt;
&lt;h1 id="the-most-improbable-error-message"&gt;the most improbable error message:&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Setup detected another instance of Netscape 6 is currently running" src="/blog/images/infra/most-improbable-error.jpg"&gt;&lt;/p&gt;
&lt;p&gt;:)&lt;/p&gt;
&lt;h2 id="wat"&gt;WAT?!&lt;/h2&gt;
&lt;p&gt;I didn't think Chrome had any ancestry shared with the Mosaic super-tree, but
whatever - you can't exactly argue with software from 2001, and I have an
important screenshot to take...&lt;/p&gt;
&lt;p&gt;So now I've quit Chrome, just in case, and going to retry....&lt;/p&gt;
&lt;p&gt;&lt;img alt="Setup detected another instance of Netscape 6 is currently running" src="/blog/images/infra/most-improbable-error.jpg"&gt;&lt;/p&gt;
&lt;p&gt;no dice....&lt;/p&gt;
&lt;p&gt;Damn, what could it be...I've got the Bloomberg Terminal open, I know portions
of it are built on Chromium browser technology (had to look it up if this was
officially stated somewhere - &lt;a href="https://www.techatbloomberg.com/blog/bloombergs-2016-open-source-contributions-5-top-projects/"&gt;it
is&lt;/a&gt;).
Ok, so maybe that's what causing the false positive? I close that, and...&lt;/p&gt;
&lt;p&gt;&lt;img alt="Setup detected another instance of Netscape 6 is currently running" src="/blog/images/infra/most-improbable-error.jpg"&gt;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I hardly have anything open anymore ...is it VLC?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&lt;img alt="Setup detected another instance of Netscape 6 is currently running" src="/blog/images/infra/most-improbable-error.jpg"&gt;&lt;/p&gt;
&lt;p&gt;nope... Ok, what's left still open... Snipping tool I'm using to capture this
epic adventure, a few WSL Debian console windows... the voice recorder
that started this post... Task manager and &lt;a href="https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer"&gt;Sysinternals' Process
Explorer&lt;/a&gt;
- where I was checking if perhaps somehow the failed attempt at running what was
probably a 16 bit version of Navigator 4.72 was still lingering somewhere...
SumatraPDF, Windows Terminal (Preview), gVim, and ...&lt;/p&gt;
&lt;p&gt;&lt;a name="bingo"&gt;&lt;/a&gt;
Zotero?!?&lt;/p&gt;
&lt;h1 id="bingo"&gt;BINGO!!!!!!!!!&lt;/h1&gt;
&lt;p&gt;&lt;a class="thumb-link" href="#bingoZoom"&gt;
&lt;img alt="Initial Netscape 6 Setup screen" src="/blog/images/infra/netscape-setup-bingo.jpg" width=100%&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="#bingo" class="lightbox" name="bingoZoom" &gt;
&lt;img alt="Initial Netscape 6 Setup screen" src="/blog/images/infra/netscape-setup-bingo.jpg"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;!-- css option to click to zoom this? --&gt;

&lt;p&gt;Oh right - I guess Zotero uses XUL technology. I didn't really think much about
it, but Zotero did start off life as a Firefox extension, and the standalone version
came out later, makes sense that it would have grabbed a browser when it struck
out on its own.&lt;/p&gt;
&lt;p&gt;At this point I had already sent Madicken, who works at NCSA where Mosaic, the
progenitor of Netscape hails from, the first two images... So I wanted to play
with fire a bit....&lt;/p&gt;
&lt;p&gt;Now that I've closed Zotero - can I have Firefox 74 open while installing Netscape
6.01?&lt;/p&gt;
&lt;p&gt;&lt;img alt="Setup detected another instance of Netscape 6 is currently running" src="/blog/images/infra/most-improbable-error.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Rats! same error...&lt;/p&gt;
&lt;p&gt;&lt;a name="chrome-again"&gt;&lt;/a&gt;
how about Chrome again?&lt;/p&gt;
&lt;p&gt;&lt;a class="thumb-link" href="#chromeZoom"&gt;
&lt;img alt="Initial Netscape 6 Setup screen" src="/blog/images/infra/netscape-setup-bingo.jpg" width=100%&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="#chrome-again" class="lightbox" name="chromeZoom" &gt;
&lt;img alt="Initial Netscape 6 Setup screen" src="/blog/images/infra/netscape-setup-bingo.jpg"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;oh yeah! Sweet. The world makes sense again.&lt;/p&gt;
&lt;p&gt;Back to the setup.exe...&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-00.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-01.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I scroll through the EULA - and randomly stop on this section:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;12.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RISK&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ACTIVITIES&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;
&lt;span class="n"&gt;fault&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kr"&gt;to&lt;/span&gt;&lt;span class="n"&gt;lerant&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;designed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;manufactured&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;
&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="n"&gt;ed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;resale&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;on&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;cont&lt;/span&gt;&lt;span class="n"&gt;rol&lt;/span&gt;
&lt;span class="n"&gt;equipment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hazardous&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;environments&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;requiring&lt;/span&gt;
&lt;span class="n"&gt;fail&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;safe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;such&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;
&lt;span class="n"&gt;nuclear&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;facilities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;aircraft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;navigation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;
&lt;span class="n"&gt;communication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;sys&lt;/span&gt;&lt;span class="n"&gt;tems&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;air&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;traffic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;cont&lt;/span&gt;&lt;span class="n"&gt;rol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;direct&lt;/span&gt;
&lt;span class="n"&gt;life&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;support&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;machines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;weapons&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;sys&lt;/span&gt;&lt;span class="n"&gt;tems&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;
&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;failure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;could&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lead&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;directly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;to&lt;/span&gt;
&lt;span class="n"&gt;death&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;personal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;injury&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;severe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;physical&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;
&lt;span class="n"&gt;environmental&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;damage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;High Risk Activities&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;By the way - here's a good idea I came across a few months ago: throw EULAs (End
User License Agreements) into some publicly indexed version control repo (I saw
folks using gists for just that sort of thing: &lt;a href="https://gist.github.com/ivanov/5682af020b2e4bed3d069637e3f18dd4#file-eula-txt"&gt;here's the Netscape 6.01
EULA.txt&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Let the folks at Redmond host it.&lt;/p&gt;
&lt;p&gt;Fine. I click next...&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-02.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Interesting - there's a "Read Me" button... I do as I'm told, so I click it.&lt;/p&gt;
&lt;p&gt;Oh, a README.txt popped up in Notepad.exe - full contents of that are in &lt;a href="https://gist.github.com/ivanov/5682af020b2e4bed3d069637e3f18dd4"&gt;that same gist as
the EULA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;but in them, there's a link to the full release notes over at&lt;/p&gt;
&lt;p&gt;&lt;a href="http://home.netscape.com/eng/mozilla/ns6/relnotes/6.0.html"&gt;http://home.netscape.com/eng/mozilla/ns6/relnotes/6.0.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let's try to go there now:&lt;/p&gt;
&lt;p&gt;&lt;img alt="&amp;quot;Yahoo! will be right back... Thank yo for your patience.&amp;quot; " src="/blog/images/infra/netscape-release-notes-wat.jpg"&gt;&lt;/p&gt;
&lt;h3 id="wat_1"&gt;Wat?!&lt;/h3&gt;
&lt;p&gt;Yeah, I'm sure Yahoo&lt;em&gt;!&lt;/em&gt; engineers are jumping right on that.&lt;/p&gt;
&lt;h1 id="how-did-a-netscape-site-ended-up-redirecting-to-yahoo"&gt;How did a Netscape site ended up redirecting to Yahoo...&lt;/h1&gt;
&lt;p&gt;oh right, so AOL bought Netscape (1999), merged with Time Warner in 2001, was
spun out again in 2009, after some rough times, and then purchased by Verizon in
2015. In the meantime, Yahoo acquired Geocities (1999) and shut it down in 2009
(yes, I'm &lt;em&gt;still&lt;/em&gt; mad! All I remember was that it had some crispy banners,
one of which was a scan of a sweet pencil lettering I made of my nick at the time …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;audio controls style="min-width: 50%" class="body"&gt;
&lt;source src="///pirsquared.org/pheridays/2020-04-03.ogg" type="audio/ogg"&gt;
&lt;source src="///pirsquared.org/pheridays/2020-04-03.m4a" type="audio/mp4"&gt;
&lt;source src="///pirsquared.org/pheridays/2020-04-03.mp3" type="audio/mpeg"&gt;&lt;/p&gt;
&lt;!-- TKTK - add captioning to the above: --&gt;
&lt;p&gt;Looks like we can't inline audio for your browser. That's cool, just find the
direct file links below.
&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;paul's habitual errant ramblings (on Fr)idays&lt;/p&gt;
&lt;p&gt;pheridays: 3&lt;/p&gt;
&lt;p&gt;2020-04-10: A week ago, I recorded a 5 minute audio segment of some stuff I've
been thinking about, but when I started to write it up I stumbled into and kept
dropping down a deep technostalgic hole.&lt;/p&gt;
&lt;p&gt;fall down along with me:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pirsquared.org/blog/pheriday-infrastructure.html"&gt;https://pirsquared.org/blog/pheriday-infrastructure.html&lt;/a&gt;&lt;/p&gt;
&lt;!-- &lt;br&gt;[gopher://sdf.org/1/users/ivanov/pheridays/2012-08-03](gopher://sdf.org/1/users/ivanov/pheridays/2012-08-03) (yes, gopher!) ([proxy](http://gopher.floodgap.com/gopher/gw?a=sdf.org/1/users/ivanov/pheridays/2012-08-03))
--&gt;

&lt;p&gt;The recording is just shy of five minutes long, you can also download it in
different formats, depending on your needs, if the audio tag above doesn't suit
you:&lt;/p&gt;
&lt;p&gt;&lt;tt&gt;&lt;a href="///pirsquared.org/pheridays/2020-04-03.ogg"&gt;
https://pirsquared.org/pheridays/2020-04-03.ogg&lt;/a&gt;
(2.9 Mb) &lt;br&gt;
&lt;a href="///pirsquared.org/pheridays/2020-04-03.mp3"&gt;
https://pirsquared.org/pheridays/2020-04-03.mp3&lt;/a&gt;
(4.5 Mb)&lt;br&gt;
&lt;a href="///pirsquared.org/pheridays/2020-04-03.m4a"&gt;
https://pirsquared.org/pheridays/2020-04-03.m4a&lt;/a&gt;
(6.3 Mb) &lt;br&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;!-- audio with multiple sources --&gt;
&lt;p&gt;Stuff I mentioned in the audio:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://propellor.branchable.com/"&gt;Propellor&lt;/a&gt; - "configuration management
system using Haskell and Git" by &lt;a href="https://joeyh.name/"&gt;Joey Hess&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://openwrt.org/"&gt;OpenWRT&lt;/a&gt; - specifically - &lt;a href="https://www.bufferbloat.net/projects/bloat/wiki/What_can_I_do_about_Bufferbloat/"&gt;reducing
Bufferbloat&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.mumble.info/"&gt;Mumble&lt;/a&gt; - "a free, open source, low latency, high
quality voice chat application."&lt;/p&gt;
&lt;p&gt;&lt;a href="https://sourcehut.org/"&gt;sourcehut.org&lt;/a&gt; - "the hacker's forge" also know as
&lt;a href="https://sr.ht"&gt;sr.ht&lt;/a&gt; by &lt;a href="https://drewdevault.com/"&gt;Drew DeVault&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jitsi.org/"&gt;Jitsi&lt;/a&gt; - "Multi-platform open-source video conferencing"&lt;/p&gt;
&lt;p&gt;&lt;a href="https://igniterealtime.org/projects/openfire/"&gt;OpenFire&lt;/a&gt; -  "real time
collaboration (RTC) server licensed under the Open Source Apache License."
Extensible XMPP server, with plugins, like a Jitsi-based video meeeting one
claled  OpenFire Meetings.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Though this is the fourth installment, the last time I recorded and posted a
rambling  was back almost 8 years ago! In fact, it was
&lt;a href="//pirsquared.org/blog/pheriday-termcasting.html"&gt;2012-08-03&lt;/a&gt;, so 7 years and 8 months, to the day.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Having control of your infrastructure is a longtime thread for me.&lt;/p&gt;
&lt;p&gt;For starters - there's the bicycle. That's been my primary and preferred mode
of transportation for 30 years. As a kid, I was empowered by the sense of
freedom, independence, and self-sufficiency that came with a bike. All these
years later, I'm still a fan. You can see &lt;a href="//www.blog.pythonlibrary.org/2019/10/07/pydev-of-the-week-paul-ivanov/"&gt;just how happy I am on a bike at the
top of this interview
&lt;/a&gt;,
thanks to a sweet photo that was taken by Robert Sexton right by the Golden Gate
Bridge at the end of the Lucas Valley Populaire in 2015.&lt;/p&gt;
&lt;p&gt;Those of you who knew me back in college might remember how at UC Davis I ran my
own "pirate" internet radio station
- KPVL - with the cheeky tagline of "More broadcasters than listeners". (I say
  "pirate" because it has not relation to the actual &lt;a
  href="https://https://en.wikipedia.org/wiki/KPVL"&gt;KPVL&lt;/a&gt; radio station). But
there are earlier remnants and traces of my efforts to exercise control and
build my own reality.&lt;/p&gt;
&lt;p&gt;I think it was in 1999 that my brother Mike and I started using Redhat (6), then
Mandrake Linux 6.5, dual booting on a computer at home and I separately around
the same time I got myself an sdf.org account. Though I wasn't sophisticated
enough to have a constant internet connection in high school, I was lucky enough
to get an account on Robert Chin's laya.com server. The url was - p.laya.com -
it's long gone, but luckily, Archive.org has a copy from 2001.&lt;/p&gt;
&lt;p&gt;Wow. I just took a look and so much came flooding back.&lt;/p&gt;
&lt;p&gt;Here's the thing: April is an anniversary of sorts for me. Back in 1999, it
marks my first time breaking anonymity and pseudonimity and using my real name
on the internet. I've written about this before  &lt;a href="//pirsquared.org/blog/publishers-block.html"&gt;under the title of Publisher's
block&lt;/a&gt; ten years ago - just about half way
between now and then. This time, though, let me inline the piece I
&lt;a href="//shad0kn1ght.tripod.com/basement/again/Excuses.txt"&gt;linked&lt;/a&gt; to as proof
of the deliberate nature of my lack of anonymity.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;An account of my life at 15, as I live it.
traces of my awareness of the world, I can look back at later
My first attempt at a memoir
My goal is to capture my many thoughts emotions, behaviors, incidents, and
acquaintances
and to arrive only at an exponential number of those,
hoping yet being afraid that it might be zero
making everything about me: one
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I'm glad I can now reflect on the kind of kid I was, thanks to the amazing folks
who had the foresight to start archiving all of the web for The Way Back Machine.
I used that p.laya.com page as a todo list and notes for myself using a hipster
combination of the default file index listing with a FOOTER.html.  It was
captured in 2001, I was in 17, but some of this was
written when I was 15 or 16 (I found contents from November 2000), I make
mention to my &lt;em&gt;then&lt;/em&gt; freeshell.org account (it's now been ivanov@ since 2012). I
link to the source code of a MUD -
ftp://ftp.game.org/pub/mud/diku/merc/rom/tartarus/tartarus.tgz - which is a
broken link now, &lt;a href="ftp://smaug.org/pub/mud/diku/merc/rom/tartarus/"&gt;but I found a mirror over here:
&lt;/a&gt;
which is amazing, because just a week or two ago, I was hanging out with
fellow SciPy 2020 program co-chairs &lt;a href="https://munkm.github.io/"&gt;Madicken Munk&lt;/a&gt;
and &lt;a href="https://github.com/gforsyth"&gt;Gil Forsyth&lt;/a&gt; over video chat after one of
our meetings and I was happily reporting about how one of the
positive things to come out of the shelter in place for me is that "I've fixed
my mutt configuration and started using it again!" - but they &lt;em&gt;both&lt;/em&gt; heard
"mutt" as "MUD" and got &lt;b&gt;very&lt;/b&gt; excited by that prospect. So much so that we
all agreed that we'll have to follow up and actually follow through to build a
MUD.  And I brought up how at some point in high school I was mildly active in a
pair of MUDs, and wanted to make my own, but never got around to it.&lt;/p&gt;
&lt;p&gt;The last link I left for myself on there points to
&lt;a href="http://pinkmonkey.com"&gt;pinkmonkey.com&lt;/a&gt; - a homeschooling resource - which is
probably handy for the parents with little ones these days.&lt;/p&gt;
&lt;p&gt;Here's the most concrete infrastructure project I can find from then: I
collected bookmarks from my friends to share them. The "service" lived at
http://p.laya.com/bookmarks - and predates del.icio.us and pinboard. I
bet I "advertised" it in my AIM profile.&lt;/p&gt;
&lt;p&gt;If you're curious, there's a link to the archive.org copy near the end of this
post, but I had this urge to show it to you much closer to its original glory.&lt;/p&gt;
&lt;p&gt;Let me set the scene: It's Friday in April, the year is 2020, I'm running
Windows 10 on my work laptop in poorly connected home in California, where a
pandemic has most of the state's residents staying put at home for the several
weeks already, and I decided to make a screenshot using the tool du jour of
yesteryear&lt;/p&gt;
&lt;h1 id="netscape-navigator"&gt;Netscape Navigator!&lt;/h1&gt;
&lt;p&gt;The timestamp on my bookmark website says I last updated it on: Thu Aug 30
20:14:14 PDT 2001&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.oldversion.com/windows/netscape/"&gt;OldVersion.com tells me&lt;/a&gt; that the
latest release for Windows that Netscape 4.79 was released in November of that
year, and the closest antecedent version available is 4.72 (from February 2000).&lt;/p&gt;
&lt;p&gt;I downloaded it  and tried fiddling around with the compatibility settings, but
without any luck.&lt;/p&gt;
&lt;p&gt;Then I tried 4.79, and nope, that didn't work, either. So then I tried Netscape
6.01 - release February 2001.&lt;/p&gt;
&lt;p&gt;I happened to have Chrome running at the time because in Firefox I have
1500 tabs open -- &lt;strong&gt;fifteen hundred and seven!&lt;/strong&gt; ;) -- whereas in Chrome it's
under 500, so I was trying to tread lightly. How do I know these numbers? For
Chrome I found an extension that allows me to copy into the clipboard all open
tabs' urls as plain text. It helpfully announces how many such tabs were copied.
In Firefox one of the webextension examples gives you a counter.&lt;/p&gt;
&lt;p&gt;Do you remember the web without tabs? Time was, you wanted to visit another
webpage, you got two option: you navigate away from whatever you're looking at
now, or you hit Ctrl-N to make an new window. I think most people used one or a
few windows. But you were not gonna be crazy and open more than a dozen windows.
I would have, and probably tried but I couldn't. And session saving across
crashes or clean exits? Forget it! That what your history and bookmarks are for,
grasshopper.&lt;/p&gt;
&lt;p&gt;But let's get back to the task at hand: this was the lower right of my screen...&lt;/p&gt;
&lt;p&gt;&lt;img alt="Downloaded Netscape601.exe" src="/blog/images/infra/lower-left-of-my-screen.jpg"&gt;&lt;/p&gt;
&lt;p&gt;and I decide to start taking screenshots of this journey,  click it, and let
Windows 10 apply the compatibility settings, and then I'm faced with&lt;/p&gt;
&lt;h1 id="the-most-improbable-error-message"&gt;the most improbable error message:&lt;/h1&gt;
&lt;p&gt;&lt;img alt="Setup detected another instance of Netscape 6 is currently running" src="/blog/images/infra/most-improbable-error.jpg"&gt;&lt;/p&gt;
&lt;p&gt;:)&lt;/p&gt;
&lt;h2 id="wat"&gt;WAT?!&lt;/h2&gt;
&lt;p&gt;I didn't think Chrome had any ancestry shared with the Mosaic super-tree, but
whatever - you can't exactly argue with software from 2001, and I have an
important screenshot to take...&lt;/p&gt;
&lt;p&gt;So now I've quit Chrome, just in case, and going to retry....&lt;/p&gt;
&lt;p&gt;&lt;img alt="Setup detected another instance of Netscape 6 is currently running" src="/blog/images/infra/most-improbable-error.jpg"&gt;&lt;/p&gt;
&lt;p&gt;no dice....&lt;/p&gt;
&lt;p&gt;Damn, what could it be...I've got the Bloomberg Terminal open, I know portions
of it are built on Chromium browser technology (had to look it up if this was
officially stated somewhere - &lt;a href="https://www.techatbloomberg.com/blog/bloombergs-2016-open-source-contributions-5-top-projects/"&gt;it
is&lt;/a&gt;).
Ok, so maybe that's what causing the false positive? I close that, and...&lt;/p&gt;
&lt;p&gt;&lt;img alt="Setup detected another instance of Netscape 6 is currently running" src="/blog/images/infra/most-improbable-error.jpg"&gt;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;I hardly have anything open anymore ...is it VLC?&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&lt;img alt="Setup detected another instance of Netscape 6 is currently running" src="/blog/images/infra/most-improbable-error.jpg"&gt;&lt;/p&gt;
&lt;p&gt;nope... Ok, what's left still open... Snipping tool I'm using to capture this
epic adventure, a few WSL Debian console windows... the voice recorder
that started this post... Task manager and &lt;a href="https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer"&gt;Sysinternals' Process
Explorer&lt;/a&gt;
- where I was checking if perhaps somehow the failed attempt at running what was
probably a 16 bit version of Navigator 4.72 was still lingering somewhere...
SumatraPDF, Windows Terminal (Preview), gVim, and ...&lt;/p&gt;
&lt;p&gt;&lt;a name="bingo"&gt;&lt;/a&gt;
Zotero?!?&lt;/p&gt;
&lt;h1 id="bingo"&gt;BINGO!!!!!!!!!&lt;/h1&gt;
&lt;p&gt;&lt;a class="thumb-link" href="#bingoZoom"&gt;
&lt;img alt="Initial Netscape 6 Setup screen" src="/blog/images/infra/netscape-setup-bingo.jpg" width=100%&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="#bingo" class="lightbox" name="bingoZoom" &gt;
&lt;img alt="Initial Netscape 6 Setup screen" src="/blog/images/infra/netscape-setup-bingo.jpg"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;!-- css option to click to zoom this? --&gt;

&lt;p&gt;Oh right - I guess Zotero uses XUL technology. I didn't really think much about
it, but Zotero did start off life as a Firefox extension, and the standalone version
came out later, makes sense that it would have grabbed a browser when it struck
out on its own.&lt;/p&gt;
&lt;p&gt;At this point I had already sent Madicken, who works at NCSA where Mosaic, the
progenitor of Netscape hails from, the first two images... So I wanted to play
with fire a bit....&lt;/p&gt;
&lt;p&gt;Now that I've closed Zotero - can I have Firefox 74 open while installing Netscape
6.01?&lt;/p&gt;
&lt;p&gt;&lt;img alt="Setup detected another instance of Netscape 6 is currently running" src="/blog/images/infra/most-improbable-error.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Rats! same error...&lt;/p&gt;
&lt;p&gt;&lt;a name="chrome-again"&gt;&lt;/a&gt;
how about Chrome again?&lt;/p&gt;
&lt;p&gt;&lt;a class="thumb-link" href="#chromeZoom"&gt;
&lt;img alt="Initial Netscape 6 Setup screen" src="/blog/images/infra/netscape-setup-bingo.jpg" width=100%&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="#chrome-again" class="lightbox" name="chromeZoom" &gt;
&lt;img alt="Initial Netscape 6 Setup screen" src="/blog/images/infra/netscape-setup-bingo.jpg"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;oh yeah! Sweet. The world makes sense again.&lt;/p&gt;
&lt;p&gt;Back to the setup.exe...&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-00.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-01.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I scroll through the EULA - and randomly stop on this section:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;12.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RISK&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ACTIVITIES&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;
&lt;span class="n"&gt;fault&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kr"&gt;to&lt;/span&gt;&lt;span class="n"&gt;lerant&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;designed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;manufactured&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;
&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="n"&gt;ed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;resale&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;on&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;cont&lt;/span&gt;&lt;span class="n"&gt;rol&lt;/span&gt;
&lt;span class="n"&gt;equipment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hazardous&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;environments&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;requiring&lt;/span&gt;
&lt;span class="n"&gt;fail&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;safe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;such&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;
&lt;span class="n"&gt;nuclear&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;facilities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;aircraft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;navigation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;
&lt;span class="n"&gt;communication&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;sys&lt;/span&gt;&lt;span class="n"&gt;tems&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;air&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;traffic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;cont&lt;/span&gt;&lt;span class="n"&gt;rol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;direct&lt;/span&gt;
&lt;span class="n"&gt;life&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;support&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;machines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;weapons&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;sys&lt;/span&gt;&lt;span class="n"&gt;tems&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;
&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;failure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;could&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lead&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;directly&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;to&lt;/span&gt;
&lt;span class="n"&gt;death&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;personal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;injury&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;severe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;physical&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;
&lt;span class="n"&gt;environmental&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;damage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;High Risk Activities&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;By the way - here's a good idea I came across a few months ago: throw EULAs (End
User License Agreements) into some publicly indexed version control repo (I saw
folks using gists for just that sort of thing: &lt;a href="https://gist.github.com/ivanov/5682af020b2e4bed3d069637e3f18dd4#file-eula-txt"&gt;here's the Netscape 6.01
EULA.txt&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Let the folks at Redmond host it.&lt;/p&gt;
&lt;p&gt;Fine. I click next...&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-02.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Interesting - there's a "Read Me" button... I do as I'm told, so I click it.&lt;/p&gt;
&lt;p&gt;Oh, a README.txt popped up in Notepad.exe - full contents of that are in &lt;a href="https://gist.github.com/ivanov/5682af020b2e4bed3d069637e3f18dd4"&gt;that same gist as
the EULA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;but in them, there's a link to the full release notes over at&lt;/p&gt;
&lt;p&gt;&lt;a href="http://home.netscape.com/eng/mozilla/ns6/relnotes/6.0.html"&gt;http://home.netscape.com/eng/mozilla/ns6/relnotes/6.0.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let's try to go there now:&lt;/p&gt;
&lt;p&gt;&lt;img alt="&amp;quot;Yahoo! will be right back... Thank yo for your patience.&amp;quot; " src="/blog/images/infra/netscape-release-notes-wat.jpg"&gt;&lt;/p&gt;
&lt;h3 id="wat_1"&gt;Wat?!&lt;/h3&gt;
&lt;p&gt;Yeah, I'm sure Yahoo&lt;em&gt;!&lt;/em&gt; engineers are jumping right on that.&lt;/p&gt;
&lt;h1 id="how-did-a-netscape-site-ended-up-redirecting-to-yahoo"&gt;How did a Netscape site ended up redirecting to Yahoo...&lt;/h1&gt;
&lt;p&gt;oh right, so AOL bought Netscape (1999), merged with Time Warner in 2001, was
spun out again in 2009, after some rough times, and then purchased by Verizon in
2015. In the meantime, Yahoo acquired Geocities (1999) and shut it down in 2009
(yes, I'm &lt;em&gt;still&lt;/em&gt; mad! All I remember was that it had some crispy banners,
one of which was a scan of a sweet pencil lettering I made of my nick at the time -
"ShadowKnight"). No one really cares what happened to Yahoo in the interim,
aside from some massive data breaches, until finally, Verizon bought Yahoo in
2017 and merged AOL and Yahoo into one division.&lt;/p&gt;
&lt;p&gt;Ok, so fine, maybe fine folks at &lt;a href="https://archive.org"&gt;The Internet Archive
(archive.org)&lt;/a&gt; can help us with the WayBackMachine.&lt;/p&gt;
&lt;p&gt;And indeed we can see &lt;a href="https://web.archive.org/web/20010127083500/http://home.netscape.com/eng/mozilla/ns6/relnotes/6.0.html"&gt;what it looked like
originally&lt;/a&gt;.
This site  has seen so many redirects over the years - it'd be a fun exercise to
go through all of the indexed versions of this kind of site to see how people
tried to preserve links. For example, I found out in 2010 it 301s ("Temporary
redirect") to http://www.netscape.com/eng/mozilla/ns6/relnotes/6.0.html which
then 302s ("Permanent redirect") to
http://www.propeller.com/eng/mozilla/ns6/relnotes/6.0.html - which &lt;em&gt;was&lt;/em&gt; indexed
but happens to be a 404 ("Page not found") error page, at least in 2008.
But this wasn't what we came here for, so this yak can roam free among the
hills, the valleys, and the caverns of our minds.&lt;/p&gt;
&lt;p&gt;... for now...&lt;/p&gt;
&lt;h1 id="where-were-we"&gt;Where were we?&lt;/h1&gt;
&lt;p&gt;Oh right, we have to choose an install option. Back in the day I might have
clicked "recommended" here, but we're not back in the day, and who wants to play
life on easy mode?  Let's go custom to see what the options are (I &lt;strong&gt;am&lt;/strong&gt; a
control freak, after all)&lt;/p&gt;
&lt;p&gt;&lt;img alt="Custom Install Option selected" src="/blog/images/infra/netscape-02-custom.jpg"&gt;&lt;/p&gt;
&lt;p&gt;and immediately get another pop up:&lt;/p&gt;
&lt;p&gt;&lt;img alt="&amp;quot;Create install directory?&amp;quot; prompt" src="/blog/images/infra/netscape-consent-dir.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Whoa, let's pause here for a moment.&lt;/p&gt;
&lt;p&gt;I am &lt;strong&gt;digging&lt;/strong&gt; such a consent model. The installer is establishing trust:  it
will not try to do anything behind my back and without my permission. I'm sure
it will never abuse that trust. As a 2001 user, I sure am glad that folks
involved with computing have such a well-develop sense of ethics. In 2001, the
Future is bright. Computing will be filled with transparency. Consumer software
and services will be built by folks with a strong moral compass. These are
people with &lt;em&gt;principles&lt;/em&gt;. With the dot-com bubble burst, we've swiftly
inoculated tech from sleazy opportunists. It won't fall victim to the excesses
and greed rivaling Wall Street in the 80s...&lt;/p&gt;
&lt;p&gt;Which reminds me - how is it that this brilliant video only has 277 thousand
views? Here's a excerpt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your users won't always &lt;em&gt;understand&lt;/em&gt; just how much economic sense it makes to
sell them out. And you don't want to alienate them, that would drive down
their value.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;iframe width="560" height="315"
src="https://www.youtube-nocookie.com/embed/w8c_m6U1f9o?rel=0" frameborder="0"
allow="autoplay; encrypted-media" allowfullscreen&gt;
"It won't always kk
( &lt;a href="https://www.youtube-nocookie.com/embed/w8c_m6U1f9o?rel=0"&gt;video&lt;/a&gt; )
&lt;/iframe&gt;

&lt;p&gt;By the way - the embed code I used above uses the youtube-nocookie.com domain -
which is still from the folks at Goolag, but does what it says on the tin and
doesn't issue cookies. Also, did you know there used to be a way to disable
those annoying related video links from popping up at the end of the video? It's
true. You used to be able to just append a &lt;code&gt;rel=0&lt;/code&gt; query parameter to not show
related videos. But the corporate
overlord bean counters didn't like that. They had to make sure that kids would
get glued to the site by feeding them progressively conspiratorial garbage
content. So that watching any video would nearly guarantee to pull them into the
black hole cesspool of maximally "engaging" "content". What was that quote about
users again? Ah yes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your users won't always &lt;em&gt;understand&lt;/em&gt; just how much economic sense it makes to
sell them out. And you don't want to alienate them, that would drive down
their value.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ok, so, in fairness, &lt;code&gt;rel=0&lt;/code&gt; query parameter still does &lt;em&gt;something&lt;/em&gt;. It limits
the suggested videos to the channel they are from. That's good. But what
happens if we follow one of those links? First, we end up on the full youtube
site, so that means the cookies are back. &lt;em&gt;Hurray for surveillance capitalism!&lt;/em&gt;
Also, the recommendations on the right are curated specifically for us, and not
limited to the channel the previous video was one. &lt;em&gt;Goodbye, &lt;code&gt;rel=0&lt;/code&gt;!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-custom-parts.jpg"&gt;&lt;/p&gt;
&lt;p&gt;So I have to install Navigator, but I can unselect Mail, Instant Messenger, and
Spell Checker... I don't need mail, but whatever, let's just go with the
defaults.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-custom-parts2.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Oh, look at all this wonderful bundled crapware. Just in case you had any doubts.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-custom-parts3.jpg"&gt;&lt;/p&gt;
&lt;p&gt;That last one made me throw up a little in my mouth.&lt;/p&gt;
&lt;p&gt;I opt for just the classic skin - and it tells me that the total download size
will be 9959 K.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-custom-parts4.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I thought about censoring this next screenshot, but 15 year old me wouldn't have
like that... What's in the shot is in the shot..&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-program-folder.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Alright, and when the installation finished here's what we're greeted with:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-phones-home.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Did software in 2001 try to phone home? "activation.netscape.com could not be
found." sure seems so.&lt;/p&gt;
&lt;h1 id="yes-no-cancel"&gt;Yes, No, Cancel?&lt;/h1&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-vague-yes-no-cancel.jpg"&gt;&lt;/p&gt;
&lt;p&gt;What if I cancel?&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-loaded.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Alright, let's go for broke and get that retro look...&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-apply-theme.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-6-classic.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="redirects"&gt;&lt;/a&gt;
Remember all those redirects? Well the browser froze when I got overzealous,
clicked on "Interact" at the bottom there and chose to open chat...  And on the
next load, it crashed... And again...&lt;/p&gt;
&lt;p&gt;&lt;a class="thumb-link" href="#redirectsZoom"&gt;
&lt;img alt="Netscape 6 Frozen on Yahool Will be be right back page"
src="/blog/images/infra/netscape-6-not-responding.jpg" width=100%&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="#redirects" class="lightbox" name="redirectsZoom" &gt;
&lt;img alt="Netscape 6 Frozen on Yahool Will be be right back page"
src="/blog/images/infra/netscape-6-not-responding.jpg" width=100%&gt;
&lt;/a&gt;
It just kept crashing...&lt;/p&gt;
&lt;p&gt;In case anyone else gets stuck on the same issue ;) I got around this by using
the Profile Manager, where I had the option to start the browser in Work
Offline mode. Then I turn the "Work Online" option on after the browser loaded
(which you can do by plugging together that cute outlet pair on the bottom
left).&lt;/p&gt;
&lt;p&gt;&lt;a name="ego"&gt;&lt;/a&gt;
I do some ego surfing and go to my own site first.&lt;/p&gt;
&lt;p&gt;http://pirsquared.org&lt;/p&gt;
&lt;p&gt;&lt;a class="thumb-link" href="#pirrZoom"&gt;
&lt;img alt="pirsquared.org using Netscape 6"
src="/blog/images/infra/netscape-pirr.jpg" width=100%&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="#ego" class="lightbox" name="pirrZoom" &gt;
&lt;img alt="pirsquared.org using Netscape 6"
src="/blog/images/infra/netscape-pirr.jpg" width=100%&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I got too fancy with my unicode... But hey, this is totally functional.&lt;/p&gt;
&lt;p&gt;I made this Loading gif via a screen capture tool &lt;img
src="/blog/images/infra/netscape6-loading.gif"&gt; and then it finally clicked that not
only did &lt;em&gt;I&lt;/em&gt; not use Netscape 6 - I remember most everyone's experience was to
stick to the 4.x series, because it was so much more usable and not bloated with
nonsense, etc, etc.&lt;/p&gt;
&lt;p&gt;Alright, but at least I got 6 to run on Windows 10 and that works...When it
doesn't crash, anyway... But I did get a error about youtube-nocookie.com...
(some of the time, at least)...&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-youtube-nocookie-error.jpg"&gt;&lt;/p&gt;
&lt;p&gt;And then I
realized that I can't go to any site that has https... Because...
you know, the protocol that provides that 's' has changed over the years, and
our 2001 browser could do SSL 2 or 3 or  TLS 1.0... But my website uses TLS
1.3...&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blog/images/infra/netscape-https-nogo.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I couldn't run to duckduckgo, either, since it redirects plain http to
the https endpoint and that also runs TLS 1.3... I couldn't even go to
archive.org to view my old site directly on the way back machine, because
archive.org run TLS 1.2 at the moment.&lt;/p&gt;
&lt;p&gt;&lt;a name="revert"&gt;&lt;/a&gt;
It's difficult to find any place that still runs such outdated standards...
I tried to search for just a TLS 1.0 test server - but didn't find anything
suitable... But then I happen to flip through the recent changelog for Firefox:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Firefox 74 Reverting deprecation of TLS 1.0 and 1.1" src="/blog/images/infra/firefox-tls-disable-revert.png" width=90%&gt;&lt;/p&gt;
&lt;!-- &lt;a class="thumb-link" href="#revertZoom"&gt;
&lt;/a&gt;
--&gt;

&lt;!--
&lt;a href="#revert" class="lightbox" name="revertZoom" &gt;
&lt;img alt="Firefox 74 Reverting deprecation of TLS 1.0 and 1.1" src="/blog/images/infra/firefox-tls-disable-revert.png" width=100%&gt;
&lt;/a&gt;
--&gt;

&lt;p&gt;Cool - so now we know if we want to find TLS 1.0 and 1.1 website, we should
turn to the government of... damn a specific country wasn't specified...&lt;/p&gt;
&lt;p&gt;But wait a minute... Firefox 74.0 came out on March&lt;/p&gt;
&lt;p&gt;How did Mozilla release an update to a version of Firefox that was in the hands
of a bunch of users without... umn...what's the word I'm looking for here...you
know, that thing no one seems to think is a &lt;em&gt;thing&lt;/em&gt; anymore...  user consent?&lt;/p&gt;
&lt;h1 id="how-mozilla-released-an-update-without-user-consent"&gt;How Mozilla released an update without user consent&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://wiki.mozilla.org/Firefox/Normandy/PreferenceRollout"&gt;https://wiki.mozilla.org/Firefox/Normandy/PreferenceRollout&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;This is the way consent ends
This is the way consent ends
This is the way consent ends
Not with a bang but a whimper
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I'm late to the party - this has been going on for about three years - with
what I now recall was caused a bit of a splash back in 2017 (&lt;a href="https://drewdevault.com/2017/12/16/Firefox-is-on-a-slippery-slope.html"&gt;Drew DeVault
covers in "Firefox is on a slippery
slope"&lt;/a&gt;).
But I didn't know the extent of it. Who has the time to pay attention to the way
in which all the software they use changes in anti-social ways.&lt;/p&gt;
&lt;p&gt;Anyway, if you don't want the fine folks at Firefox to change your preferences
out from under you, I think you go to &lt;code&gt;about:config&lt;/code&gt; and switch the &lt;code&gt;app.normandy.enabled&lt;/code&gt; setting to &lt;code&gt;false&lt;/code&gt;. And if you're interested in specifics
of how you've been a guinea pig: &lt;code&gt;about:studies&lt;/code&gt; will tell you. And you can go
to &lt;code&gt;about:preferences#privacy&lt;/code&gt; to disable them.&lt;/p&gt;
&lt;p&gt;But I digress...&lt;/p&gt;
&lt;p&gt;&lt;a name="wrapup"&gt;&lt;/p&gt;
&lt;h1 id="lets-wrap-this-up"&gt;Let's wrap this up...&lt;/h1&gt;
&lt;p&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At this point, I used my 2020 browser to grab historical snapshot of my old
bookmarks site, stripping off the tastefully annotated Way Back Machine  user
interface insertions, and serve it locally over http via &lt;code&gt;python -m
http.server&lt;/code&gt;, making sure to change the URL bar to make a historically accurate
re-enactment. And now that you know how I got here, you can fully appreciate the
effort that went into this next screenshot:&lt;/p&gt;
&lt;p&gt;&lt;a class="thumb-link" href="#bookmarksZoom"&gt;
&lt;img alt="My bookmarks Gallore site in Netscape 6" src="/blog/images/infra/netscape-bookmarks-gallore.jpg" width=100%&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="#wrapup" class="lightbox" name="bookmarksZoom" &gt;
&lt;img alt="My bookmarks Gallore site in Netscape 6" src="/blog/images/infra/netscape-bookmarks-gallore.jpg" width=&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So much so, that I couldn't resist making a video a scroll through :&lt;/p&gt;
&lt;video controls style="width:100%"&gt;
&lt;source src="/blog/images/infra/bookmarks_gallore.mp4" type="video/mp4"&gt;
&lt;source src="/blog/images/infra/bookmarks_gallore.webm" type="video/webm"&gt;
&lt;source src="/blog/images/infra/bookmarks_gallore.ogg" type="video/ogg"&gt;
&lt;!-- &lt;img src="/blog/images/infra/bookmarks_gallore.gif"&gt; --&gt;
No video? Oh well.
&lt;/video&gt;

&lt;p&gt;You can download it as &lt;a href="/blog/images/infra/bookmarks_gallore.webm"&gt; webm&lt;/a&gt;,
&lt;a href="/blog/images/infra/bookmarks_gallore.mp4"&gt; mp4&lt;/a&gt;,
&lt;a href="/blog/images/infra/bookmarks_gallore.ogg"&gt; ogg&lt;/a&gt;,
or &lt;a href="/blog/images/infra/bookmarks_gallore.gif"&gt; gif&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you're interested - you can go &lt;a href="https://web.archive.org/web/20011028085942/http://p.laya.com/bookmarks/"&gt;http://p.laya.com/bookmarks/ (archival copy)&lt;/a&gt;
or see the rest of &lt;a
href="https://web.archive.org/web/20011025032156/http://p.laya.com/"&gt;p.laya.com
from 2001&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="thats-all"&gt;That's all&lt;/h1&gt;
&lt;hr&gt;
&lt;p&gt;The ongoing crisis has been a circuit breaker to our usual patterns.
I am taking advantage of this affordance to experiment with and establish
channels of communications that are not controlled by others.&lt;/p&gt;
&lt;hr&gt;</content><category term="technology"></category><category term="python"></category><category term="pheriday"></category><category term="infrastructure"></category><category term="hello-world"></category></entry><entry><title>Uvas Gold 200</title><link href="//pirsquared.org/blog/uvas-gold-200.html" rel="alternate"></link><published>2019-09-17T00:00:00-07:00</published><updated>2019-09-17T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2019-09-17:/blog/uvas-gold-200.html</id><content type="html">&lt;p&gt;My poem about a rainy 200k was published in the Fall 2019 issue of &lt;a href="https://rusa.org/pages/magazine"&gt;American Randonneur&lt;/a&gt; (a quarterly magazine published by &lt;a href="https://rusa.org"&gt;Randonneurs USA&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I've been doing &lt;em&gt;samizdat&lt;/em&gt; poetry for as long as I've had a web presence (since 1999), but I am now officially a published poet! (I am deliberately not counting the embarrasing hackjob that was published in a youth anthology when I was in 8th grade.)&lt;/p&gt;
&lt;p&gt;You can find "Uvas Gold 200" on page 26 - either &lt;a href="https://www.pageturnpro.com/Progress-Printing/91850-American-Randonneur-Fall-2019/sdefault.html#page/28"&gt;directly on this skeuomorphic leafing viewer&lt;/a&gt; or the &lt;a href="https://rusa.org/Download/nl/AR_Fall_2019.pdf"&gt;PDF&lt;/a&gt;, but I'm republishing both the exposition blurb and the poem below. If you prefer to listen, I recorded a reading of it that you can download in different flavors: 
 &lt;a href="/audio/uvas_gold.mp3"&gt;a local audio only&lt;/a&gt;, &lt;a href="/video/uvas%20gold.mp4"&gt;a local video&lt;/a&gt;, or the embeded video version below.&lt;/p&gt;
&lt;iframe width="560" height="315"
    src="https://www.youtube-nocookie.com/embed/DwQ61db8bBE?rel=0" frameborder="0"
allow="autoplay; encrypted-media" allowfullscreen&gt;
&lt;/iframe&gt;

&lt;p&gt;&lt;img alt="American Randonneur Fall 2019 header" src="/blog/images/AR_Fall2019.jpg" width="100%"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Uvas Gold 200k starts and ends in Fremont, CA and was
held on Saturday, December 1st, 2018. The ride frontloads
the climbing by going nearly half-way up Mount Hamilton,
the tallest peak in the San Francisco Bay Area, and then
leads down south as far as Gilroy, "Garlic Capital of the
World." Our RBA, Rob Hawks, sent this note the evening
before the ride: "While we once had 75 riders signed up,
we are now down to 59 even though a number of new names
have been added since this was sent out on Monday." It
had been a foul weather week, and by the time we were
ready to start in rain at a balmy 48 degrees Fahrenheit,
there were fewer than thirty people who would brave the
cold wetness. The rain was at its worst the first half of
the ride, so my memories are skewed toward that portion,
with the poem content reflecting that. Call it Inverted
Randonesia, the second half of the ride was just spent
processing how I made it through the beginning of the day
and how epic it was.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Weaving upstream the icy slush
Mount Ham – no cheese
Rough grind of gears and teeth
Steam locomotive breath
The paceline I abandon
Time stretched – warm pizza dough
Intent, attention rising
I take a pull
Thick spray across my rhythmic fogging glasses

Our feet make Revolutions, Randonneur!
With pavement gliding under top tube
It&amp;#39;s all the same to you
Mile-marker Marxist
Unbound by thermal fear
&amp;quot;Fair-weather cyclist&amp;quot; you are not

A dreamy cold wet blanket smoky charcoal skyscape
High pitched frying sizzle
Tire fully splashing
The tug of war of winds where we&amp;#39;re the rope
Off camber turn, soprano yodeling disc brakes yards ahead
Refreshing wafting garlic wake up – dreamy ride continues
Alert again in the slow slither through Coyote Creek

K-Hound chasing, headwind facing
Camaraderie, half-way in Gilroy supermarket shack
Then on the road again, occasional &amp;quot;Car back!&amp;quot;
December, Northern California, Reign of Rain
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!-- [![SFR logo](http://pirsquared.org/blog/images/SFR_logo.gif)](https://sfrandonneurs.org/) --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;                   _
                  / \
                A*   \^   -
             ,./   _.`\\ / \
            / ,--.S    \/   \
           /  `&amp;quot;~,_     \    \
     __o           ?
   _ \&amp;lt;,_         /:\
--(_)/-(_)----.../ | \
--------------.......J
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="cycling"></category><category term="cycling"></category><category term="randonneuring"></category><category term="poetry"></category><category term="journal excerpt"></category></entry><entry><title>My first DNF (Ft Bragg 600k)</title><link href="//pirsquared.org/blog/first-dnf.html" rel="alternate"></link><published>2019-05-13T00:00:00-07:00</published><updated>2019-05-13T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2019-05-13:/blog/first-dnf.html</id><content type="html">&lt;p&gt;&lt;img alt="SFR logo" src="//pirsquared.org/blog/images/SFR_logo.gif"&gt;&lt;/p&gt;
&lt;p&gt;It's been six years since my first ride with &lt;a href="https://sfrandonneurs.org/"&gt;The San Francisco
Randonneurs&lt;/a&gt; and four years since &lt;a href="//pirsquared.org/blog/first-200k.html"&gt;my first
200k&lt;/a&gt;. I've ridden 18 rides that are at least that
distance since then (3x 300k, 2x 400k, 1x
600k), completing my first Super Randonneur Series (2-, 3-, 4-, and 600k in one
year) last year after not riding much the year before that. And this weekend I
had my first DNF result on the &lt;a href="https://ridewithgps.com/routes/29493511"&gt;Fort Bragg
600k&lt;/a&gt;. I &lt;strong&gt;&lt;em&gt;D&lt;/em&gt;&lt;/strong&gt;id &lt;strong&gt;&lt;em&gt;N&lt;/em&gt;&lt;/strong&gt;ot &lt;strong&gt;&lt;em&gt;F&lt;/em&gt;&lt;/strong&gt;inish. &lt;/p&gt;
&lt;p&gt;The best response to my choice of abandoning the ride to enjoy the campground
came from Peter Curley, who said "That was a &lt;em&gt;very&lt;/em&gt; mature decision." A clear
departure from typical randonneuring stubbornness and refusal to give up, I
celebrated my decision to quit as a victory when I arrived at the campground and
made my announcement to the volunteers. I think I was so energetic about it that
they did not believe me. I was being kind to myself, to my body, and at peace
with the decision by the time I rolled in.&lt;/p&gt;
&lt;p&gt;I ride for myself. I ride because it feels good. I ride to challenge my body, to
be alone: just my thoughts, my legs, and the road. This weekend, my legs felt
strong. Stronger than they did a year ago when I finished the ride. But my
objective was different. &lt;a href="https://rusa.org/pages/pbp"&gt;Paris-Brest-Paris&lt;/a&gt; is a
1200 kilometer ride across France which must be completed in under 90 hours that
runs once every four years. I have been telling anyone who would listen once
they found out about my cycling proclivity about how it is my intent to ride PBP
this year for the last two years.  That was still my intent this year, and it
was my intent during much of the 600k. &lt;/p&gt;
&lt;p&gt;But I was not willing to do so at any cost. Thoughts have been lingering about
whether these distances are worth it for me since the 2018 Hopland 400k, where I
threw up at the last control and struggled to the finish. Nausea again caught me
just outside of this same campground in the outbound direction on the Fort Bragg
600k ride last year. This year on Hopland, though riding stronger overall and
conserving my strength, I joined a fantastically energetic group and rode too
hard before that last control and threw up there again. Though getting much more
sleep and feeling fresher at the end, I finished within minutes of my time the
previous year (24 hours). &lt;/p&gt;
&lt;p&gt;I rode mostly alone on this ride. After letting go of the lead pack on the
Camino Alto climb, only a pair of Santa Cruz Randonneurs' jerseys passed me
between there and Point Reyes Station. I rolled out of Point Reyes on my own,
gaining the only company I had for this ride by catching up to and following a
pair of riders on the climbs on Point Reyes-Petaluma road. My legs felt good, I
was not pushing too hard, just a sustained and seemingly sustainable effort. I
made it to Healdsburg at half past noon. Six and a half hours to cover 88 miles.
Perhaps I ate too much here, opting for both a small chicken noodle soup, and
some sushi, whereas I usually eat just the soup. Still making progress to
Cloverdale, I briefly chatted with a Texan who was visiting and exploring the
local routes, crossed and then rode along the cycling leg of an Iron Man event
that was going in the opposite direction. &lt;/p&gt;
&lt;p&gt;I was starting to be affected by the heat. It wasn't &lt;em&gt;that&lt;/em&gt; warm, but I needed to
stop at a brand name coffee place in Cloverdale, and had a fizzy water with just
a tad bit of juice to regain composure for the climb up 128. The climb rolled
along nicely, I shifted down and just kept pedaling at a steady pace and easy
effort. But I wasn't eating anymore. By the time I got to Yorkville, I needed
another break, and luckily Michael had just stopped at the Yorkville Market, so
I decided to stop, too. I got another carbonated beverage, a cherry cola this
time, and in what might have been another mistake - honey-mustard flavored
pretzel pieces. When I first started riding brevets, salted peanut-butter-filled
pretzel pieces were a staple go-to in my basket - I'd just reach down to grab a
few every couple of minutes. I thought about reaching for the simpler salted
pretzel sticks this time, because I never have trouble consuming simple salted
unflavored bread products, but the lizard brain sabotaged the rational
sensibilities and swayed the scales in favor of the honey-mustard, which also
had some sugar. As a little glimpse into my somewhat delirious state, I thought
I had seen four to six cats in the shop. When I asked the proprietor, it turns
out there were only two. She wished me a good ride, to be careful on highway 1,
and asked if I thought I could make it to the camp before dark. I expressed
serious doubts about that, but it turns out I was wrong. &lt;/p&gt;
&lt;p&gt;I got to Boonville, another dozen miles out, and took another break, the
nausea kicking in again. The next five miles I started to get cold, the sun not
yet setting but the cold ocean headwind was starting to take its toll. I
stopped to get dressed, and deliberately cycled past the campground without
stopping there for another rest though I probably could have used it. And then
something clicked in my head. A had been trying to fit a great deal many things
in life but cycling had begun dwarfing all my other joys and pursuits this year.
My reward for finishing the 600k would have been to train more, probably ride
the &lt;a href="https://norcalbrevetweek.org"&gt;NorCal Brevet week&lt;/a&gt; in June, to get ready for
PBP and ride that in August. Instead of PBP, I'll be taking a break.&lt;/p&gt;
&lt;p&gt;Randonneuring can be addictive. You keep putting goals out and keep
accomplishing them, so you set higher, more challenging goals. Rinse and repeat.
This year, cycling has started to become a kind of rat race for me. Yes, I still
enjoy cycling, very much, but it has started to grind me down. I lost sight of
why I enjoy this sport so much to begin with.&lt;/p&gt;
&lt;p&gt;I decided to stop. I decided to exert and reaffirm control over what I value in
life. The campground was by far the biggest highlight of my 2018 finish on this
ride. I was the very last rider into the overnight control, rolling in half-past
3am or so. I sat myself down on one of the folding chairs in front of the
fire pit, was fed without having to get up, and drifted off in that same spot
around 4am. Two hours later, before I could open my eyes, my olfactory system
was cannonballed into a perfect aroma pool of fresh coffee and bacon. &lt;em&gt;"This is
AMAZING!"&lt;/em&gt; That campground served as my magical site of rejuvenation after just
two hours of sleep. My spirits lifted, though I did hang out longer than most at
breakfast that year, in no rush to head out, taking in the gurgling creek, the
majestic towering redwoods all around, inhaling and ingesting the sights and
sounds and smells all around.&lt;/p&gt;
&lt;p&gt;So less than 12 hours and 145 miles into the ride, and a few miles past the
Indian Creek Campground that was the planned overnight, I decided to turn around
and go directly there. It was about 40 miles to the Safeway in Fort
Bragg, 42 miles back. I could have done it. I could have taken a break, even
after I got to the campground. There was plenty of time left on the clock.&lt;/p&gt;
&lt;p&gt;I could have finished the ride. The weather was great, and I had plenty of
clothes to keep me warm, something I learned to appreciate on this ride the year
before, confusing being cold with being exhausted, and quickly regaining my legs
after finally throwing a jacket on. I could have finished the ride, but I also
needed to get off the treadmill, the hamster wheel that was starting to grind
away at a sense of balance in life. I've been spending more and more time on the
bike recently, and not because I was so thoroughly enjoying it. It had become
almost a job. Not a particularly unpleasant one, I &lt;em&gt;like&lt;/em&gt; riding bikes, but the
compulsory nature of it did not sit well with me. I rode in the rain to work. I
rode in the hotel gym morning before and again at night after while traveling
for a conference the week before. I was just biking too much. Too many other
parts of my life were getting squeezed out to make room for the PBP effort. I
still want to ride PBP, but letting go of this year's attempt is what I need to
focus on other important aspects of life.&lt;/p&gt;
&lt;p&gt;So after I had a beer and regained composure, I switched modes. Chatting with
the volunteers during much of the night. Then as the riders started to come in,
we'd offer them food, refilling plates when they were done and still hungry,
insisting they can stay seated. Reed, a fellow campground DNFer, and I kept
mentioning how we were earning our keep. Conversation flowed, lots of chuckling,
story telling, sharing of experiences. I'll treasure these hours I spent in camp
instead of on the bike. Chuck graciously offered me a tent and a sleeping bag
and I was in bed a quarter to 11pm, fed and off the bike for 5 hours by then. It
would probably have taken me again until 3am had I continued to Fort Bragg. I
got 7 hours of sleep, instead of 2. It was a DNF, but it was also a DHF - I
&lt;strong&gt;&lt;em&gt;D&lt;/em&gt;&lt;/strong&gt;id &lt;strong&gt;&lt;em&gt;H&lt;/em&gt;&lt;/strong&gt;ave &lt;strong&gt;&lt;em&gt;F&lt;/em&gt;&lt;/strong&gt;un. :)&lt;/p&gt;
&lt;p&gt;The campground volunteers were rock solid! Eric and Arthur the big goofball
dog, Grace and Rick, the two co-owners of Bo the smaller goofball dog, Aaron,
Sourav, Chuck, Robert, Reed. Thank you all for such an memorable experience. It
was a privilege to spend several hours with you. Thank you.&lt;/p&gt;
&lt;p&gt;We cleaned up and packed up in the morning after the riders left. Chuck has an
amazing van set up to carry up to 8 (!!) bikes, offered a ride for our bikes.
Sourav offered to deliver our bodies. On the way back, Reed, Sourav and I
discussed just how special and unique the &lt;a href="https://sfrandonneurs.org/"&gt;San Francisco
Randonneurs&lt;/a&gt; community is. The level of and
attention to detail, the shared sense of purpose, the volunteer involvement.
&lt;strong&gt;Thank you Rob Hawks. Thank you to everyone who volunteers to support SFR rides.&lt;/strong&gt;
Thank you to everyone who rides, you give us plausible deniability: we can't
&lt;em&gt;all&lt;/em&gt; be crazy :)&lt;/p&gt;
&lt;p&gt;Carrying my bike as I climbed up the long sets of stairs from the BART station
platform this morning, I had a liberating realization. It was the first time in
a long while that I was not internally justifying the effort as "this will help
me on PBP". I was once again doing it for the sole simple reason that this is just
what I do.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;                   _
                  / \
                A*   \^   -
             ,./   _.`\\ / \
            / ,--.S    \/   \
           /  `&amp;quot;~,_     \    \
     __o           ?
   _ \&amp;lt;,_         /:\
--(_)/-(_)----.../ | \
--------------.......J
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="cycling"></category><category term="cycling"></category><category term="randonneuring"></category></entry><entry><title>PyCon2019 poem</title><link href="//pirsquared.org/blog/pycon2019-poem.html" rel="alternate"></link><published>2019-05-03T00:00:00-07:00</published><updated>2019-05-03T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2019-05-03:/blog/pycon2019-poem.html</id><content type="html">&lt;p&gt;I'm back in Cleveland for another &lt;a href="https://us.pycon.org/2019"&gt;Pycon&lt;/a&gt;. Yesterday
was my first full day here. Along with &lt;a href="https://twitter.com/codeseal"&gt;Matt
Seale&lt;/a&gt;,  I
was a helper at &lt;a href="https://twitter.com/Mbussonn"&gt;Matthias Bussonnier&lt;/a&gt; tutorial ("&lt;a href="https://us.pycon.org/2019/schedule/presentation/95/"&gt;IPython and Jupyter in Depth: High
productivity, interactive Python&lt;/a&gt;). The sticky system
is efficient at signaling when someone in a classroom needs help, and a lot of
folks don't know that this practice was popularized by Software
Carpentry workshops and continues to be used at &lt;a href="https://carpentries.org/"&gt;The Carpentries&lt;/a&gt;.&lt;/p&gt;
&lt;!-- .. ([in case you missed it, the merger of Software and Data Carpentries](https://software-carpentry.org/blog/2017/09/merger.html).) --&gt;

&lt;p&gt;&lt;img alt="Explanation of The Carpentries Sticky system: &amp;quot;It is easy to get help.
We use a system of sticky notes to allow learners to seek help without having to
call attention to themselves or interrupt the Instructor’s flow. Learners are
issued sticky notes of two different colours - generally red and green - and use
them to signal ‘it’s all good’ or ‘I need help’. When a learner posts a red
sticky, a helper in the room will assist them to get back on track&amp;quot;" src="/blog/images/carpentries_stickies.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I stepped out for a coffee refill and bumped into a large contingent of
Bloomberg folks I'd never met (Princeton office). I guess we have something like
90 people at the conference this year, and I made the usual and true remark about
how I go to conferences to meet the other people who work at our company. Then
after his tutorial concluded, Matthias and I bumped into &lt;a href="https://en.wikipedia.org/wiki/Tracy_Teal"&gt;Tracy
Teal&lt;/a&gt;, exchanged some stickers, and
chatted about &lt;a href="https://carpentries.org/"&gt;The Carpentries&lt;/a&gt;,
&lt;a href="https://jupyter.org"&gt;Jupyter&lt;/a&gt;, organizing conferences, governance and
sponsorship models, and a bunch of other stuff. &lt;/p&gt;
&lt;p&gt;Matthias was a good influence in trying to participate in the swag bag stuffing,
but it turned out we had almost an hour to &lt;s&gt;kill&lt;/s&gt; maim (we decided injury's a
better fate than death for that hour). Luckily, we bumped into &lt;a href="https://twitter.com/john_lam"&gt;John
Lam&lt;/a&gt; and proceeded to chat away and entertain one
another. The swag bag stuffing was really fun - highly recommend it to everyone!
Smart people performing a task that allows for lots of banter and brief social
interaction turn while there's music and a chance to move around turns out to be
a good way to have time continue flying by. Too many people to name here, but
&lt;a href="https://twitter.com/scopatz"&gt;Scopz&lt;/a&gt; was there and we made terrible puns, as
usual.&lt;/p&gt;
&lt;p&gt;After the swag bag stuffing party, reconnected with Tracy and we chatted some
more while walking around and picking up swag (mostly socks), joined by &lt;a href="https://twitter.com/gilforsyth"&gt;Gil
Forsyth&lt;/a&gt; who handed me &lt;a href="https://xon.sh/"&gt;Xonsh&lt;/a&gt;
sticker, bumped into &lt;a href="https://twitter.com/SShanabrook"&gt;Saul Shanabrook&lt;/a&gt;. Then
stopped by to say hi to Jess, a friend of &lt;a href="https://twitter.com/annavudo"&gt;Anna
Vu&lt;/a&gt;'s, whom I only ever see at PyCon), and then
chatted with &lt;a href="https://twitter.com/scottbsanderson"&gt;Scott Sanderson&lt;/a&gt;, met &lt;a href="https://twitter.com/hugobowne"&gt;Hugo
Bowne-Anderson&lt;/a&gt;, and got to briefly greet
&lt;a href="https://www.nmrglue.com/jhelmus/"&gt;Jonathan Helmus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I walked Matthias to his hotel, then went back to Butcher and the Brewer (again,
Matthias joined me for dinner there the night before), and wrote out the poem
you'll find below. After I wrote it, a bunch of my Bloomberg colleagues showed
up, and I ended up chatting for long time with &lt;a href="https://johnpurviance.com/"&gt;John
Purviance&lt;/a&gt;. In keeping with tradition, though we
work at the same company, I met John by accident at a coffee shop during last
year's Pycon (he works in the New York office, whereas I'm in SF).&lt;/p&gt;
&lt;p&gt;One day down, and it's already been a wonderful Pycon.&lt;/p&gt;
&lt;h1 id="pycon-2019"&gt;Pycon 2019&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;May 2nd, Pycon Cleveland Two, as well
The social wealth observed, created
not jaded, lots to say and listen to
Bring energy and silliness, too
My objective to subjectively inject 
a crack and tear decorum fabric
be vulnerable
a buzzing bee
break up the swag bag stuffing monotony
walk the path, switch sides, talk trash
Great folks, give stickers, smiles, rehash
A splash of warmth, a squak, a &amp;quot;BAM!&amp;quot;
A nudge - we jam enjoying this team work
not work at all - a play - a sandbox
roles all clear yet much room left 
to improvise
Devise a way to make us laugh
each finds their path
rocking forth and back
swaying fro and too
a rhythm of a train a-moving
Clapping celebration when we&amp;#39;re done
&amp;quot;Hey-hey! We&amp;#39;re done!&amp;quot; - a dinner earned
and well deserved - many socks collected
New people met and old friends reconnected
Tutorials and opening reception done
and now Pycon 2019&amp;#39;s officially begun
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="life"></category><category term="journal excerpt"></category><category term="poetry"></category><category term="pycon"></category><category term="python"></category></entry><entry><title>Get in it</title><link href="//pirsquared.org/blog/get-in-it.html" rel="alternate"></link><published>2018-06-12T00:00:00-07:00</published><updated>2018-06-12T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2018-06-12:/blog/get-in-it.html</id><content type="html">&lt;p&gt;Two weeks ago, &lt;a href="https://jupyter.org/"&gt;Project Jupyter&lt;/a&gt; had our only planned team
meeting for 2018. There was too much stuff going on for me to write a poem
during the event as I had in previous years
(&lt;a href="//pirsquared.org/blog/november-9th-2016.html"&gt;2016&lt;/a&gt;, and
&lt;a href="//pirsquared.org/blog/june-1st-2017.html"&gt;2017&lt;/a&gt;), so I ended up reading one of the pieces I
wrote during my evening introvert breaks in Cleveland at PyCon a few weeks
earlier.&lt;/p&gt;
&lt;p&gt;Once again, &lt;a href="http://fperez.org/"&gt;Fernando&lt;/a&gt; and &lt;a href="https://twitter.com/Mbussonn"&gt;Matthias&lt;/a&gt; had their gadgets ready to record (thank you both!). The video below was taken by Fernando.&lt;/p&gt;
&lt;iframe name="getinit" width="560" height="315"
src="https://www.youtube-nocookie.com/embed/kQNKUtbg8SY?rel=0" frameborder="0"
allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://www.youtube-nocookie.com/embed/kQNKUtbg8SY?rel=0"&gt;click to view the video&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="get-in-it"&gt;&lt;code&gt;Get in it&lt;/code&gt;&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Time suspended
Gellatinous reality - the haze
submerged in murky drops summed
in swamp pond of life

believe and strive, expand the mind
A state sublime, when in your prime you came to
me and we were free to flow and fling our
cares, our dreams, our in-betweens, our
rêves perdues, our residue -- the lime of light
the black of sight -- all these converge and
merge the forks of friction filled with fright
and more -- the float of logs that plunges deep
beyond the fray, beyond the keep -- a leap of faith
the lore of rite, with passage clear, let
fear subside, the wealth of confidence will
rise and iron out wrinkles of doubt

Commit to change and stash your pride
then push your luck, and make amends.
Branch out your thoughts, reset assumptions
then checkout.

The force of pulls t&amp;#39;wards master class
Remote of possibilities. Rehash the past
Patch up the present -- what&amp;#39;s the diff?

There&amp;#39;s nothing left -- except to glide -- and
soar beyond your frame of mind.  try not to pry
cry, freedom, cry.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="life"></category><category term="journal excerpt"></category><category term="poetry"></category><category term="pycon"></category><category term="jupyter"></category><category term="python"></category></entry><entry><title>SciPy 2018 dates and call for abstracts</title><link href="//pirsquared.org/blog/scipy2018-cfp.html" rel="alternate"></link><published>2017-12-14T00:00:00-08:00</published><updated>2017-12-14T00:00:00-08:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2017-12-14:/blog/scipy2018-cfp.html</id><content type="html">&lt;p&gt;I'm helping with next year's &lt;a href="https://scipy2018.scipy.org"&gt;SciPy conference&lt;/a&gt;, so here are the details:&lt;/p&gt;
&lt;h2 id="july-9-15-2018-austin-texas"&gt;July 9-15, 2018 | Austin, Texas&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Tutorials&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;July&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;
&lt;span class="n"&gt;Conference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Talks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Posters&lt;/span&gt;&lt;span class="o"&gt;):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;July&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;
&lt;span class="n"&gt;Sprints&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;July&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;SciPy 2018, the 17th annual Scientific Computing with Python conference, will be held July 9-15, 2018 in Austin, Texas. The annual SciPy Conference brings together over 700 participants from industry, academia, and government to showcase their latest projects, learn from skilled users and developers, and collaborate on code development. The call for abstracts for SciPy 2018 for talks, posters and tutorials is now open. The deadline for submissions is February 9, 2018.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Conference Website: &lt;a href="https://scipy2018.scipy.org"&gt;https://scipy2018.scipy.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Submission Website: &lt;a href="https://easychair.org/conferences/?conf=scipy2018"&gt;https://easychair.org/conferences/?conf=scipy2018&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="_1"&gt;&lt;/h1&gt;
&lt;h1 id="talks-and-posters-july-11-13-2018"&gt;Talks and Posters (July 11-13, 2018)&lt;/h1&gt;
&lt;p&gt;In addition to the general track, this year will have specialized tracks focused on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Data Visualization&lt;/li&gt;
&lt;li&gt;Reproducibilty and Software Sustainability&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="_2"&gt;&lt;/h1&gt;
&lt;h1 id="mini-symposia"&gt;Mini Symposia&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Astronomy&lt;/li&gt;
&lt;li&gt;Biology and Bioinformatics&lt;/li&gt;
&lt;li&gt;Data Science&lt;/li&gt;
&lt;li&gt;Earth, Ocean and Geo Science&lt;/li&gt;
&lt;li&gt;Image Processing&lt;/li&gt;
&lt;li&gt;Language Interoperability&lt;/li&gt;
&lt;li&gt;Library Science and Digital Humanities&lt;/li&gt;
&lt;li&gt;Machine Learning&lt;/li&gt;
&lt;li&gt;Materials Science&lt;/li&gt;
&lt;li&gt;Political and Social Sciences&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There will also be a SciPy Tools Plenary Session each day with 2 to 5 minute updates on tools and libraries.&lt;/p&gt;
&lt;h1 id="tutorials-july-9-10-2018"&gt;Tutorials (July 9-10, 2018)&lt;/h1&gt;
&lt;p&gt;Tutorials should be focused on covering a well-defined topic in a hands-on manner. We are looking for awesome techniques or packages, helping new or advanced Python programmers develop better or faster scientific applications. We encourage submissions to be designed to allow at least 50% of the time for hands-on exercises even if this means the subject matter needs to be limited. Tutorials will be 4 hours in duration. In your tutorial application, you can indicate what prerequisite skills and knowledge will be needed for your tutorial, and the approximate expected level of knowledge of your students (i.e., beginner, intermediate, advanced). Instructors of accepted tutorials will receive a stipend.&lt;/p&gt;
&lt;p&gt;Mark Your Calendar for SciPy 2018!&lt;/p&gt;</content><category term="technology"></category><category term="python"></category><category term="scipy2018"></category><category term="conference"></category></entry><entry><title>SciPy 2017 tips</title><link href="//pirsquared.org/blog/scipy2017.html" rel="alternate"></link><published>2017-07-10T00:00:00-07:00</published><updated>2017-07-10T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2017-07-10:/blog/scipy2017.html</id><content type="html">&lt;p&gt;After missing it for a couple of years, I am happy to be back in Austin, TX for
SciPy this week!&lt;/p&gt;
&lt;p&gt;Always invigorating and exhilarating, &lt;a href="https://scipy2017.scipy.org/ehome/index.php?eventid=220975&amp;amp;"&gt;Scientific Computing with Python
(SciPy)&lt;/a&gt;
has remained a top quality venue for getting together with fellow Pythonistas,
especially the academically-bent variety.&lt;/p&gt;
&lt;p&gt;As a graduate student eight years ago, &lt;a href="http://twitter.com/ivanov/status/2648139681"&gt;I was fortunate enough to be one of
receive sponsorship&lt;/a&gt; and attended
my first SciPy - &lt;a href="http://conference.scipy.org/SciPy2009/"&gt;SciPy
2009&lt;/a&gt;. This was the last time it was
held at CalTech in Pasadena, CA.&lt;/p&gt;
&lt;p&gt;@ivanov/status/2648139681&lt;/p&gt;
&lt;p&gt;The following year, in 2010, at the first SciPy held in its now usual spot in Austin, TX,
each attendee got a bottle of delicious salsa! &lt;/p&gt;
&lt;p&gt;&lt;img alt="SciPy2010 Salsa Stack" src="./images/scipy2010.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Here are some oy my thoughts about attending this wonderful conference.&lt;/p&gt;
&lt;h2 id="conference-tips"&gt;Conference Tips&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;bring a sweatshirt&lt;/strong&gt; -- Yes, I know Austin's hot, but at the AT&amp;amp;T center, they
don't mess around and crank the air conditioning all the way up to 11! &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;join the slack group&lt;/strong&gt; -- This year, there's a Slack group for SciPy: the
link to join is in a pair of emails with the titles "Getting the most out of
SciPy2017" and "Getting the most out of SciPy2017-UPDATED", both from SciPy2017
Organizers. So far at the tutorials slack has served as a useful back channel
for communicating repo URLs and specific commands to run, signaling questions
without interrupting the speakers' flow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;engage with others during the breaks, lunch, etc&lt;/strong&gt;  -- There are lots of tool
authors here and we love chatting with users (and helping you become
contributors and authors yourselves). Not your first SciPy and feeling
"in-your-element"? Make the effort to invite others into the conversations and
lunch outings you're having with old friends - we're all here because we care
about this stuff.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;take introvert breaks&lt;/strong&gt; (and be considerate of others who may be doing the
same) - I'm an introvert. Though I enjoy interacting with others (one-on-one or
in small groups is best for me), it takes a lot of energy and at some point, I
run out of steam. That's when I go for a walk,  stepping away from the commotion
to just have some quiet time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;be kind to yourself&lt;/strong&gt; (especially at the sprints) -- 
Between the tutorials, all of the talks, and the sprints that follow, there will
be a flurry of activity. Conferences are already draining enough without trying
to get any work done, just meeting a bunch of new people and taking in a lot of
information. It took a lot of false starts for me to have productive work output
at sprints, but the best thing I've learned about them is to just let go of
trying to get a lot done. Instead, try to get something small and well defined
done or just help others.&lt;/p&gt;
&lt;h2 id="stuff-to-do-in-austin"&gt;Stuff to do in Austin&lt;/h2&gt;
&lt;p&gt;The conference already has a great list of &lt;a href="https://scipy2017.scipy.org/ehome/220975/493412/"&gt;Things to do in
Austin&lt;/a&gt;, as well as
&lt;a href="https://scipy2017.scipy.org/ehome/220975/493408/"&gt;Restaurants&lt;/a&gt;, so I'll just
mention a few of my personal favorites.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Barton Springs Pool.&lt;/strong&gt; Take a nice dip in the cool waters, and grab a delicious
bite from one of the food trucks at &lt;a href="https://www.thepicnicaustin.com/"&gt;The Picnic food truck
  park&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Go see the bats.&lt;/strong&gt; The Congress Ave bridge in Austin is home to the largest
urban bat colony in the world. You can read more about this
&lt;a href="http://www.batcon.org/index.php/our-work/regions/usa-canada/protect-mega-populations/cab-intro"&gt;here&lt;/a&gt;,
but the short version is that around sunset (8-9pm) - a large number of bats
stream out from underneath the bridge to go feed on insects. Some days, they
leave in waves (this Saturday there were two waves, the first was smaller, but
many people left thinking that was the entire show).&lt;/p&gt;
&lt;p&gt;I hope you enjoy SciPy2017!&lt;/p&gt;</content><category term="technology"></category><category term="python"></category><category term="scipy2017"></category><category term="conference"></category></entry><entry><title>June 1st, 2017</title><link href="//pirsquared.org/blog/june-1st-2017.html" rel="alternate"></link><published>2017-06-03T00:00:00-07:00</published><updated>2017-06-03T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2017-06-03:/blog/june-1st-2017.html</id><content type="html">&lt;p&gt;We had another biannual &lt;a href="https://jupyter.org/"&gt;Jupyter&lt;/a&gt; team meeting this week,
this time it was right nearby in Berkeley. Since I had &lt;a href="//pirsquared.org/blog/november-9th-2016.html"&gt;read a poem at the last
meeting&lt;/a&gt;, I was encouraged to keep that going
and decided to make this a tradition. Here's the result, as delivered this past
Friday, recorded by &lt;a href="http://fperez.org/"&gt;Fernando Pérez&lt;/a&gt; (thanks, Fernando!).&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/m18VdgK0sc4?rel=0"
frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;h1 id="june-1st-2017"&gt;&lt;code&gt;June 1st, 2017&lt;/code&gt;&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;We struggle -- with ourselves and with each other
we plan -- we code and write
the pieces and ideas t&amp;#39;wards what we think is right
but we may disagree -- about
the means, about the goals, about the
shoulders we should stand on --
where we should stand, what we should stretch toward
shrink from, avoid, embrace --
a sense of urgency - but this is not a race

We can&amp;#39;t erase the past
but we have built this future present
There&amp;#39;s much to learn, to do...

Ours not the only path, no one coerced you here
You chose this -- so did I and here we are --
still at the barricades and gaining ground
against the old closed world:
compute communication comes unshackled
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="life"></category><category term="journal excerpt"></category><category term="poetry"></category><category term="jupyter"></category><category term="python"></category></entry><entry><title>March 29th, 2017</title><link href="//pirsquared.org/blog/march-29th-2017.html" rel="alternate"></link><published>2017-04-07T00:00:00-07:00</published><updated>2017-04-07T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2017-04-07:/blog/march-29th-2017.html</id><content type="html">&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;What&amp;#39;s missing -- feels like there&amp;#39;s something missing --
The capacity is there -- the job&amp;#39;s not stressful but
I somehow fail at the ignition stage - all this
fuel just sitting around -- un-utilized potential
How do I light that fire? Set it ablaze
in a daze caught up in the haze of comfort
I need to challenge myself, raising tides lift
all boats, but they also drown 
livestock
cows, horses, and goats, seeking refuge in hills
that once covered in grass now fill up like
lifeboats. 
Doctors in white coats 
say &amp;quot;Keep your spirits up&amp;quot; -- hope floats.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="life"></category><category term="journal excerpt"></category><category term="poetry"></category></entry><entry><title>November 9th, 2016</title><link href="//pirsquared.org/blog/november-9th-2016.html" rel="alternate"></link><published>2016-11-21T00:00:00-08:00</published><updated>2016-11-21T00:00:00-08:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2016-11-21:/blog/november-9th-2016.html</id><content type="html">&lt;p&gt;Two weeks ago, I went down to San Luis Obispo, California for a five day
&lt;a href="https://jupyter.org/"&gt;Jupyter&lt;/a&gt; team meeting with about twenty five others. This
was the first such meeting since &lt;a href="//pirsquared.org/blog/gravity.html"&gt;my return after being away for two
years&lt;/a&gt;, and I enjoyed meeting some of the "newer" faces,
as well as catching up with old friends.&lt;/p&gt;
&lt;p&gt;It was both a productive and an emotionally challenging week, as the project
proceeds along at breakneck pace on some fronts yet continues to
face growing pains which come from having to &lt;a href="https://arxiv.org/abs/1301.7064"&gt;scale in the human
dimension&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On Wednesday, November 9th, 2016, we spent a good chunk of the day at a nearby beach:
chatting, decompressing, and luckily I brought my journal with me and was able
to capture the poem you will find below. I intended to read it at a local open mic the same evening, but by the time I got there with a handful of fellow Jovyans for support, all of the slots were taken.  On Friday, the last day of our meeting, I got the opportunity to read it to most of the larger group.  Here's a recording of that reading, courtesy of
 &lt;a href="https://bids.berkeley.edu/people/matthias-bussonnier"&gt;Matthias Bussonnier&lt;/a&gt;
 (thanks, Matthias!).&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/3l1HARQtGYc?rel=0"
frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;h1 id="november-9th-2016"&gt;&lt;code&gt;November 9th, 2016&lt;/code&gt;&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;The lovely thing about the ocean is
that it
is
tireless 
It never stops
incessant pendulum of salty foamy slush
Periodic and chaotic
raw, serene 
Marine grandmother clock  
crashing against both pier
and rock

Statuesque encampment of abandonment
recoiling with force
and blasting forth again
No end in sight
a train forever riding forth
and back
along a line
refined yet undefined
the spirit with
which it keeps time 
in timeless unity of moon&amp;#39;s alignment

I. walk. forth.

Forth forward by the force
of obsolete contrition
the vision of a life forgotten
Excuses not
made real with sand, wet and compressed
beneath my heel and toes, yet reeling from
the blinding glimmer of our Sol
reflected by the glaze of distant hazy surf
upon whose shoulders foam amoebas roam

It&amp;#39;s gone.
Tone deaf and muted by

anticipation
each coming wave
breaks up the pregnant pause
And here I am, barefoot in slacks and tie
experiencing sensations
of loss, rebirth and seldom 
kelp bulbs popping in my soul.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="life"></category><category term="journal excerpt"></category><category term="poetry"></category><category term="avila beach"></category><category term="jupyter"></category><category term="python"></category></entry><entry><title>Jupyter's Gravity</title><link href="//pirsquared.org/blog/gravity.html" rel="alternate"></link><published>2016-08-31T00:00:00-07:00</published><updated>2016-08-31T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2016-08-31:/blog/gravity.html</id><content type="html">&lt;p&gt;I'm switching jobs. &lt;/p&gt;
&lt;p&gt;For the past two years I've been working with the great team at Disqus as a
member of the backend and data teams. Before that, I spent a half-dozen years
mostly not working on my thesis at UC Berkeley but instead contributing to to
the scientific Python ecosystem, especially
&lt;a href="http://matplotlib.org/"&gt;matplotlib&lt;/a&gt;, &lt;a href="http://ipython.org/"&gt;IPython&lt;/a&gt;,
and the IPython notebook, which is now called &lt;a href="http://jupyter.org/"&gt;Jupyter&lt;/a&gt;.
So when Bloomberg reached out to me with a compelling position to work
on those open-source projects again from their SF office, such a tremendous
opportunity was hard to pass up.  You could say Jupyter has a large
gravitational pull that's hard to escape, but you'd be huge nerd. ;)&lt;/p&gt;
&lt;p&gt;I have a lot to catch up on, but I'm really excited and looking forward to
contributing on these fronts again!&lt;/p&gt;</content><category term="life"></category><category term="jupyter"></category><category term="python"></category><category term="disqus"></category><category term="bloomberg"></category></entry><entry><title>in transit</title><link href="//pirsquared.org/blog/in-transit.html" rel="alternate"></link><published>2016-05-26T00:00:00-07:00</published><updated>2016-05-26T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2016-05-26:/blog/in-transit.html</id><content type="html">&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Standing impatient, platform teeming, almost noon
Robo voices read off final destinations
But one commuter&amp;#39;s already at his
He reached for life&amp;#39;s third rail

There is no why in the abyss
There&amp;#39;s only closing credit hiss
The soundtrack&amp;#39;s gone, he didn&amp;#39;t miss
Reaching for life&amp;#39;s third rail

We ride on, now, relieved and moving forward
Each our own lives roll forth, for now
But now is gone, for one among us
Who reached for life&amp;#39;s third rail

We rock, to-fro, and reach each station
Weight shifting onto forward foot
Flesh, bone ground up in violent elation
And bloody rags, hours ago a well worn suit

I ride the escalator up and pensive
About what did and not occur today
Commuter glut, flow restricted
A crooked kink in public transport hose resolved.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="life"></category><category term="journal excerpt"></category><category term="poetry"></category><category term="BART"></category></entry><entry><title>My first 200 K</title><link href="//pirsquared.org/blog/first-200k.html" rel="alternate"></link><published>2015-04-19T00:00:00-07:00</published><updated>2015-04-19T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2015-04-19:/blog/first-200k.html</id><content type="html">&lt;p&gt;&lt;img alt="SFR logo" src="//pirsquared.org/blog/images/SFR_logo.gif"&gt;&lt;/p&gt;
&lt;p&gt;Yesterday, I rode my longest bike ride to date - the El Cerrito-Davis 200K - with the &lt;a href="//sfrandonneurs.org/"&gt;San Francisco Randonneurs&lt;/a&gt;. A big &lt;em&gt;thank you&lt;/em&gt; to all the volunteers and randos who made my first 200k so much fun.&lt;/p&gt;
&lt;p&gt;First, for the uninitiated, an aside about randonneuring:&lt;/p&gt;
&lt;p&gt;I discovered the sport because I'm a cheapskate. I had gotten more and more into cycling over the past 2 years or so, and though I was riding through the East Bay hills mostly alone, I wanted to do a "Century" - a 100 mile ride. Looking up local rides I found out that, while most centuries cost a nontrivial amount of money for the poor grad student I was back then ($60-$200), the San Francisco Randonneur rides were all $10-$20. As I dug deeper and learned about the sport, I found out that the reason for low cost, is that rando rides are unsupported - randonneuring is all about self sufficiency. You are expected to bring gear to fix your own flats, as well as carry or procure your own snacks and beverages.&lt;/p&gt;
&lt;p&gt;&lt;img alt="RUSA logo" src="//pirsquared.org/blog/images/logorusa.gif"&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="//rusa.org/"&gt;Randonneurs USA (RUSA) website&lt;/a&gt; succinctly summarizes the sport.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Randonneuring is long-distance unsupported endurance cycling. This style of riding is non-competitive in nature, and self-sufficiency is paramount. When riders participate in randonneuring events, they are part of a long tradition that goes back to the beginning of the sport of cycling in France and Italy. Friendly camaraderie, not competition, is the hallmark of randonneuring.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This description is strikingly similar to my beliefs both about cycling and
computing, so I knew I found a new activity I would greatly enjoy. This has been
borne out on three previous occasions when I have participated in the ~100 km
Populaire rides, which are intended as a way to introduce riders to the sport,
yet still be within reach of wide variety of cycling abilities.&lt;/p&gt;
&lt;p&gt;We moved in late December, and between unpacking, rainy weekends, and being sick - I haven't been able to &lt;a href="//pirsquared.org/blog/cycling-log.html"&gt;get much riding in&lt;/a&gt;. However, I've been wanting to do a 200K for a long time - my century, coveted for years, seemed within reach more than ever. To seal my commitment to the ride, I went ahead and ordered a spiffy looking SFR cycling jersey:&lt;/p&gt;
&lt;p&gt;&lt;img alt="SFR Jersey" src="//pirsquared.org/blog/images/SanFranciscoRandonneursJersey.png"&gt;&lt;/p&gt;
&lt;p&gt;Here's the &lt;a href="//ridewithgps.com/routes/7356381"&gt;213km (132 miles) ride map and elevation profile&lt;/a&gt;, what follows is my ride report.&lt;/p&gt;
&lt;h2 id="start-control"&gt;Start Control&lt;/h2&gt;
&lt;p&gt;The ride started at 8am at a Starbucks by El Cerrito BART station, so I just rode there from my house as I frequently do on my morning commute. I prepared my bike, packed my gear and food the night before, and the only thing I needed to do was to fill up my water bottle before the ride started. I showed up a dozen minutes before the start, with most riders already assembled, got my short drip and a heated up croissant, and totally failed to get any water. It's not a super terrible thing, I frequently don't end up drinking much at the beginning of my rides, but I had now set myself up to ride to the second control (44 km / 27 miles) without any water.&lt;/p&gt;
&lt;p&gt;Randonneuring isn't about racing - as you traverse from control to control, there's just a window of time that you have for each control, and so long as you make it through each control withing that time window, you complete the event! There is no ordinal placement, the first rider to finish has just as much bragging rights as the last. The only time people talk about time is when they're trying to make a new personal best. The second control was open roughly between 9 and 11am, so I could have stopped off somewhere to pickup water, but that didn't fit into my ride plan.&lt;/p&gt;
&lt;p&gt;You see, the &lt;a href="https://drive.google.com/file/d/0B146WIVvhxJ9SnhodEdwaFZpRklMV0FZaXpLaWVKclQ3MDd3/view?usp=sharing"&gt;cue sheet&lt;/a&gt; is two pages - with the first page dedicated to getting you to the second control, as there are a lot of turns to make in the East bay until you get to Benicia.  Accordingly, my plan was to stick with the "fast" group who know the route well, so that I wouldn't have to look at the cue sheet at all. This was a success - and I got to chat with Jesse, whom I rode a fair chunk of &lt;a href="//ridewithgps.com/routes/3367420"&gt;the 111 km Lucas Valley Populaire&lt;/a&gt; back in October (here's a &lt;a href="https://www.youtube.com/watch?v=2xThXFVup6Y"&gt;good video of the first chunk of that ride&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="control-2"&gt;Control #2&lt;/h2&gt;
&lt;p&gt;When 7 of us got to the Benicia control at 9:45, I volunteered to guard the bikes as folks filed into the gas station mart to buy something (getting a timestamped receipt is how you prove that you did the ride from one control to the next within the allotted time). Lesson learned: I should have used that time to shed my warm second jersey and long pants, as it had warmed up by then. It just so happens that by the time I went inside, there was a line for the bathroom, and by the time I got out, the fast group was just heading out, yet I still needed to change.&lt;/p&gt;
&lt;p&gt;Because keeping up with the "fast" group wasn't that big of a deal and actually rather fun, I really wanted to try to catch up to them, so I stepped it up, and told a couple of other riders that I'd do my best to pull us to them (in case you didn't know - the aerodynamics of cycling make it much easier for those behind the leader to keep up the pace, even if that pace isn't something they could comfortably do on their own). We didn't succeed in catching them during the first 10 mile stretch of road, but I kept pushing with a high cadence in my highest gear, and about 5 miles later, we caught up with them! The only problem was, by this point, I had wasted so much energy, that I couldn't make the last 20 feet to them, though I was happy to see the two guys who'd been letting my push the whole time, use their fresher legs and join the group. So there I was, a few dozen feet from my intended riding partners, but as more and more pavement went past our wheels, the distance between us slowly widened.&lt;/p&gt;
&lt;p&gt;Somewhat disheartened by this (though, again, happy that I all of my pulling wasn't all for naught, since I bridged two others to the group), and now overheating, I decide to stop by the side of the road, removed my long sleeved shirt, put on sunscreen (Lesson learned: don't forget your ears, too - they're the only part of me that burned). A fellow rando rider Eric went past, to my smiling cheer of "Go get 'em!". Then when pair of riders asked if I'm alright, I nodded, and decided to hop back on the bike and ride with them for a bit. It was nice to let someone else pull for a bit, but shortly thereafter, we started the first serious ascent, and my heart was pounding too hard from exhaustion and the heat - and I had to stop to again to catch my breath and get some more food in me.&lt;/p&gt;
&lt;p&gt;Luckily, when I resumed riding up that hill, I had a mental shift, gave myself a break, and given how tired my legs were already, even though I wasn't even half-way through the ride, I reminded myself that I'll just spin in a low gear if I have to, there's no rush, I'm not racing anyone, and though I know this won't end up being as good of a 200k as it could have been had I trained more in recent months, it was still up to me to enjoy the ride.  One of the highlights of the ride were all of the different butterflies I got to see along the way that I started noticing after this change in mental attitude.&lt;/p&gt;
&lt;p&gt;After the long climb, followed by a very nice descent, I got onto the Silverado Trail for 14 miles of a straight road with minimal elevation changes. Though my legs were again cooperating more, it was starting to get kind of old, and then out of nowhere, one of the riders I had pulled earlier rides past me, but then proceeds to slow down and ride along side me for a chat. He hadn't been able to keep up with the fast group for very long, and ended up stopping somewhere along the way to eat, which is why I didn't notice that I had passed him. We took turns pulling for each other, which took away from the monotony of Silverado, but he had a lot more in the tank, and I again wasn't able to keep up, losing him with 4 miles to go to St Helena.&lt;/p&gt;
&lt;p&gt;Needing another break, with 4 miles to the next control, I decided I would need to spend a while there, recuperating, if I am to make it through the rest of the ride. &lt;/p&gt;
&lt;h2 id="control-3"&gt;Control #3&lt;/h2&gt;
&lt;p&gt;I got to Model Bakery at 1:10pm, with many familiar faces from earlier in the day already enjoying their food, but ended up staying there until 2:30 - eating my food, drinking water, just letting my legs rest.&lt;/p&gt;
&lt;p&gt;I ended up riding out solo, and really enjoyed the early parts of 128 (after missing the turnoff by a hundred feet) - luckily this was just the spot I had my last stop at, so I quickly turned around and got back on the road.&lt;/p&gt;
&lt;p&gt;The problem was it kept getting hotter and hotter - it seemed that I couldn't go a mile without taking a good gulp of water. I still stuck to my strategy of just spinning fast without really pushing hard, since recovering from being out of breath is way faster than waiting for exhausted legs to obey your commands. I made it a good chunk of the way to Winters, but still ended up having to stop half way up the climb near Lake Berryessa. Another SFR rider, Julie, climbed past me, checking if I was OK as she went by. It's great to have that kind of camaraderie along the ride, a couple of people even gently expressed their concern that my rear wheel was out of true - which I knew but kept putting off getting it fixed. These nudges gave me more resolve to get that taken care of.&lt;/p&gt;
&lt;p&gt;&lt;img alt="TRUCKS USE LOWER GEAR" src="//pirsquared.org/blog/images/lower_gear.png"&gt;&lt;/p&gt;
&lt;p&gt;Finishing off the last of the Haribo Gummi Candy Gold-Bears that I brought with
me (and you know you're tired and dehydrated when it takes effort to just chew),
I got back on the bike and headed further up the hill. Then, finally, I didn't
think I could ever be so cheered up by road sign (hint: they only put "TRUCKS
USE LOWER GEAR" signs at the top of big hills).&lt;/p&gt;
&lt;h2 id="control-4"&gt;Control #4&lt;/h2&gt;
&lt;p&gt;I finally got to Winters at 5:37pm, got myself a Chai Smoothie, and Julie, who unfortunately was going to miss her train home, proposed that we ride together the rest of the way to Davis. Again - though I really enjoy my alone time while cycling, it's also quite fun to have strong riders to ride with, so as the sun started descending behind us, and no longer scorchingly hot, we set out for the final 17 miles to Davis at a good clip,  given how much riding we had already done.&lt;/p&gt;
&lt;h2 id="finish-control"&gt;Finish Control&lt;/h2&gt;
&lt;p&gt;Dodging drunk college kids (it was Picnic Day at UC Davis) was the last challenge of the ride. As a UCD alum, this was a homecoming of sorts, so I lead the way through town as we made our way to the Amtrak station. We finished just before 7, and I caught the 7:25pm train back to the Bay Area - enjoying the company of a handful of other randonneurs.&lt;/p&gt;
&lt;p&gt;Thanks for reading my ride report!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;                   _
                  / \
                A*   \^   -
             ,./   _.`\\ / \
            / ,--.S    \/   \
           /  `&amp;quot;~,_     \    \
     __o           ?
   _ \&amp;lt;,_         /:\
--(_)/-(_)----.../ | \
--------------.......J
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="cycling"></category><category term="cycling"></category><category term="randonneuring"></category></entry><entry><title>pedestrian musings</title><link href="//pirsquared.org/blog/pedestrian.html" rel="alternate"></link><published>2014-08-25T00:00:00-07:00</published><updated>2014-08-25T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2014-08-25:/blog/pedestrian.html</id><content type="html">&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;I walk in monologue 
    through Berkeley&amp;#39;s Hills
Feet pressing into sidewalk firmly
I eat the pensive mood 
    solitude brings
And bite into the juiciness of
    self-reflection
I write, first time in years,
    free verse impromptu
Taking few dozen steps
    between each pair of lines
I yearn, on tip-toes
    stretching high, to be expressive
A mode of being longtime
    self-denied
I&amp;#39;m walking home - from job
    I&amp;#39;ll soon be leaving
To find myself believing once 
    again
That which I do defines 
    me not and feeling
That which I am is
    good. enough. a lot.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="life"></category><category term="journal excerpt"></category><category term="poetry"></category><category term="berkeley"></category></entry><entry><title>starting my job search</title><link href="//pirsquared.org/blog/visual-resume.html" rel="alternate"></link><published>2014-06-14T00:00:00-07:00</published><updated>2014-06-14T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2014-06-14:/blog/visual-resume.html</id><content type="html">&lt;p&gt;I am starting to look for a job in the San Francisco Bay Area.&lt;/p&gt;
&lt;p&gt;Since many recruiters ask for and presumably look at GitHub profiles, I decided
to give &lt;a href="http://github.com/ivanov/"&gt;mine&lt;/a&gt; a little facelift:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Smart and Gets Things Done Github Contribution
Graph:" src="/images/smart_gets_things_done_git_contribution_graph.png"&gt;&lt;/p&gt;
&lt;p&gt;In case you aren't familiar, 
that banner was  motivated by &lt;a href="http://www.joelonsoftware.com/"&gt;Joel
Spolsky&lt;/a&gt;'s &lt;a href="http://www.joelonsoftware.com/items/2007/06/05.html"&gt;Smart and Gets Things
Done&lt;/a&gt;, which is a book
about hiring good developers . So I decided to tweet it out, mentioning @spolsky
and he favorited it!&lt;/p&gt;
&lt;p&gt;@ivanov/status/476932602587123712&lt;/p&gt;
&lt;p&gt;Yesterday, I decided to tweet out an image that's at the top of &lt;a href="/resume.pdf"&gt;my
resume&lt;/a&gt; as a standalone tweet- mentioning Joel Spolsky again, and
he liked it well enough to retweet it to his 90 thousand followers, so it's been
getting plenty of love. &lt;/p&gt;
&lt;p&gt;&lt;img alt="Paul Ivanov's Visual Resume" src="/images/visual_resume.png"&gt;&lt;/p&gt;
&lt;p&gt;@ivanov/status/477477547957944321&lt;/p&gt;
&lt;p&gt;@ivanov/status/477520571907842048&lt;/p&gt;
&lt;p&gt;Perhaps unsurprisingly, the only person to contact me as a result of this so far
is a reporter from Business Insider :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My editor would like to post it on our site as an example of a creative way to
format a resume... I'm wondering if we can get your permission to do this?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So that's what prompted this post: I simply added my name and a &lt;a href="http://creativecommons.org/licenses/by/3.0/"&gt;Creative
Commons Attribution Licence
(CC-BY)&lt;/a&gt; to the two images, and
then sent my permission along.&lt;/p&gt;
&lt;p&gt;Outside of that, no prospective employers have gotten in touch.  But like I
always say: you can't win the lottery if you don't buy a ticket. And since I
also enjoy mixing metaphors, I'll just keep on fishing!&lt;/p&gt;</content><category term="technology"></category><category term="visualization"></category><category term="hello-world"></category></entry><entry><title>indenting with tabs</title><link href="//pirsquared.org/blog/indenting-tabs.html" rel="alternate"></link><published>2014-04-03T00:00:00-07:00</published><updated>2014-04-03T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2014-04-03:/blog/indenting-tabs.html</id><content type="html">&lt;p&gt;&lt;link rel="stylesheet" href="/blog/notebooks/nb.css" type="text/css" /&gt;&lt;/p&gt;
&lt;p&gt;** This post was written as an IPython Notebook. You can view it on
&lt;a href="http://nbviewer.ipython.org/url/pirsquared.org/blog/notebooks/indenting-tabs.ipynb"&gt;nbviewer&lt;/a&gt;,
or &lt;a href="/blog/notebooks/notebook-blinking.ipynb"&gt;download it&lt;/a&gt;. **&lt;/p&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;&lt;a href="http://third-bit.com/about.html"&gt;Greg Wilson&lt;/a&gt; asked on the IPython mailing list:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Subject: easiest way to insert a literal tab character in a code
cell? 
Greg Wilson, on 2014-04-03 18:37,  wrote:
&amp;gt; Hi,
&amp;gt; I&amp;#39;d like to put literal tab characters in cells, but of course tab means 
&amp;gt; &amp;quot;indent&amp;quot; to the editor.  What&amp;#39;s the easiest way to do this?
&amp;gt; Thanks,
&amp;gt; Greg
&amp;gt; p.s. because I&amp;#39;m going to write Makefiles in the notebook...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The easiest way to do this is to just get a tab character somewhere that
you can copy, and then paste it in.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[1]:
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;


&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[2]:
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;    &lt;span class="c"&gt;# I copy pasted the output of the cell above here&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;An alternative solution is to make a string with tabs and insert it into another cell, using IPython machinery.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[3]:
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_ipython&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[4]:
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_next_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;Makefiles are awesome&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[]:
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;    &lt;span class="n"&gt;Makefiles&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;awesome&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;If you have a file on disk or on the web, you can also just use the 
&lt;code&gt;%load&lt;/code&gt; magic to do this.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[5]:
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="k"&gt;load&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;file_with_tabs&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[]:
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;issue&lt;/span&gt;
    &lt;span class="n"&gt;whoami&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Such files can be written with the &lt;code&gt;%%writefile&lt;/code&gt; cell magic... but of course
you need to have &lt;em&gt;inserted&lt;/em&gt; tabs there in some manner.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[6]:
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="k"&gt;writefile&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;file_with_tabs&lt;/span&gt;
&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;issue&lt;/span&gt;
    &lt;span class="n"&gt;whoami&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;
Overwriting /home/pi/file_with_tabs

&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[7]:
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;!&lt;/span&gt;make -f /home/pi/file_with_tabs
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="output_subarea output_stream output_stdout output_text"&gt;
&lt;pre&gt;
cat /etc/issue
Debian GNU/Linux jessie/sid \n \l

whoami
pi

&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;h2 id="The-more-involved,-but-more-usable-way"&gt;The more involved, but more usable way&lt;a class="anchor-link" href="#The-more-involved,-but-more-usable-way"&gt;&amp;#182;&lt;/a&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;We can set up CodeMirror to insert tabs instead of spaces.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell rendered"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[8]:
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
    &lt;div class="input_area"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="nx"&gt;javascript&lt;/span&gt;

&lt;span class="nx"&gt;IPython&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tab_as_tab_everywhere&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;use_tabs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;use_tabs&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;use_tabs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// apply setting to all current CodeMirror instances&lt;/span&gt;
    &lt;span class="nx"&gt;IPython&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notebook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get_cells&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code_mirror&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indentWithTabs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;use_tabs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// make sure new CodeMirror instances created in the future also use this setting&lt;/span&gt;
    &lt;span class="nx"&gt;CodeMirror&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indentWithTabs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;use_tabs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;


&lt;div class="output_subarea output_javascript "&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;The reason we attach &lt;code&gt;tab_as_tab_everywhere&lt;/code&gt; to &lt;code&gt;IPython&lt;/code&gt; is because when we use the &lt;code&gt;%%javascript&lt;/code&gt; magic,
any variables we define there must be called in &lt;em&gt;the same cell&lt;/em&gt; that defined it - they get their own closure.
The reason we do this is to allow the notebook javascript to not get screwed up when there are javascript errors.
We could have attached it to &lt;code&gt;window&lt;/code&gt; or &lt;code&gt;CodeMirror&lt;/code&gt; or anything else that&amp;#39;s already in javascript-land.&lt;/p&gt;
&lt;p&gt;I covered how to add functions like this to the &lt;code&gt;custom.js&lt;/code&gt; file in your profile in my &lt;a href="//pirsquared.org/blog/notebook-blink.html"&gt;post about disabling blinking in the notebook&lt;/a&gt;. That way these little functions are available in every notebook, 
without you having to insert a cell defining them.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="cell border-box-sizing text_cell rendered"&gt;
&lt;div class="prompt input_prompt"&gt;
&lt;/div&gt;
&lt;div class="inner_cell"&gt;
&lt;div class="text_cell_render border-box-sizing rendered_html"&gt;
&lt;p&gt;Now we&amp;#39;ve got code that allows us to apply the change to all current and future cells. We leave it
as an exercise for the interested reader to modify that code and make a little button in the toolbar,
to toggle it on a per-cell basis.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hints&lt;/em&gt;: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can get to the code mirror instance via &lt;code&gt;IPython.notebook.get_selected_cell().code_mirror&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;** This post was written as an IPython Notebook. You can view it on
&lt;a href="http://nbviewer.ipython.org/url/pirsquared.org/blog/notebooks/indenting-tabs.ipynb"&gt;nbviewer&lt;/a&gt;,
or &lt;a href="/blog/notebooks/notebook-blinking.ipynb"&gt;download it&lt;/a&gt;. **&lt;/p&gt;</content><category term="technology"></category><category term="python"></category></entry><entry><title>bipython 0.1.0</title><link href="//pirsquared.org/blog/bipython.html" rel="alternate"></link><published>2014-04-01T00:00:00-07:00</published><updated>2014-04-01T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2014-04-01:/blog/bipython.html</id><content type="html">&lt;p&gt;&lt;a href="http://bipython.org"&gt;&lt;img alt="bipython
logo" src="http://bipython.org/images/bipython_logo.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="the-boldly-indiscriminate-python-interpreter"&gt;the boldly indiscriminate python interpreter&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;"...because you shouldn't have to choose."&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="prologue"&gt;PROLOGUE&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Two interpreters, both alike in dignity,&lt;br&gt;
In fair Pythona, where we lay our scene,&lt;br&gt;
From ancient grudge break to new mutiny,&lt;br&gt;
Where civil code makes git commits unclean.&lt;br&gt;
From forth the fatal loins of these two foes&lt;br&gt;
A newer kind of stranger's given life;&lt;br&gt;
Whose misadventured piteous overthrows&lt;br&gt;
Doth with its birth bury its parents' strife.  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="act-i"&gt;ACT I&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Enter &lt;code&gt;bpython&lt;/code&gt; and &lt;code&gt;ipython&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bpython-interpreter.org/"&gt;&lt;strong&gt;&lt;code&gt;bpython&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I'm a fancy terminal-based interface to the Python interpreter.  I give you&lt;br&gt;
inline syntax highlighting and auto-completion prompts as you type, and I'll&lt;br&gt;
even automatically show you a little tooltip with a docstring and parameter&lt;br&gt;
list as soon as you hit &lt;code&gt;(&lt;/code&gt; to make the function call, so you always know&lt;br&gt;
what you're doing! I'm svelte and proud of it - I don't try to do all of the&lt;br&gt;
shenanigans that &lt;code&gt;ipython&lt;/code&gt; does with the shell and the web, but the cool kids&lt;br&gt;
love my rewind feature for demos. I strive to make interactive python coding&lt;br&gt;
a joy!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://ipython.org/"&gt;&lt;strong&gt;&lt;code&gt;ipython&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I'm an awesome &lt;em&gt;suite&lt;/em&gt; of interactive computing ideas that work together.&lt;br&gt;
For millennia, I've given you tab-completion and object introspection via&lt;br&gt;
&lt;code&gt;obj?&lt;/code&gt; instead of &lt;code&gt;help(obj)&lt;/code&gt; in Python. I also have sweet shell features,&lt;br&gt;
special magic commands (&lt;code&gt;%run&lt;/code&gt;, &lt;code&gt;%timeit&lt;/code&gt;, &lt;code&gt;%matplotlib&lt;/code&gt;, etc.) and a &lt;br&gt;
history mechanism for both input (command history) and output (results &lt;br&gt;
caching).  &lt;/p&gt;
&lt;p&gt;More recently, I've decoupled the REPL into clients and kernels, allowing&lt;br&gt;
them to run on independent of each other. One popular client is the &lt;br&gt;
IPython Notebook which allows you to write code and prose using a web &lt;br&gt;
browser, sending code to the kernel for execution and getting rich media &lt;br&gt;
results back inline. The decoupling of clients and kernels also allows &lt;br&gt;
multiple clients to interact with the same kernel, so you can hook-up to &lt;br&gt;
that same running kernel from the terminal. The terminal workflow makes &lt;br&gt;
more sense for some things, but my user interface there isn't as polished&lt;br&gt;
as &lt;code&gt;bpython&lt;/code&gt;'s.  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Enter &lt;code&gt;bipython&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bipython.org/"&gt;&lt;strong&gt;&lt;code&gt;bipython&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By your powers combined... I am &lt;strong&gt;&lt;code&gt;bipython&lt;/code&gt;&lt;/strong&gt;!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Exeunt&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="the-power-is-yours"&gt;The Power is Yours!&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install  bipython
easy_install bipython
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;bipython&lt;/code&gt; requires ipython, pyzmq, bpython, and urwid.&lt;/p&gt;
&lt;p&gt;For now, you'll need to have a running ipython kernel before running &lt;code&gt;bipython&lt;/code&gt;.
You can do this by either opening a notebook or running &lt;code&gt;ipython console&lt;/code&gt;. 
It won't always be like this, I'll fix it as soon as I can, but it'll be sooner 
&lt;a href="https://github.com/ivanov/bipython"&gt;with your help over ivanov/bipython&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After that, just run &lt;code&gt;bipython&lt;/code&gt; and enjoy the ride. &lt;/p&gt;
&lt;p&gt;Here's a walkthrough of ipython, bpython, and bipython:&lt;/p&gt;
&lt;script type="text/javascript" src="http://bipython.org/images/8632.js" id="asciicast-8632" async
data-speed="2"&gt;&lt;/script&gt;

&lt;p&gt;The screencast is 20 minutes long, but here I'll play it back double speed.
There's no sound, and you can pause at any time and select / copy portion of the
text as you like. Changing the browser font size in the usual way works, too.
(&lt;a href="https://asciinema.org/a/8632"&gt;click here if the embed didn't work&lt;/a&gt;)&lt;/p&gt;</content><category term="technology"></category><category term="python"></category><category term="hello-world"></category></entry><entry><title>stem-and-leaf plots in a tweet</title><link href="//pirsquared.org/blog/stem-tweet.html" rel="alternate"></link><published>2014-03-12T00:00:00-07:00</published><updated>2014-03-12T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2014-03-12:/blog/stem-tweet.html</id><content type="html">&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Summary: I describe stem plots, how to read them, and how to make them in
Python, using 140 characters.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;My friend @JarrodMillman, whose office is across the hall, is teaching a
computational statistics course that involves a fair amount programming. He's
been grading these homeworks semi-automatically - with python scripts that pull
the students' latest changes from GitHub, run some tests, spit out the grade to
a JSON file for the student, checks it in and updates a master JSON file that's
only accessible to Jarrod. It's been fun periodically tagging along and watching
his suite of little programs develop. He came in the other day and said "Do you
know of any stem plot implementation in python? I found a few, and I'm using one
that's ok, but it looks too complicated."&lt;/p&gt;
&lt;p&gt;For those unfamiliar - a stem plot, or stem-and-leaf plot is a more detailed
kind of histogram. On the left you have the stem, which is a prefix to all
entries on the right. To the right of the stem, each entry takes up one space
just like a bar chart, but still retains information about its actual value. &lt;/p&gt;
&lt;p&gt;So a stem plot of the numbers 31, 41, 59, 26, 53, 58 looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; 2|6
 3|1
 4|1
 5|389
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That last line is hard to parse for the un-initiated. There are three entries to
the right of the 50 stem, and these three entries &lt;code&gt;3&lt;/code&gt; &lt;code&gt;8&lt;/code&gt; and &lt;code&gt;9&lt;/code&gt; is how the
numbers &lt;code&gt;53&lt;/code&gt;, &lt;code&gt;58&lt;/code&gt;, and &lt;code&gt;59&lt;/code&gt; are concisely represented in a stem plot&lt;/p&gt;
&lt;p&gt;As an instructor, you can quickly get a sense of the distribution of grades,
without fearing the binning artifact caused by standard histograms.  A stem-plot
can reveal subtle patterns in the data that are easy to missed with usual
grading histograms that have a binwidth of 10. Take this distribution, for
example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;XXXXXXX&lt;/span&gt;
&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;XXXXXXXXXXX&lt;/span&gt;
&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;XXXXXXX&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Below are two stem plots which have the same profile as the above, but tell a
different story: &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; 7|7888999
 8|01123477899
 9|3467888
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Above is a class that has a rather typical grade distribution that sort of
clumps together. But a histogram of the same shape might come from data like
this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; 7|0000223
 8|78888999999
 9|0255589
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This is a class with 7 students clearly struggling compared to the rest.&lt;/p&gt;
&lt;p&gt;So here's the code for making a stem plot in Python using NumPy. &lt;code&gt;stem()&lt;/code&gt;
expects an array or list of integers, and prints all stems that span the range
of the data provided. &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;__future__&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;print_function&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;A stem-and-leaf plot that fits in a tweet by @ivanov&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;searchsorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:],&lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%3d&lt;/span&gt;&lt;span class="s1"&gt;|&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;sep&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Yes, it isn't pretty, a fair amount of &lt;a href="http://en.wikipedia.org/wiki/Code_golf"&gt;code
golfing&lt;/a&gt; went into making this work.
It is a good example for the kind of code you should &lt;em&gt;not&lt;/em&gt; write, especially
since I had a little bit of fun with the variable names using characters that
look similar to others, especially in sans-serif typefaces (&lt;code&gt;lI10O&lt;/code&gt;).
Nevertheless, it's kind of fun to fit much functionality into 140 characters.&lt;/p&gt;
&lt;p&gt;Here's my original tweet: @ivanov/status/443980372192137216&lt;/p&gt;
&lt;p&gt;You can test it by running it on some generated data:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;np&lt;/span&gt;.&lt;span class="k"&gt;random&lt;/span&gt;.&lt;span class="nv"&gt;poisson&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;355&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;113&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;
&lt;span class="nv"&gt;array&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;[&lt;span class="mi"&gt;367&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;334&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;317&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;351&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;375&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;372&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;350&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;352&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;350&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;344&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;359&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;355&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;358&lt;/span&gt;,
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;389&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;335&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;361&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;363&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;343&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;340&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;337&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;378&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;336&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;382&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;344&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;359&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;366&lt;/span&gt;,
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;368&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;327&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;364&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;365&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;347&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;328&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;331&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;358&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;370&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;346&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;325&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;332&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;387&lt;/span&gt;,
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;355&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;359&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;342&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;353&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;367&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;389&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;390&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;337&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;364&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;346&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;346&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;346&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;365&lt;/span&gt;,
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;330&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;363&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;370&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;388&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;380&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;332&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;369&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;347&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;370&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;366&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;372&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;310&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;348&lt;/span&gt;,
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;355&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;408&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;349&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;326&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;334&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;355&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;329&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;363&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;337&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;330&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;355&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;367&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;333&lt;/span&gt;,
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;298&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;387&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;342&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;337&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;362&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;337&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;378&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;326&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;349&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;357&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;338&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;349&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;366&lt;/span&gt;,
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;339&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;362&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;371&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;357&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;358&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;316&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;336&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;374&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;336&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;354&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;374&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;366&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;352&lt;/span&gt;,
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="mi"&gt;374&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;339&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;336&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;354&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;338&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;348&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;366&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;370&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;333&lt;/span&gt;]&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;stem&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;data&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;067&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;566789&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;00122334456666777778899&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;02234466667788999&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;001223445555577888999&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;12233344556666677789&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;0000122444588&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;0277899&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you prefer to have spaces between entries, take out the &lt;code&gt;sep=''&lt;/code&gt; from the
last line.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; stem(data)
 29| 8
 30|
 31| 0 6 7
 32| 5 6 6 7 8 9
 33| 0 0 1 2 2 3 3 4 4 5 6 6 6 6 7 7 7 7 7 8 8 9 9
 34| 0 2 2 3 4 4 6 6 6 6 7 7 8 8 9 9 9
 35| 0 0 1 2 2 3 4 4 5 5 5 5 5 7 7 8 8 8 9 9 9
 36| 1 2 2 3 3 3 4 4 5 5 6 6 6 6 6 7 7 7 8 9
 37| 0 0 0 0 1 2 2 4 4 4 5 8 8
 38| 0 2 7 7 8 9 9
 39| 0
 40| 8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To skip over empty stems, add &lt;code&gt;e!=a and&lt;/code&gt; in front of &lt;code&gt;print&lt;/code&gt;.  This will remove
the 300 stem from the output (useful for data with lots of gaps).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; stem(data)
 29| 8
 31| 0 6 7
 32| 5 6 6 7 8 9
 33| 0 0 1 2 2 3 3 4 4 5 6 6 6 6 7 7 7 7 7 8 8 9 9
 34| 0 2 2 3 4 4 6 6 6 6 7 7 8 8 9 9 9
 35| 0 0 1 2 2 3 4 4 5 5 5 5 5 7 7 8 8 8 9 9 9
 36| 1 2 2 3 3 3 4 4 5 5 6 6 6 6 6 7 7 7 8 9
 37| 0 0 0 0 1 2 2 4 4 4 5 8 8
 38| 0 2 7 7 8 9 9
 39| 0
 40| 8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;
&lt;p&gt;@ivanov/status/443981782635921408&lt;/p&gt;</content><category term="technology"></category><category term="python"></category><category term="mathematics"></category><category term="teaching"></category><category term="visualization"></category></entry><entry><title>disabling blinking</title><link href="//pirsquared.org/blog/notebook-blink.html" rel="alternate"></link><published>2014-01-29T00:00:00-08:00</published><updated>2014-01-29T00:00:00-08:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2014-01-29:/blog/notebook-blink.html</id><content type="html">&lt;h2 id="_1"&gt;&lt;link rel="stylesheet" href="/blog/notebooks/nb.css" type="text/css" /&gt;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Background: Text editing in the &lt;a href="http://ipython.org/notebook.html"&gt;IPython
Notebook&lt;/a&gt; is provided by an excellent
JavaScript-based &lt;a href="http://codemirror.net/"&gt;CodeMirror&lt;/a&gt; text editor. This might be
more detail than you want, but I'm a &lt;a href="http://vision.berkeley.edu/?p=2120"&gt;vision
scientist&lt;/a&gt; so I hope you'll indulge me.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The cursor is meant to tell the user the current location.&lt;/p&gt;
&lt;p&gt;The human visual system has a pre-cortical lag of roughly 50-90 ms (&lt;a href="http://en.wikipedia.org/wiki/C1_%26_P1_(Neuroscience)"&gt;read
more about P1&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;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 &lt;em&gt;their&lt;/em&gt; axons, with those spikes finally
ending up in the primary visual cortex.&lt;/p&gt;
&lt;p&gt;By ~150 ms, our brains have processed the visual input enough to &lt;a href="http://www.ncbi.nlm.nih.gov/pubmed/8632824"&gt;perform a non-
trivial ammount of object recognition&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The default blink rate for CodeMirror is 530ms.&lt;/p&gt;
&lt;p&gt;That's &lt;strong&gt;as slow as molasses in January!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;strong&gt;3 times longer&lt;/strong&gt; 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 &lt;strong&gt;just as long&lt;/strong&gt; 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 &lt;strong&gt;6 times longer&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="try-it-out"&gt;Try it out&lt;/h2&gt;
&lt;p&gt;Here's the bit of JavaScript code you need to disable blinking in CodeMirror.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;CodeMirror.defaults.cursorBlinkRate=0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;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.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;%%javascript&lt;/span&gt;
&lt;span class="n"&gt;CodeMirror&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursorBlinkRate&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="make-the-change-stick"&gt;Make the change stick&lt;/h2&gt;
&lt;p&gt;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 &lt;code&gt;default&lt;/code&gt; profile
and not known it. In the shell, run the &lt;code&gt;ipython profile create&lt;/code&gt; command to be
sure (don't worry, if you alreay have a profile, this won't overwrite it). Now
&lt;code&gt;ipython locate profile&lt;/code&gt; will tell you the directory which contains all of the
configuration for the &lt;code&gt;default&lt;/code&gt; profile.&lt;/p&gt;
&lt;div class="cell border-box-sizing code_cell"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[1]:
&lt;/div&gt;
&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;!&lt;/span&gt;ipython profile create
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[2]:
&lt;/div&gt;
&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;!&lt;/span&gt;ipython locate profile
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre&gt;
/home/pi/.ipython/profile_default
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[3]:
&lt;/div&gt;
&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ipython&lt;/span&gt; &lt;span class="n"&gt;locate&lt;/span&gt; &lt;span class="n"&gt;profile&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[4]:
&lt;/div&gt;
&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre&gt;
/home/pi/.ipython/profile_default
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[5]:
&lt;/div&gt;
&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;ls&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre&gt;
&lt;/span&gt;&lt;span class="ansiyellow"&gt;db&lt;/span&gt;/  history.sqlite&lt;/span&gt;  history.sqlite-journal&lt;/span&gt;  ipython_config.py&lt;/span&gt;  ipython_nbconvert_config.py&lt;/span&gt;  ipython_notebook_config.py&lt;/span&gt;  &lt;/span&gt;&lt;span class="ansiyellow"&gt;log&lt;/span&gt;/  &lt;/span&gt;&lt;span class="ansiyellow"&gt;pid&lt;/span&gt;/  &lt;/span&gt;&lt;span class="ansiyellow"&gt;security&lt;/span&gt;/  &lt;/span&gt;&lt;span class="ansiyellow"&gt;startup&lt;/span&gt;/  &lt;/span&gt;&lt;span class="ansiyellow"&gt;static&lt;/span&gt;/
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

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``


&lt;div class="cell border-box-sizing code_cell"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[6]:
&lt;/div&gt;
&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="n"&gt;static&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;custom&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre&gt;
/home/pi/.ipython/profile_default/static/custom
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[7]:
&lt;/div&gt;
&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;ls&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;div class="output_wrapper"&gt;
&lt;div class="output"&gt;


&lt;div class="output_area"&gt;&lt;div class="prompt"&gt;&lt;/div&gt;
&lt;div class="box-flex1 output_subarea output_stream output_stdout"&gt;
&lt;pre&gt;
custom.css&lt;/span&gt;  custom.js&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;div class="cell border-box-sizing code_cell"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[8]:
&lt;/div&gt;
&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;codemirror.defaults.cursorblinkrate=0&amp;quot;&lt;/span&gt; &amp;gt;&amp;gt; custom.js
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;

## "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:


&lt;div class="cell border-box-sizing code_cell"&gt;
&lt;div class="input"&gt;
&lt;div class="prompt input_prompt"&gt;
In&amp;nbsp;[9]:
&lt;/div&gt;
&lt;div class="input_area box-flex1"&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;%%&lt;/span&gt;&lt;span class="nx"&gt;javascript&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// apply setting to  all current CodeMirror instances&lt;/span&gt;
&lt;span class="nx"&gt;IPython&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notebook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get_cells&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code_mirror&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cursorBlinkRate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// make sure new CodeMirror instance also use this setting&lt;/span&gt;
&lt;span class="nx"&gt;CodeMirror&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cursorBlinkRate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;




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](http://www.jurta.org/en/prog/noblink).

Remember, blinking in user interfaces is bad, [but blinking in vision is very
important](http://www.brower.co.uk/opticians/blinking.html).

** This post was written as an IPython Notebook. You can view it on
[nbviewer](http://nbviewer.ipython.org/url/pirsquared.org/blog/notebooks/notebook-blink.ipynb),
or [download it](/blog/notebooks/notebook-blinking.ipynb) **</content><category term="technology"></category><category term="python"></category><category term="vision"></category></entry><entry><title>What happens to a talk deferred...</title><link href="//pirsquared.org/blog/navigating.html" rel="alternate"></link><published>2013-06-17T00:00:00-07:00</published><updated>2013-06-17T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2013-06-17:/blog/navigating.html</id><content type="html">&lt;p&gt;I'll be in Austin, TX for SciPy next week, and I'll be &lt;a href="http://conference.scipy.org/scipy2013/presentation_detail.php?id=118"&gt;giving an updated talk
about tools for reproducible
research&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What follows is the abstract of a talk that I really wanted to give and
submitted to the general track which did &lt;strong&gt;not&lt;/strong&gt; 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 &lt;a href="http://conference.scipy.org/scipy2013/posters.php"&gt;poster
session&lt;/a&gt; (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.&lt;/p&gt;
&lt;h1 id="navigating-the-scientific-python-communities-the-missing-guide"&gt;Navigating the Scientific Python Communities - the missing guide.&lt;/h1&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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. &lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</content><category term="technology"></category><category term="python"></category><category term="talk"></category></entry><entry><title>tags-vs-categories in Pelican</title><link href="//pirsquared.org/blog/pelican-tags-vs-categories.html" rel="alternate"></link><published>2013-05-24T14:55:00-07:00</published><updated>2013-05-24T14:55:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2013-05-24:/blog/pelican-tags-vs-categories.html</id><content type="html">&lt;p&gt;So, following up on my &lt;a href="//pirsquared.org/blog/pelican-transition.html"&gt;transition to pelican&lt;/a&gt;,
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.&lt;/p&gt;
&lt;h1 id="categories"&gt;Categories&lt;/h1&gt;
&lt;p&gt;With Pelican, every post belongs to exactly one category - that category is
&lt;code&gt;'misc'&lt;/code&gt; if one is not provided (and you can override that named by setting
&lt;code&gt;DEFAULT_CATEGORY = 'somethingelse'&lt;/code&gt; in your &lt;code&gt;pelicanconf.py&lt;/code&gt; file).
Alternatively, if the post is in a subdirectory, it's category becomes the
subdirectory name. So if you have a situation like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;.../content/unicorns/lady-rainicorn.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;lady-rainicorn&lt;/code&gt; post will be filed under the category of &lt;code&gt;unicorns&lt;/code&gt;.
You can explicitly override this category-from-subdirectory behavior, by
specifying the category in the header of the file, like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;All&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;about&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Lady&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rainicorn&lt;/span&gt;
&lt;span class="n"&gt;slug&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lady&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rainicorn&lt;/span&gt;
&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;adventure&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;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 &lt;code&gt;technology&lt;/code&gt;. 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
&lt;code&gt;technology&lt;/code&gt; will become highlighted. Same deal if you just click on 
&lt;code&gt;technology&lt;/code&gt;, which will get you a listing of the latest post in that category,
and a pagination of all previous ones.&lt;/p&gt;
&lt;h1 id="pages"&gt;Pages&lt;/h1&gt;
&lt;p&gt;The menu items need not be limited to categories, however. With the popular
&lt;code&gt;notmyidea&lt;/code&gt; template (which is what I've customized for my journal here), if you
create any pages (by putting the file in a &lt;code&gt;content/pages/&lt;/code&gt; 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.&lt;/p&gt;
&lt;h1 id="menuitems"&gt;Menuitems&lt;/h1&gt;
&lt;p&gt;Additionally, you can specify other &lt;code&gt;MENUITEMS&lt;/code&gt; in &lt;code&gt;pelicanconf.py&lt;/code&gt;, which will
go in front of all pages and categories. &lt;code&gt;MENUITEMS&lt;/code&gt; 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:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;MENUITEMS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;all&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/blog/archives.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="tags"&gt;Tags&lt;/h1&gt;
&lt;p&gt;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 &lt;code&gt;pelicanconf.py&lt;/code&gt; files:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;TAG_FEED_ATOM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;feeds/tag_&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;.atom.xml&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="menu-highlighting"&gt;Menu highlighting&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;notmyidea&lt;/code&gt; template only contains logic for highlighting the active
&lt;strong&gt;category&lt;/strong&gt;. This is why, if you click on 'All' at the top of mine, it doesn't
stay highlighted when you're on that page.&lt;/p&gt;
&lt;p&gt;On the other hand, if you click at &lt;a href="/blog/category/cycling.html"&gt;&lt;code&gt;cycling&lt;/code&gt;&lt;/a&gt; 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 &lt;a href="/blog/tag/cycling.html"&gt;&lt;code&gt;cycling&lt;/code&gt;
tag&lt;/a&gt; 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 &lt;a href="//pirsquared.org/blog/just-ride.html"&gt;Just Ride&lt;/a&gt; will also be listed, but it
lives in the category of &lt;a href="/blog/category/books.html"&gt;&lt;code&gt;books&lt;/code&gt;&lt;/a&gt;, because that's
where I'm keeping book reviews.&lt;/p&gt;
&lt;h1 id="summary"&gt;Summary&lt;/h1&gt;
&lt;p&gt;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 &lt;a href="//pirsquared.org/blog/pelican-transition.html"&gt;transition from WordPress&lt;/a&gt;, 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).&lt;/p&gt;</content><category term="technology"></category><category term="pelican"></category><category term="python"></category></entry><entry><title>embracing my hypertextuality</title><link href="//pirsquared.org/blog/pelican-transition.html" rel="alternate"></link><published>2013-05-24T14:41:00-07:00</published><updated>2013-05-24T14:41:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2013-05-24:/blog/pelican-transition.html</id><content type="html">&lt;p&gt;Well, it's happened again, I've jumped (back) on the static blog engine
bandwagon. Early versions of my site were generated literally using &lt;code&gt;#define&lt;/code&gt;
,&lt;code&gt;#include&lt;/code&gt;, &lt;code&gt;gcc&lt;/code&gt;, and a &lt;code&gt;Makefile&lt;/code&gt;...). Back then I was transitioning away
from using &lt;a href="http://pavelthegeek.livejournal.com/"&gt;livejournal&lt;/a&gt;, and decided to
use WordPress so I wouldn't have to roll my own RSS feed generator.&lt;/p&gt;
&lt;p&gt;I tolerated WP for a while - and the frequency of my posts was so low, that it
wasn't much of an issue. &lt;/p&gt;
&lt;p&gt;Except for the security upgrades. I logged into the &lt;code&gt;wp-admin&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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!&lt;/p&gt;
&lt;p&gt;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. &lt;/p&gt;
&lt;p&gt;For posterity, I'm capturing what the first version of my Pelican-based blog
looked like. I did &lt;a href="//pirsquared.org/blog/hello-world.html"&gt;the same thing&lt;/a&gt; when I moved to
WordPress.&lt;/p&gt;
&lt;p&gt;&lt;img src="/blog/images/hypertextuality.png" alt="Embracing my
hypertextuality" style="width: 600px;"/&gt;&lt;/p&gt;
&lt;p&gt;I ran into some confusing things about transitioning to Pelican, so I thought
I'd note them here, for the benefit of others.&lt;/p&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#unadulturated-code-blocks"&gt;Unadulturated code blocks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#nikola"&gt;nikola?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#redirects"&gt;Redirects&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#also-known-as-not-breaking-the-web"&gt;also known as: not breaking the web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#enabling-table-of-contents-for-posts"&gt;Enabling table of contents for posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#categories-and-tags"&gt;Categories and tags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#thats-it-for-now"&gt;That's it for now&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="unadulturated-code-blocks"&gt;Unadulturated code blocks&lt;/h1&gt;
&lt;p&gt;I like to use indentation as a proxy for the venerable &lt;code&gt;&amp;lt;tt&amp;gt;&lt;/code&gt; tag - which uses a
monospace font.&lt;/p&gt;
&lt;p&gt;If you just want to use an indentation, but do not want the indented text parsed
as a programming language, put a &lt;code&gt;:::text&lt;/code&gt; 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:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;A gentleman is one who never hurts anyone&amp;#39;s feelings
unintentionally.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;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 &lt;code&gt;:::text&lt;/code&gt; above the quote,
indented to the same level, &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    :::text
    A gentleman is one who never hurts anyone&amp;#39;s feelings
    unintentionally.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;the result will render like this.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;A gentleman is one who never hurts anyone&amp;#39;s feelings
unintentionally.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As the pelican documentation specifies, this is also the way you can also
specify the specific programming language you want, so &lt;code&gt;:::python&lt;/code&gt; would be one
way to not make pygments guess. You can get a list of all supported languages
&lt;a href="http://pygments.org/docs/lexers/"&gt;here&lt;/a&gt;, just use one of the &lt;code&gt;short names&lt;/code&gt;
for your language of choice.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; tags. Here's the HTML generated for the first
version:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;codehilite&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;A&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;gentleman&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;is&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;one&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;who&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;never&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;hurts&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;anyone&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;err&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;#39;&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;s&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;feelings&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;unintentionally&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;p&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and here's the version generated when you add the &lt;code&gt;:::text&lt;/code&gt; line at the top:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;codehilite&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;A gentleman is one who never hurts anyone&lt;span class="ni"&gt;&amp;amp;#39;&lt;/span&gt;s feelings
unintentionally.
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="nikola"&gt;nikola?&lt;/h1&gt;
&lt;p&gt;At some point, having a dialogue with myself, I wrote in here "or should I not
use pelican and use nicola instead?"&lt;/p&gt;
&lt;p&gt;Ok, tried it - nikola takes too long to  startup  -&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;nikola --help
real    0m1.202s
user    0m0.876s
sys     0m0.300s

pelican --help
real    0m0.639s
user    0m0.496s
sys 0m0.132s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;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 &lt;a href="http://nikola.ralsina.com.ar/handbook.html#importing-your-wordpress-site-into-nikola"&gt;wordpress import
tool&lt;/a&gt;
to grab the &lt;code&gt;wp-upload&lt;/code&gt; images from my WordPress blog)&lt;/p&gt;
&lt;p&gt;another set of instructions I consulted: &lt;a href="http://kevin.deldycke.com/2013/02/wordpress-to-pelican/"&gt;Kevin Deldycke's WordPress to
Pelican&lt;/a&gt;, which is how
I did get my articles out using &lt;code&gt;exitwp&lt;/code&gt; which I patched slightly, so files got
saved as .md, and preserve other format properties.&lt;/p&gt;
&lt;h1 id="redirects"&gt;Redirects&lt;/h1&gt;
&lt;h2 id="also-known-as-not-breaking-the-web"&gt;also known as: not breaking the web&lt;/h2&gt;
&lt;p&gt;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 &lt;code&gt;url_map.csv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I don't have that many posts, so I just added them in by hand:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;Options&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;+FollowSymLinks
&lt;span class="nb"&gt;RewriteEngine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;on&lt;/span&gt;
&lt;span class="nb"&gt;RedirectMatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;301&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/blog/feed/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/blog/feeds/all.atom.xml&lt;/span&gt;
&lt;span class="nb"&gt;RedirectMatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;301&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/blog/2006/10/18/todd-chritien-greens-choice-voting/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/blog/todd-chritien-greens-choice-voting.html&lt;/span&gt;
&lt;span class="nb"&gt;RedirectMatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;301&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/blog/2007/01/04/changelogs-with-dates-gui-goodness/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sx"&gt;/blog/changelogs-with-dates-gui-goodness.html&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1 id="enabling-table-of-contents-for-posts"&gt;Enabling table of contents for posts&lt;/h1&gt;
&lt;p&gt;If you want to include a table of contents within a post using &lt;code&gt;[TOC]&lt;/code&gt;, you must
enabled the markdown &lt;code&gt;toc&lt;/code&gt; processor with a line like this is your
&lt;code&gt;pelicanconf.py&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;MD_EXTENSIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;toc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;codehilite&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;extra&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;!--
changing default theme's color %s/C74451/11557C/g in main.css
    %s/C74350/11557C/g 
--&gt;

&lt;h1 id="categories-and-tags"&gt;Categories and tags&lt;/h1&gt;
&lt;p&gt;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?&lt;/p&gt;
&lt;p&gt;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, &lt;a href="//pirsquared.org/blog/pelican-tags-vs-categories.html"&gt;pelican
tags-vs-categories&lt;/a&gt; has got you
covered.&lt;/p&gt;
&lt;h1 id="thats-it-for-now"&gt;That's it for now&lt;/h1&gt;
&lt;p&gt;Thanks to Preston Holmes (@ptone) for encouraging me to transition away from WordPress, and
pointing me to &lt;a href="http://www.macdrifter.com/2012/08/pelican-guide-moving-from-wordpress-and-initial-setup.html"&gt;this post by Gabe
Weatherhead&lt;/a&gt;
(@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 &lt;a href="http://futurile.net/resources/blogging/pelican.html"&gt;this post by Steve
George&lt;/a&gt; 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 &lt;a href="http://jakevdp.github.io/blog/2013/05/07/migrating-from-octopress-to-pelican/"&gt;his
writeup&lt;/a&gt;
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. &lt;a href="//pirsquared.org/blog/publishers-block.html"&gt;LTS&lt;/a&gt;.&lt;/p&gt;</content><category term="technology"></category><category term="hello-world"></category><category term="pelican"></category><category term="python"></category></entry><entry><title>Cycling</title><link href="//pirsquared.org/blog/cycling.html" rel="alternate"></link><published>2013-05-23T00:00:00-07:00</published><updated>2013-05-23T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2013-05-23:/blog/cycling.html</id><content type="html">&lt;p&gt;A page about cycling in the East Bay (and the San Francisco Bay Area in
general).&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#routes"&gt;Routes&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#20-40-km"&gt;20-40 km&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#50-km-and-beyond"&gt;50 km and beyond&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#centuries"&gt;Centuries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#routes-to-avoid"&gt;Routes to avoid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#local-bike-shops"&gt;Local Bike Shops&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#resources"&gt;Resources&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;You need a bike, a water bottle, a jersey or a saddle bag (to store your snack,
phone, patch kit). Everything else is optional.&lt;/p&gt;


&lt;h1 id="routes"&gt;Routes&lt;/h1&gt;
&lt;p&gt;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 &lt;a href="http://sfrandonneurs.org/summer-2013-115k-populaire.htm"&gt;plan to rectify
  soon&lt;/a&gt;). 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
  &lt;a href="//pirsquared.org/blog/coming-to-you-live-from-my-desk.html"&gt;here&lt;/a&gt;). I convinced 
  (my then future roommate) &lt;a href="http://mathburritos.org/about/"&gt;Philip&lt;/a&gt; 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 &lt;a href="//pirsquared.org/blog/cycling-log.html"&gt;my cycling log&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="20-40-km"&gt;20-40 km&lt;/h2&gt;
&lt;p&gt;Here is the overview: If you want a shorter ride with a great view - I recommend
&lt;a href="http://www.mapmyride.com/us/berkeley-ca/vision-science-ride-route-160608138"&gt;this 24 km (15 mi) loop from UC Berkeley to Grizzly
Peak&lt;/a&gt;.
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 &lt;a href="http://www.mapmyride.com/routes/view/213844993"&gt;alternative option&lt;/a&gt;,
instead of going up to Grizzly Peak, you can turn off for a slightly shorter
(but really fun) descent that ends at the historic &lt;a href="http://en.wikipedia.org/wiki/Claremont_Resort"&gt;Claremont
Hotel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What's nice about these loops is that you can &lt;a href="http://www.mapmyride.com/routes/view/210567881"&gt;do them
back-to-back&lt;/a&gt; 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.&lt;/p&gt;
&lt;h2 id="50-km-and-beyond"&gt;50 km and beyond&lt;/h2&gt;
&lt;p&gt;If you have some time (about twice the time it takes to do the shorter routes
above), the &lt;a href="http://www.mapmyride.com/routes/view/201723738"&gt;Redwood-Pinehurst&lt;/a&gt;
route will take you through an incredible canyon that's filled with redwoods!
You can take the loop in the other direction -
&lt;a href="http://www.mapmyride.com/routes/view/208532541"&gt;Pinehurst-Redwood&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another local favorite is the &lt;a href="http://www.mapmyride.com/routes/view/199917630"&gt;"Three Bears"
ride&lt;/a&gt;, which has some truly
scenic views all throughout (62 km, ~1 km gain). &lt;/p&gt;
&lt;p&gt;My longest ride was &lt;a href="//pirsquared.org/blog/first-200k.html"&gt;the El Cerrito to Davis 200K&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My previous longest ride took me &lt;a href="http://ridewithgps.com/trips/1422565"&gt;half-way up Mt
Diablo&lt;/a&gt; - the views from there are
breathtaking. Can't wait to go all the way up!  (115.5 km, 1825 m gain)&lt;/p&gt;
&lt;h2 id="centuries"&gt;Centuries&lt;/h2&gt;
&lt;p&gt;&lt;del&gt;I haven't yet  completed a century.&lt;/del&gt; &lt;ins&gt;April 2014 - &lt;a href="//pirsquared.org/blog/first-200k.html"&gt;El Cerrito-Davis 200K was my first century! (132 miles)&lt;/a&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;Here are some local ones that I have my eye on. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.grizzlypeakcyclists.org/century/"&gt;Grizzly Peak Century&lt;/a&gt; is
one that goes through some of the local East Bay routes I described above.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bob.cherrycitycyclists.org/"&gt;Best of The Bay Century&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.davisbikeclub.org/annual_events/organized_rides/foxys_fall_century"&gt;Foxy's Fall
Century&lt;/a&gt;
is an organized ride based out of Davis, CA, where I was an undergrad.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.davisbikeclub.org/annual_events/organized_rides/davis_double_century"&gt;Davis Double
Century&lt;/a&gt;
is in my sights as well. Maybe next year I'll get on the board of the
&lt;a href="http://www.caltriplecrown.com/"&gt;California Triple Crown&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are a lot of &lt;a href="http://www.dssf.org/dssf_html/century.php"&gt;long rides listed on the Different Spokes San Francisco
website&lt;/a&gt;. &lt;a href="http://sfrandonneurs.org/"&gt;San Francisco
Randonneurs&lt;/a&gt; run a very regular
brevet series. &lt;!-- look at http://www.rusa.org/memberservices.html --&gt;&lt;/p&gt;
&lt;h2 id="routes-to-avoid"&gt;Routes to avoid&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h1 id="local-bike-shops"&gt;Local Bike Shops&lt;/h1&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.missinglink.org/"&gt;Missing Link Bicycle Cooperative&lt;/a&gt; - 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! &lt;/p&gt;
&lt;p&gt;&lt;a href="http://blueheronbikesberkeley.com/"&gt;Blue Heron Bikes&lt;/a&gt; - 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.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wojcyclery.com/"&gt;Wheels of Justice Cyclery&lt;/a&gt; - The wheels of justice
grind slowly, but exceedingly fine.&lt;/p&gt;
&lt;h1 id="resources"&gt;Resources&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.bikeeastbay.org/"&gt;Bike East Bay&lt;/a&gt; - a very active local group
(previously went by the name East Bay Bike Coalition).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.albanystrollroll.org/"&gt;Albany Strollers and Rollers&lt;/a&gt; - Albany,
California, is a little 1.5 square mile city just north of Berkeley which I call
home.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://berkeleycriticalmass.wordpress.com/"&gt;Berkeley Critical Mass&lt;/a&gt; - 2nd
Friday of each month - departs at 6pm from Downtown Berkeley BART station.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://eastbaybikeparty.wordpress.com/"&gt;East Bay Bike Party&lt;/a&gt; - a monthly
evening ride.&lt;/p&gt;
&lt;p&gt;&lt;a href="//pirsquared.org/blog/just-ride.html"&gt;Just Ride&lt;/a&gt; - my review of Grant Petersen's book.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Here's some ASCII art I made that I now use as my email signature:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;                   _
                  / \
                A*   \^   -
             ,./   _.`\\ / \
            / ,--.S    \/   \
           /  `&amp;quot;~,_     \    \
     __o           ?
   _ \&amp;lt;,_         /:\
--(_)/-(_)----.../ | \
--------------.......J
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="cycling"></category><category term="cycling"></category></entry><entry><title>Just Ride</title><link href="//pirsquared.org/blog/just-ride.html" rel="alternate"></link><published>2013-05-17T00:00:00-07:00</published><updated>2013-05-17T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2013-05-17:/blog/just-ride.html</id><content type="html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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".&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;I also learned a new word: Beausage (byoo-sidj). My current bike doesn't have
any, but my last laptop certainly does.&lt;/p&gt;
&lt;p&gt;It also felt kind of cool that the author is local. Grant Petersen founded and
still runs Rivendell Bicycle Works in Walnut Creek, CA.&lt;/p&gt;</content><category term="books"></category><category term="cycling"></category></entry><entry><title>Cycling log</title><link href="//pirsquared.org/blog/cycling-log.html" rel="alternate"></link><published>2013-04-17T00:00:00-07:00</published><updated>2013-04-17T00:00:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2013-04-17:/blog/cycling-log.html</id><summary type="html">&lt;p&gt;Why do I keep a log? &lt;a href="/blog/cycling-log.html#about"&gt;Read here&lt;/a&gt;. This log is
terse, if you want longer descriptions of the rides, read my &lt;a href="//pirsquared.org/blog/cycling.html"&gt;advice for cycling
in the East Bay&lt;/a&gt;.&lt;/p&gt;
&lt;!-- 9 km to Cole coffee, 6.5 km from Strada --&gt;

&lt;hr&gt;
&lt;p&gt;2018-06-17 &lt;a href="https://ridewithgps.com/routes/27818707"&gt;Bay Trail to Mountain View&lt;/a&gt;
I &amp;lt;3 the Bay Trail - especially the gravel portions which Jon had introduced me
to almost two years ago (2016-08-07). Had a coffee and waffle at Blue Bottle in
Jack London Square near the beginning, and took an eggs benedict breakfast in
Newark before crossing via Dumbarton Bridge. &lt;/p&gt;
&lt;p&gt;88.4 km +127 m&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-06-09 &lt;a href="https://ridewithgps.com/routes/26816288"&gt;Treasure Bica loop&lt;/a&gt; - I've
sort of lost my cadance of logging these rides. I guess the ones I do alone all
end up blending together, unless they're particularly long.&lt;/p&gt;
&lt;p&gt;60.6 km +771 m &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-05-19 &lt;a href="https://ridewithgps.com/routes/2444171"&gt;Fort Bragg 600k&lt;/a&gt; - Wow. What an
adventure. We started at 6am and I made it to Fort Bragg (mile ~180) at 10pm
after riding along the coast to beautiful fog filtered sunset. Stayed there for
an hour, then finally headed back to a campground at mile 225, because Kaley was
leaving (otherwise I don't know how long I would have stayed
there). Again, couldn't keep up with her the whole time, but didn't fall too far
behind. At the camp, I slept in a chair in front of a fire pit from 3:15am to
about 5:15, when I woke up to fresh eggs, bacon, and coffee being made for
riders faster than me who were getting ready to head out. Left the campground at
6:15am, and needed to be at Pt Reyes Station by 6pm to make time cut off. Rode
with Juliayn and Tom for a while - from Cloverdale to Healdsburg. Then took a
longer break as they continued on and hooked up with Pierre - having a pleasant
chat and good company almost all the way back to Freestone, where Pierre got a
flat and insisted I keep going on my own. After figuring out that I wasn't as
tired as much as I was cold - especially through the headwinds at Keys Creek - I 
proceeded to layer back up. I got to Point Reyes Station at 4:23pm (plenty
ahead of the 6 something cutoff time), and then proceeded to ride more
leisurely, taking a nap in a bus stop booth on Sir Francis Drake, getting tea
and a morning bun at a cafe in Fairfax, and finally finishing at 8:20pm at Chrissy
Field back in SF. Pierre ended up catching up right at the end of the
last climb out of Sausalito and we rode in together. So that's 38 hours and 19 
minutes elapsed time for this 600k. You can &lt;a href="http://449km.blogspot.com/2018/05/the-san-francisco-randonneurs-fort.html"&gt;read more about this annual ride
from Rob
Hawks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;600 km  +5900 m  38 hours 19 minutes&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://ridewithgps.com/routes/1795615"&gt;Hopland 400k&lt;/a&gt; - the beer and hard cider
in Hopland seemed like a good idea at the time...  Rode a big chunk of this with
Phillip again - but had to let him go shortly after Petaluma safeway - I was too
slow and nauseous after throwing up.&lt;/p&gt;
&lt;p&gt;400 km +3921 m 24 hours 10 minutes&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-05-07 &lt;a href="https://ridewithgps.com/routes/26816288"&gt;Treasure Bica loop&lt;/a&gt; - The
building that was in the median at the stop sign as you enter treasure island is
gone. Saw a coyote near the top of South Park Dr.&lt;/p&gt;
&lt;p&gt;60.6 km +771 m &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-04-14 &lt;a href="https://ridewithgps.com/routes/27240761"&gt;Treasure Bica + Wildcat&lt;/a&gt;
72.5 km +979 m  4 hours&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-04-11 - Hawk Hill and Sausalito. Mario and Shawn joined me to brave the rain. &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-03-30 &lt;a href="https://ridewithgps.com/trips/21725434"&gt;A local 100k&lt;/a&gt;
Treasure island, Bica, Papa Bear, Orinda. I should make something like this into
a RUSA perm and ride it for a P-12 &lt;/p&gt;
&lt;p&gt;97.2 km, 1846m gain&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-03-10 &lt;a href="https://ridewithgps.com/routes/1771223"&gt;Healdsburg 300k&lt;/a&gt; - Yet
another wonderful day on the bike. I stayed at my brother's in the city to make
the 6am start, but as a result my breakfast was a banana just before the store.
So after I got to the first control quickly, 9:10 - I decided to have a nice
breakfast and stayed till about 9:45. Rode with Eri[ck]a, Matt and Mike for a
while to the second control. Caught up with Jack in Samuel P Taylor Park and
paired up for a bit. He let me go on the last climb on Sir Francis Drake. &lt;/p&gt;
&lt;p&gt;My legs felt good - I was able to power through Marin .&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://www.youtube.com/watch?v=M2UBf25fPnk"&gt;Brian Chun's video&lt;/a&gt; of the
ride.&lt;/p&gt;
&lt;p&gt;300.2 km +2549 m  15 hours 34 min&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-03-04 &lt;a href="https://ridewithgps.com/routes/26816288"&gt;Treasure Bica loop&lt;/a&gt; - The
building that was in the median at the stop sign as you enter treasure island is
gone. Saw a coyote near the top of South Park Dr.&lt;/p&gt;
&lt;p&gt;59.2 km +758 m&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-02-26 - &lt;a href="https://ridewithgps.com/routes/26870152"&gt;Mt Hamilton 200k&lt;/a&gt; -
amazing ride - we rode through the &lt;em&gt;snow&lt;/em&gt; in the Bay Area (the peak had a good
bunch of it, including some on the road) - lucked out into a paceline through
most of Mines Rd to beat the wind. Rode a chunk of this with Phillip. Saw a fox
riding through the dark on Pinehurst.&lt;/p&gt;
&lt;p&gt;see &lt;a href="https://www.flickr.com/photos/58323617@N08/sets/72157693079894274/"&gt;Eric Walstad's
photos&lt;/a&gt;, or
&lt;a href="https://www.youtube.com/watch?v=bOuOeWjdcjI"&gt;Greg Merrit's video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;201.9 km  +2869 m&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-02-17 - &lt;a href="https://ridewithgps.com/routes/26967076"&gt;Treasure Bica, with more Bay
Trail&lt;/a&gt; - got rained out so decided to
skip the tunnel road climb.
55.4 km +400 m&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-02-10 -  &lt;a href="https://ridewithgps.com/routes/26816288"&gt;Treasure Bica loop&lt;/a&gt; -
59.2 km +758 m&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-02-03 -  &lt;a href="https://ridewithgps.com/routes/26816288"&gt;Treasure Bica loop&lt;/a&gt; -
fell off the wagon there in keeping these updated.. missed a few rides - Sara
and Kayvon, and Greg, too.
59.2 km +758 m&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-08-12 &lt;a href="https://ridewithgps.com/trips/16873423"&gt;Another coffee run&lt;/a&gt; - took a more creative descent.
[48km, 1000m gain, 3 hours]&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-08-05 &lt;a href="https://ridewithgps.com/trips/16709291"&gt;Coffee run&lt;/a&gt; - the descent on
Tunnel Road is the worst it's been in many years - way too many potholes and broken asphalt 
53km, 1000m gain, 3 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I rode several times between May and July, but somehow neglected to document any
of thos rides&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-05-07 &lt;a href="https://ridewithgps.com/routes/20436034"&gt;Grizzly Peak Century&lt;/a&gt; -
Rode to the start to add an extra 20k and 300m of climbing.
(140km, 2100m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-04-30 &lt;a href=""&gt;Treasure Island&lt;/a&gt; - rode with Sara and Kayvon - so good to see
them both again.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-04-01 &lt;a href=""&gt;Tunnel Road + Orinda dash&lt;/a&gt; - A reasonably short ride with Greg&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-02-25 &lt;a href=""&gt;SF Tri Club in the East Bay&lt;/a&gt; - 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)&lt;/p&gt;
&lt;p&gt;--
2017-03-22 &lt;a href=""&gt;Direct to Orinda and back&lt;/a&gt; - left my water bottle there the
weekend prior&lt;/p&gt;
&lt;p&gt;--
2017-03-15 &lt;a href=""&gt;Happy Valley loop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;--
2017-02-25 &lt;a href=""&gt;Pt Richmond&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-02-18 &lt;a href=""&gt;Pt Richmond&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-02-11 &lt;a href=""&gt;Pt Richmond&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-01-29 &lt;a href=""&gt;Ciba and back&lt;/a&gt; - a lovely weather ride with Greg. I stuck around for
a Hawk Hill loop before heading home. First time at Ciba - great coffee!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-01-16 &lt;a href="http://ridewithgps.com/trips/7153825"&gt;Happy valley loop&lt;/a&gt; - saw Gabi
hiking in Tilden.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-01-13 &lt;a href=""&gt;Friday morning ride&lt;/a&gt; - 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.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-01-02 &lt;a href=""&gt;Tour the Flats&lt;/a&gt; - 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.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-10-23 &lt;a href="http://ridewithgps.com/trips/7153825"&gt;Happy valley loop&lt;/a&gt; - didn't
take any snacks with me, was OK.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-10-18 &lt;a href=""&gt;Social ride&lt;/a&gt; - With Sara and Kayvon.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-10-09 &lt;a href=""&gt;Russian River 200k (modified)&lt;/a&gt; - 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.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-08-13 &lt;a href="https://ridewithgps.com/routes/7356381"&gt;El Cerrito - Davis 200k&lt;/a&gt; - 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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-08-12 &lt;a href=""&gt;Friday morning social ride&lt;/a&gt; - Danny and Jon, over Grizzly Peak
(42 km,  759m gain, 1.5 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-08-07 &lt;a href="https://ridewithgps.com/trips/10382882"&gt;Bay Trail - Oakland to
Fremont&lt;/a&gt; with Jon - beautiful day, the
mixed terrain was very welcome.
(90km, 137m gain, 5 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-08-05 &lt;a href=""&gt;Friday morning social ride&lt;/a&gt; - just Danny and I, took Claremont.
(40km, 678m gain, 1.5 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-07-23 &lt;a href="http://ridewithgps.com/trips/7153825"&gt;Happy valley loop&lt;/a&gt; - good to
be back on the bike, it was a hot one.
(57km, 1062m gain, 2.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-07-10 &lt;a href="https://ridewithgps.com/routes/1496310"&gt;Cloverdale to SF 200k&lt;/a&gt; -
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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-07-09 &lt;a href="https://ridewithgps.com/routes/1528694"&gt;Boonville Lollipop 300k&lt;/a&gt; -
My first 300k!
(310km, 3188m gain, 14 hours 56 minutes)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-07-07 &lt;a href=""&gt;Hawk Hill&lt;/a&gt; with Janet! We saw whales when we stopped part way down
the descent.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-07-03 &lt;a href="https://ridewithgps.com/trips/9778910"&gt;Return to Reliez&lt;/a&gt; - 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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-07-01 &lt;a href="https://ridewithgps.com/trips/9778977"&gt;Friday with Jon&lt;/a&gt; - had a good
conversation about 3D modeling tools, and a possible stealth project...
(52km, 860m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-06-25 &lt;a href="https://ridewithgps.com/routes/1770624"&gt;Russian River 200k&lt;/a&gt; - what a
lovely ride!
(205km, 2026m gain, 9 hours 25 minutes)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-06-24 &lt;a href=""&gt;Friday with Danny and Jon&lt;/a&gt; - 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.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-06-11 &lt;a href="http://ridewithgps.com/trips/7153825"&gt;Happy valley loop&lt;/a&gt; - 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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-05-22 &lt;a href="https://ridewithgps.com/routes/7356381"&gt;El Cerrito - Davis 200k&lt;/a&gt; - a
solo ride, the second in my quest for my first
&lt;a href="https://rusa.org/award_r12.html"&gt;R-12&lt;/a&gt;. Took &lt;a href="//pirsquared.org/images/2016-05-22-200k/"&gt;a bunch of
photos&lt;/a&gt;.
(213km, 2472m climbing, 10 hours total)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-05-12 &lt;a href="https://ridewithgps.com/trips/8927613"&gt;Bike to Work day!&lt;/a&gt; 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. &lt;a href="https://www.strava.com/activities/573899947"&gt;Danny has a few photos on his
Strava&lt;/a&gt;
(56km, 650m gain, 3 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-05-08 &lt;a href="https://ridewithgps.com/routes/13619380"&gt;Bear-y Happy&lt;/a&gt; Nice and
foggy morning ride, fueled by Doughnut Dolly!
(75km, 1174 m gain, 3 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-05-01 &lt;a href="https://ridewithgps.com/routes/10956000"&gt;Grizzly Peak Century&lt;/a&gt; -
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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-04-30 &lt;a href="https://ridewithgps.com/trips/8769728"&gt;The ride of two Pauls&lt;/a&gt; - 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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-04-29 &lt;a href="https://ridewithgps.com/routes/13462350"&gt;Another Friday with Danny&lt;/a&gt; -
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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-04-16 &lt;a href="https://ridewithgps.com/routes/7356381"&gt;El Cerrito - Davis 200k&lt;/a&gt; - a
wonderful day for a ride
(213km, 2472m climbing, 9 hours of saddle time, 10 hours total)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-04-10 &lt;a href="http://ridewithgps.com/trips/7153825"&gt;Happy LaMo return via Arlington
again&lt;/a&gt; - 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 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Why do I keep a log? &lt;a href="/blog/cycling-log.html#about"&gt;Read here&lt;/a&gt;. This log is
terse, if you want longer descriptions of the rides, read my &lt;a href="//pirsquared.org/blog/cycling.html"&gt;advice for cycling
in the East Bay&lt;/a&gt;.&lt;/p&gt;
&lt;!-- 9 km to Cole coffee, 6.5 km from Strada --&gt;

&lt;hr&gt;
&lt;p&gt;2018-06-17 &lt;a href="https://ridewithgps.com/routes/27818707"&gt;Bay Trail to Mountain View&lt;/a&gt;
I &amp;lt;3 the Bay Trail - especially the gravel portions which Jon had introduced me
to almost two years ago (2016-08-07). Had a coffee and waffle at Blue Bottle in
Jack London Square near the beginning, and took an eggs benedict breakfast in
Newark before crossing via Dumbarton Bridge. &lt;/p&gt;
&lt;p&gt;88.4 km +127 m&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-06-09 &lt;a href="https://ridewithgps.com/routes/26816288"&gt;Treasure Bica loop&lt;/a&gt; - I've
sort of lost my cadance of logging these rides. I guess the ones I do alone all
end up blending together, unless they're particularly long.&lt;/p&gt;
&lt;p&gt;60.6 km +771 m &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-05-19 &lt;a href="https://ridewithgps.com/routes/2444171"&gt;Fort Bragg 600k&lt;/a&gt; - Wow. What an
adventure. We started at 6am and I made it to Fort Bragg (mile ~180) at 10pm
after riding along the coast to beautiful fog filtered sunset. Stayed there for
an hour, then finally headed back to a campground at mile 225, because Kaley was
leaving (otherwise I don't know how long I would have stayed
there). Again, couldn't keep up with her the whole time, but didn't fall too far
behind. At the camp, I slept in a chair in front of a fire pit from 3:15am to
about 5:15, when I woke up to fresh eggs, bacon, and coffee being made for
riders faster than me who were getting ready to head out. Left the campground at
6:15am, and needed to be at Pt Reyes Station by 6pm to make time cut off. Rode
with Juliayn and Tom for a while - from Cloverdale to Healdsburg. Then took a
longer break as they continued on and hooked up with Pierre - having a pleasant
chat and good company almost all the way back to Freestone, where Pierre got a
flat and insisted I keep going on my own. After figuring out that I wasn't as
tired as much as I was cold - especially through the headwinds at Keys Creek - I 
proceeded to layer back up. I got to Point Reyes Station at 4:23pm (plenty
ahead of the 6 something cutoff time), and then proceeded to ride more
leisurely, taking a nap in a bus stop booth on Sir Francis Drake, getting tea
and a morning bun at a cafe in Fairfax, and finally finishing at 8:20pm at Chrissy
Field back in SF. Pierre ended up catching up right at the end of the
last climb out of Sausalito and we rode in together. So that's 38 hours and 19 
minutes elapsed time for this 600k. You can &lt;a href="http://449km.blogspot.com/2018/05/the-san-francisco-randonneurs-fort.html"&gt;read more about this annual ride
from Rob
Hawks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;600 km  +5900 m  38 hours 19 minutes&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://ridewithgps.com/routes/1795615"&gt;Hopland 400k&lt;/a&gt; - the beer and hard cider
in Hopland seemed like a good idea at the time...  Rode a big chunk of this with
Phillip again - but had to let him go shortly after Petaluma safeway - I was too
slow and nauseous after throwing up.&lt;/p&gt;
&lt;p&gt;400 km +3921 m 24 hours 10 minutes&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-05-07 &lt;a href="https://ridewithgps.com/routes/26816288"&gt;Treasure Bica loop&lt;/a&gt; - The
building that was in the median at the stop sign as you enter treasure island is
gone. Saw a coyote near the top of South Park Dr.&lt;/p&gt;
&lt;p&gt;60.6 km +771 m &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-04-14 &lt;a href="https://ridewithgps.com/routes/27240761"&gt;Treasure Bica + Wildcat&lt;/a&gt;
72.5 km +979 m  4 hours&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-04-11 - Hawk Hill and Sausalito. Mario and Shawn joined me to brave the rain. &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-03-30 &lt;a href="https://ridewithgps.com/trips/21725434"&gt;A local 100k&lt;/a&gt;
Treasure island, Bica, Papa Bear, Orinda. I should make something like this into
a RUSA perm and ride it for a P-12 &lt;/p&gt;
&lt;p&gt;97.2 km, 1846m gain&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-03-10 &lt;a href="https://ridewithgps.com/routes/1771223"&gt;Healdsburg 300k&lt;/a&gt; - Yet
another wonderful day on the bike. I stayed at my brother's in the city to make
the 6am start, but as a result my breakfast was a banana just before the store.
So after I got to the first control quickly, 9:10 - I decided to have a nice
breakfast and stayed till about 9:45. Rode with Eri[ck]a, Matt and Mike for a
while to the second control. Caught up with Jack in Samuel P Taylor Park and
paired up for a bit. He let me go on the last climb on Sir Francis Drake. &lt;/p&gt;
&lt;p&gt;My legs felt good - I was able to power through Marin .&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://www.youtube.com/watch?v=M2UBf25fPnk"&gt;Brian Chun's video&lt;/a&gt; of the
ride.&lt;/p&gt;
&lt;p&gt;300.2 km +2549 m  15 hours 34 min&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-03-04 &lt;a href="https://ridewithgps.com/routes/26816288"&gt;Treasure Bica loop&lt;/a&gt; - The
building that was in the median at the stop sign as you enter treasure island is
gone. Saw a coyote near the top of South Park Dr.&lt;/p&gt;
&lt;p&gt;59.2 km +758 m&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-02-26 - &lt;a href="https://ridewithgps.com/routes/26870152"&gt;Mt Hamilton 200k&lt;/a&gt; -
amazing ride - we rode through the &lt;em&gt;snow&lt;/em&gt; in the Bay Area (the peak had a good
bunch of it, including some on the road) - lucked out into a paceline through
most of Mines Rd to beat the wind. Rode a chunk of this with Phillip. Saw a fox
riding through the dark on Pinehurst.&lt;/p&gt;
&lt;p&gt;see &lt;a href="https://www.flickr.com/photos/58323617@N08/sets/72157693079894274/"&gt;Eric Walstad's
photos&lt;/a&gt;, or
&lt;a href="https://www.youtube.com/watch?v=bOuOeWjdcjI"&gt;Greg Merrit's video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;201.9 km  +2869 m&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-02-17 - &lt;a href="https://ridewithgps.com/routes/26967076"&gt;Treasure Bica, with more Bay
Trail&lt;/a&gt; - got rained out so decided to
skip the tunnel road climb.
55.4 km +400 m&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-02-10 -  &lt;a href="https://ridewithgps.com/routes/26816288"&gt;Treasure Bica loop&lt;/a&gt; -
59.2 km +758 m&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2018-02-03 -  &lt;a href="https://ridewithgps.com/routes/26816288"&gt;Treasure Bica loop&lt;/a&gt; -
fell off the wagon there in keeping these updated.. missed a few rides - Sara
and Kayvon, and Greg, too.
59.2 km +758 m&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-08-12 &lt;a href="https://ridewithgps.com/trips/16873423"&gt;Another coffee run&lt;/a&gt; - took a more creative descent.
[48km, 1000m gain, 3 hours]&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-08-05 &lt;a href="https://ridewithgps.com/trips/16709291"&gt;Coffee run&lt;/a&gt; - the descent on
Tunnel Road is the worst it's been in many years - way too many potholes and broken asphalt 
53km, 1000m gain, 3 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I rode several times between May and July, but somehow neglected to document any
of thos rides&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-05-07 &lt;a href="https://ridewithgps.com/routes/20436034"&gt;Grizzly Peak Century&lt;/a&gt; -
Rode to the start to add an extra 20k and 300m of climbing.
(140km, 2100m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-04-30 &lt;a href=""&gt;Treasure Island&lt;/a&gt; - rode with Sara and Kayvon - so good to see
them both again.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-04-01 &lt;a href=""&gt;Tunnel Road + Orinda dash&lt;/a&gt; - A reasonably short ride with Greg&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-02-25 &lt;a href=""&gt;SF Tri Club in the East Bay&lt;/a&gt; - 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)&lt;/p&gt;
&lt;p&gt;--
2017-03-22 &lt;a href=""&gt;Direct to Orinda and back&lt;/a&gt; - left my water bottle there the
weekend prior&lt;/p&gt;
&lt;p&gt;--
2017-03-15 &lt;a href=""&gt;Happy Valley loop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;--
2017-02-25 &lt;a href=""&gt;Pt Richmond&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-02-18 &lt;a href=""&gt;Pt Richmond&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-02-11 &lt;a href=""&gt;Pt Richmond&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-01-29 &lt;a href=""&gt;Ciba and back&lt;/a&gt; - a lovely weather ride with Greg. I stuck around for
a Hawk Hill loop before heading home. First time at Ciba - great coffee!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-01-16 &lt;a href="http://ridewithgps.com/trips/7153825"&gt;Happy valley loop&lt;/a&gt; - saw Gabi
hiking in Tilden.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-01-13 &lt;a href=""&gt;Friday morning ride&lt;/a&gt; - 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.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2017-01-02 &lt;a href=""&gt;Tour the Flats&lt;/a&gt; - 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.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-10-23 &lt;a href="http://ridewithgps.com/trips/7153825"&gt;Happy valley loop&lt;/a&gt; - didn't
take any snacks with me, was OK.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-10-18 &lt;a href=""&gt;Social ride&lt;/a&gt; - With Sara and Kayvon.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-10-09 &lt;a href=""&gt;Russian River 200k (modified)&lt;/a&gt; - 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.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-08-13 &lt;a href="https://ridewithgps.com/routes/7356381"&gt;El Cerrito - Davis 200k&lt;/a&gt; - 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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-08-12 &lt;a href=""&gt;Friday morning social ride&lt;/a&gt; - Danny and Jon, over Grizzly Peak
(42 km,  759m gain, 1.5 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-08-07 &lt;a href="https://ridewithgps.com/trips/10382882"&gt;Bay Trail - Oakland to
Fremont&lt;/a&gt; with Jon - beautiful day, the
mixed terrain was very welcome.
(90km, 137m gain, 5 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-08-05 &lt;a href=""&gt;Friday morning social ride&lt;/a&gt; - just Danny and I, took Claremont.
(40km, 678m gain, 1.5 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-07-23 &lt;a href="http://ridewithgps.com/trips/7153825"&gt;Happy valley loop&lt;/a&gt; - good to
be back on the bike, it was a hot one.
(57km, 1062m gain, 2.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-07-10 &lt;a href="https://ridewithgps.com/routes/1496310"&gt;Cloverdale to SF 200k&lt;/a&gt; -
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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-07-09 &lt;a href="https://ridewithgps.com/routes/1528694"&gt;Boonville Lollipop 300k&lt;/a&gt; -
My first 300k!
(310km, 3188m gain, 14 hours 56 minutes)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-07-07 &lt;a href=""&gt;Hawk Hill&lt;/a&gt; with Janet! We saw whales when we stopped part way down
the descent.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-07-03 &lt;a href="https://ridewithgps.com/trips/9778910"&gt;Return to Reliez&lt;/a&gt; - 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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-07-01 &lt;a href="https://ridewithgps.com/trips/9778977"&gt;Friday with Jon&lt;/a&gt; - had a good
conversation about 3D modeling tools, and a possible stealth project...
(52km, 860m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-06-25 &lt;a href="https://ridewithgps.com/routes/1770624"&gt;Russian River 200k&lt;/a&gt; - what a
lovely ride!
(205km, 2026m gain, 9 hours 25 minutes)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-06-24 &lt;a href=""&gt;Friday with Danny and Jon&lt;/a&gt; - 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.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-06-11 &lt;a href="http://ridewithgps.com/trips/7153825"&gt;Happy valley loop&lt;/a&gt; - 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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-05-22 &lt;a href="https://ridewithgps.com/routes/7356381"&gt;El Cerrito - Davis 200k&lt;/a&gt; - a
solo ride, the second in my quest for my first
&lt;a href="https://rusa.org/award_r12.html"&gt;R-12&lt;/a&gt;. Took &lt;a href="//pirsquared.org/images/2016-05-22-200k/"&gt;a bunch of
photos&lt;/a&gt;.
(213km, 2472m climbing, 10 hours total)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-05-12 &lt;a href="https://ridewithgps.com/trips/8927613"&gt;Bike to Work day!&lt;/a&gt; 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. &lt;a href="https://www.strava.com/activities/573899947"&gt;Danny has a few photos on his
Strava&lt;/a&gt;
(56km, 650m gain, 3 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-05-08 &lt;a href="https://ridewithgps.com/routes/13619380"&gt;Bear-y Happy&lt;/a&gt; Nice and
foggy morning ride, fueled by Doughnut Dolly!
(75km, 1174 m gain, 3 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-05-01 &lt;a href="https://ridewithgps.com/routes/10956000"&gt;Grizzly Peak Century&lt;/a&gt; -
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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-04-30 &lt;a href="https://ridewithgps.com/trips/8769728"&gt;The ride of two Pauls&lt;/a&gt; - 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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-04-29 &lt;a href="https://ridewithgps.com/routes/13462350"&gt;Another Friday with Danny&lt;/a&gt; -
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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-04-16 &lt;a href="https://ridewithgps.com/routes/7356381"&gt;El Cerrito - Davis 200k&lt;/a&gt; - a
wonderful day for a ride
(213km, 2472m climbing, 9 hours of saddle time, 10 hours total)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-04-10 &lt;a href="http://ridewithgps.com/trips/7153825"&gt;Happy LaMo return via Arlington
again&lt;/a&gt; - 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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-04-03 &lt;a href="https://ridewithgps.com/trips/8383921"&gt;Longer training ride&lt;/a&gt;, 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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-04-01
&lt;a href="https://ridewithgps.com/trips/8287914"&gt;(Anti) Social ride&lt;/a&gt; - Danny slept in, so
I took on Grizzly Peak by myself.
(42 km,  759m gain, 2.5 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-03-26 &lt;a href="http://ridewithgps.com/trips/7153825"&gt;Happy LaMo return via
Arlington&lt;/a&gt; - trying to get ready for the
El Cerrito-Davis 200k
(57km, 1062m gain, 3 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-03-25
&lt;a href="https://ridewithgps.com/trips/8287914"&gt;Friday with Dmatt&lt;/a&gt; - Danny and I decided
to take on Grizzly Peak.
(42 km,  759m gain, 2.5 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="http://ridewithgps.com/trips/7466177"&gt;Wildcat Only&lt;/a&gt; - wow, not&lt;/p&gt;
&lt;p&gt;--
Friday with Dmatt&lt;/p&gt;
&lt;p&gt;--
2016-01-23 &lt;a href=""&gt;A run&lt;/a&gt; - ran to El Cerrito BART station, then the North Berkeley
one, once around UC Berkeley campus and back.
16.7km, 222m gain&lt;/p&gt;
&lt;p&gt;--
2016-01-15 &lt;a href="http://ridewithgps.com/routes/9538728"&gt;Tunnel Road to Claremont&lt;/a&gt; -
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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2016-01-08 &lt;a href="http://ridewithgps.com/routes/9538728"&gt;Tunnel Road to Claremont&lt;/a&gt; -
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 &lt;a href="http://ridewithgps.com/trips/7466177"&gt;Wildcat Only&lt;/a&gt; - wow, not
cycling for two months really made me weak... The cold temperature (5-7&amp;deg;C
 / 41-45&amp;deg; F) didn't help.
(31km,  560m gain, 2 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-10-25 &lt;a href="http://ridewithgps.com/trips/7153825"&gt;Happy LaMo return via
Arlington&lt;/a&gt; - 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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-10-30 &lt;a href="http://ridewithgps.com/routes/9538728"&gt;Tunnel Road to Claremont&lt;/a&gt; -
Jon, Danny, and I. Saw some turkeys, one of whom had beef with us and took it out
on the car behind us.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-10-25 Happy LaMo return via Arlington
(2.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-10-16 &lt;a href="http://ridewithgps.com/routes/9538728"&gt;Tunnel Road to Claremont&lt;/a&gt; -
Just Danny and I today.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-10-10 &lt;a href="http://ridewithgps.com/routes/1771380"&gt;Winters 200k&lt;/a&gt; - 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 &lt;a href="http://www.rusa.org/glossary.html"&gt;2 anciens and 2
anciennes&lt;/a&gt; (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. (&lt;a href="https://www.flickr.com/photos/26801123@N06/albums/72157657385753484"&gt;Photos from an SFR
member&lt;/a&gt;)
(200km, 2266m gain, 9 hours, 28 minutes)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-10-04 &lt;a href="http://ridewithgps.com/trips/6723968"&gt;Willow Ave Park and Ride&lt;/a&gt;
Scoped out the Winters 200K start control for next week.
(51 km, 460 m gain, 2 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-10-02 &lt;a href="http://ridewithgps.com/routes/9538728"&gt;Tunnel Road to Claremont&lt;/a&gt; -
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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-09-27 &lt;a href="https://www.strava.com/activities/401803999"&gt;Pt Reyes Station loop&lt;/a&gt;
with Danny and &lt;a href="https://www.strava.com/activities/401803653"&gt;Stork!&lt;/a&gt; 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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-09-25 &lt;a href="http://ridewithgps.com/routes/9538728"&gt;Tunnel Road to Claremont&lt;/a&gt; -
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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-09-18 &lt;a href="http://ridewithgps.com/trips/6069528"&gt;Tunnel Road to Centennial&lt;/a&gt; - A
ride with Jon and "Hawkeye" Danny!
(40km, 678m gain, 1.5 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-09-14 &lt;a href="http://ridewithgps.com/routes/1798411"&gt;Lucas Valley Populaire&lt;/a&gt;:
Danny's first randonneuring event, it was a really nice, overcast day.
(113km, 1417m gain, 6 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-09-06 &lt;a href="http://ridewithgps.com/trips/2444718"&gt;Happy Valley&lt;/a&gt; First weekend
ride with Danny!
(56km, 1057m gain, 3 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-09-04 &lt;a href="http://ridewithgps.com/routes/9538728"&gt;Tunnel Road to Claremont&lt;/a&gt; -
With Danny and Jonathan! Rode &lt;a href="http://ridewithgps.com/routes/10219724"&gt;up
Euclid&lt;/a&gt; for good measure afterwards.
(40km, 678m gain, 1.5 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-09-01 &lt;a href="http://ridewithgps.com/trips/6069528"&gt;Tunnel Road to Centennial&lt;/a&gt; -
Sara, Kayvon, and Danny!
(37km, 600m gain, 1.5 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-08-27 &lt;a href=""&gt;Wildcat and South Park&lt;/a&gt; - went for a run with Stéfan afterwards
(1.5 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-08-21 &lt;a href="http://ridewithgps.com/trips/6069528"&gt;Tunnel Road to Centennial&lt;/a&gt; -
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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-08-09 &lt;a href="http://ridewithgps.com/trips/6069651"&gt;Wildcat Moraga Redwood&lt;/a&gt; - a
good weekend ride.  (80km, 1.5km gain, 3.5 hours saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-08-07 &lt;a href="http://ridewithgps.com/trips/6069528"&gt;Tunnel Road to Centennial&lt;/a&gt; -
another Friday morning with Sara and Danny. Danny's first time up to Grizzly
Peak. (37km, 600m gain, 2 hours)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-08-03 &lt;a href="http://ridewithgps.com/routes/7732254"&gt;Freestone Bread Run 200K&lt;/a&gt; -
Awesome ride with &lt;a href="http://sfrandonneurs.org/"&gt;SF Randonneurs&lt;/a&gt;,
 - here's an
   &lt;a href="https://picasaweb.google.com/101129983306144734005/2015SFRFreestoneBreadRun200k?authkey=Gv1sRgCOGE9uDQjJagxwE#"&gt;album&lt;/a&gt;
   where I can be seen &lt;a href="https://picasaweb.google.com/101129983306144734005/2015SFRFreestoneBreadRun200k?authkey=Gv1sRgCOGE9uDQjJagxwE#6178897755603733442"&gt;holding a
   coffee&lt;/a&gt;
   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)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-07-31 &lt;a href="http://ridewithgps.com/routes/9538728"&gt;Tunnel Road to Claremont&lt;/a&gt;
with Sara and Danny (DMatt's first time!). Sadly, found out that Nobolom is
closing after 40 years this Sunday, glad to have gotten a chance to go there one
last time.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-07-13 Biked to Oakland for coffee and bacon at Sara and Kayvon's place,
followed by a ride to Concord for a long lunch with Kenji. Took BART from
Pleasant Hill to Rockridge, and then biked home from Rockridge.
(3 hour of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-07-10 Tunnel Road up and down with Sara and Kayvon. We persevered, despite
the rain, and it mostly cleared up and dried out by mid-ride.
(1 hour of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-07-04 Happy LaMo return via Arlington
(2.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-06-26 &lt;a href="http://ridewithgps.com/routes/9538728"&gt;Tunnel Road to Claremont&lt;/a&gt; -
another Friday morning ride with Sara and Kayvon. Ascended on Kavon's single
speeder.
(1.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-06-14 Happy LaMo return via Arlington
(2.5 hours saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-06-12 &lt;a href="http://ridewithgps.com/routes/9538728"&gt;Tunnel Road to Claremont&lt;/a&gt; -
joined by Sara and Kayvon again
(1.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-06-07 Morgan Territory and Mount Diablo (junction only). A ride with Jeff
and his team (Team Roaring Mouse)  - it was waaayy too hot - but the company was
good.
(66.6 miles, 5 hours altogether with waits / regroups)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-06-05 &lt;a href="http://ridewithgps.com/routes/9538728"&gt;Tunnel Road to Claremont&lt;/a&gt; -
joined by Sara and Kayvon
(1.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-05-30 Happy LaMo return via Redwood Wow! First ride on my new Surly Long
Haul Trucker - and it rolls like a dream. I was able to push myself the entire
ride, thanks to the higher gears, as well as the wide handle bars that allowed
for easier breathing during recovery. 
(4 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-05-25 Went up Centennial after checking out a Surly Long Haul Trucker at
The Missing Link. Was cold at Grizzly peak, only had enough time to go down to
Wagner Ranch and come back
(1.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-05-23 Happy LaMo return via Redwood. Inaugural ride in my brand new SF
Randonneurs jersey!
(4 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-05-10 Happy LaMo return via Kensington
(2.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-05-02 &lt;a href="http://ridewithgps.com/trips/2444718"&gt;Happy LaMo&lt;/a&gt; - yay!
(2.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-04-18 &lt;a href="//pirsquared.org/blog/first-200k.html"&gt;El Cerrito - Davis 200k&lt;/a&gt; with SF Randonneurs.
(213 km, 9.5 hours of saddle time, 11 total)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-04-05 Happy LaMo return via Redwood. Downhill portion of tunnel road is
seriously messed up now.
(5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-03-29 Wildcat only. Was sick last week, still not fully recovered, but
figured I'd get at least a short ride in.
(35.5 km,  665 m gain, 1.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-03-15 Happy LaMo return via Pinehurst, then Euclid and return via
Kensington. Glad I had the time to push myself a bit, to get back into shape for
the El Cerrito 200 km.
(4.25 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-03-08 Happy LaMo return via Kensington
(2.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2015-03-01 Wildcat only, return through Kensington. First ride of the year?
Yikes. I did go on a few runs though. Need to make this a regular morning ride
before work a few times per week.
(1.5 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;

&lt;p&gt;2014-10-18
&lt;a href=""&gt;SF Randoneurs' Lucas Valley Populaire&lt;/a&gt; - awesome ride again this year - my
time was 5h 35 minutes - and I did take a few nice breaks, including the
extravagance of a double espresso and a morning in Fairfax on the tail end of
the ride. Seriously considering my first 200K in a few weeks. Been trying to get
in shape the last couple of weeks by compensating for a lack of saddle time with
running for an hour twice per week.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;A few out and back to Wildcat Canyon&lt;/p&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;p&gt;2014-09-07 &lt;a href="http://ridewithgps.com/trips/2444718"&gt;Happy LaMo&lt;/a&gt; - Wasn't as hot,
and I took some snacks with me, so didn't even need to stop in Orinda as I made
my way home.
(56km, 1057 m gain, 3 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-08-31 &lt;a href="http://ridewithgps.com/trips/2444718"&gt;Happy LaMo&lt;/a&gt; - finally working
my way back up to a longer ride. It was pretty hot today.
(56km, 1057 m gain, 3 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-08-24 &lt;a href=""&gt;Wildcat and back&lt;/a&gt; A good pace,&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-08-10 &lt;a href=""&gt;Wildcat and back via Arlington&lt;/a&gt; First ride in a long time due to
back injury that's been slowing me down. The top of Wildcat Canyon is so
incredibly smooth now.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-06-14 &lt;a href=""&gt;Wildcat and back via Arlington&lt;/a&gt;
short ride again today.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-06-01 &lt;a href="http://ridewithgps.com/trips/2753759"&gt;Never Again&lt;/a&gt;
a fun "shortcut" from Inspiration Point ended up costing me an extra hour, and
had me off-roading in my poor roadie. I did see 5 bunnies up there while riding
through the park, though.
(61 km, 1254 m gain, 3 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-04-27 &lt;a href=""&gt;Reliez LaMo&lt;/a&gt; - Got a flat in
as soon as I got on Pleasent Hill Rd, had to walk to Hank and Frank's who fixed
me up.  Again, did this after a 5k run up to campus, but could actually walk
down stair the next day (unlike last time)
(km, m gain, 3 hours of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-04-20 &lt;a href="http://ridewithgps.com/trips/2444718"&gt;Happy LaMo&lt;/a&gt; - met up with Lena
in Orinda and at Inspiration Point. Did this after a 5k run up to campus.
(56km, 1057 m gain, 2 hours 20 minutes of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-04-12 - Happy LaMoRedwood - longer ride&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-04-06
 &lt;a href="http://ridewithgps.com/trips/2444718"&gt;Happy LaMo&lt;/a&gt; - good to be back on my
 bike. Beautiful weather today.
(56km, 1057 m gain, 2 hours 40 minutes of saddle time)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-03-?? - A Bay Trail ride with Jon.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-03-09 &lt;a href=""&gt;South Park&lt;/a&gt; - got a flat at the beginning of Wildcat, so had to
turn back and walk down for an hour and a half all the way to &lt;a href=""&gt;Wheels of
Justice&lt;/a&gt; where Matt fixed it in 7 minutes, and I was on my way back up. Found
out I can't shift into my lowest gear when I got to South Park, so that was a
painful ascent.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-02-16 &lt;a href="http://ridewithgps.com/trips/2246461"&gt;to Happy Valley Rd&lt;/a&gt; - actually
felt like I really pushed hard the whole ride - stayed in my highest gear all
along the top of Wildcat Canyon Rd on the way out. Brought just enough snacks to
stay filled with energy.
(56.7 km, 1291 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-02-12 &lt;a href=""&gt;Brazilian Room and back&lt;/a&gt; only had an hour, but that's an hour
longer than I rode in the last 3 weeks.
(18 km, 339 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-01-19 &lt;a href="http://ridewithgps.com/trips/1367726"&gt;Wildcat Only&lt;/a&gt; same ride again,
faster pace this time.
(35.5 km,  665 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-01-18 &lt;a href="http://ridewithgps.com/trips/1367726"&gt;Wildcat Only&lt;/a&gt; short ride to
get back on that horse.
(35.5 km,  665 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2014-01-10 &lt;a href=""&gt;Grizzly Peak&lt;/a&gt; My first ride of the year (and in well over a
month), wearing jeans and with my messenger bag on, right after therapy. The
best thing for depression is exercise.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-12 Bay Trail short ride with Jon and Sofia
()&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-11 Grizzly Peak with Sara via South Park
()&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-11 a ride with with Minh
()&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-09-23 &lt;a href="http://ridewithgps.com/trips/1839256"&gt;Bay Trail Stroll&lt;/a&gt; with an
extra 30 kilo in tow.
(15 km, 55 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-09-14 &lt;a href="http://ridewithgps.com/routes/1798411"&gt;Lucas Valley Populaire&lt;/a&gt;: Took
BART over to Embarcadero, and after an espresso and waffle at Blue Bottle at the
Ferry Building with my friend JB, we headed over to Chrissy Field, where JB left
me in the good company of Guy, James, Sara, and Kayvon. It was a great day for a
nice long ride, we were mostly bringing up the rear the whole time, but I got to
take a bunch of pictures. Without a doubt, I'm ready for my first 200k
(112.6 km, 1505 m gain) &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-09-08 &lt;a href="http://ridewithgps.com/trips/1735564"&gt;Orinda via Happy Valley&lt;/a&gt; alone
today. It was a hot one, so I took my shirt off and got some of the late-summer
sunshine.
(55.4 km, 1254 m gain) &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-09-08 &lt;a href="http://ridewithgps.com/routes/3316740"&gt;Bay Trail Stroll&lt;/a&gt; we skipped
the Solano variety, and just took a new trailer to the bay trail
(19.8 km, 78 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-09-07 &lt;a href="http://ridewithgps.com/routes/3306046"&gt;The new bridge and Port of
Oakland&lt;/a&gt; Rode across the new section of
the Bay Bridge with my buddy Jon, then he showed me a couple of parks around the
Port of Oakland.
(45 km, 75 m gain) &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-09-06 &lt;a href="http://ridewithgps.com/trips/1775911"&gt;Moraga-Wildcat&lt;/a&gt; Started off as
the Mutton-Chop ride with Cal Cycling. Met tri-athlete and optometry student
Christie, who said she's thinking of going to Moraga when we got to the
intersection of Skyline and Grizzly Peak.  She didn't object to me tagging
along, and we proceeded at a pretty damn fast pace. By the time we were climbing
out back into Tilden, I could barely keep up, but it was a great ride.
(55.3 km, 1062 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-09-02 &lt;a href="http://ridewithgps.com/trips/1735564"&gt;Orinda via Happy Valley&lt;/a&gt; same
ride as the day before, more people were out because of labor day. Stayed in the
highest gear the whole time on Wildcat on my way out.
(55.4 km, 1254 m gain) &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-09-01 &lt;a href="http://ridewithgps.com/trips/1735564"&gt;Orinda via Happy Valley&lt;/a&gt;
A cyclist with a Portland jersey let me lead but kept me honest up Wildcat, then
he got ahead of me on the downhill - it sucks to not have a reasonable high
gear. Didn't visit Granny's house on the way up the Happy Valley hill.
(55.4 km, 1254 m gain) &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-08-31 &lt;a href="http://ridewithgps.com/trips/1728252"&gt;Orinda via Upper Happy Valley&lt;/a&gt; rode
with Dan, his first time up Papa Bear.
(52.5 km, 1239 m gain) &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-08-24 &lt;a href="http://ridewithgps.com/trips/1696982"&gt;Orinda and back&lt;/a&gt; - had an iced
green atomic sludge thing from Peet's in Orinda.
(47.4 km, 966 m gain) &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-08-20 &lt;a href="http://ridewithgps.com/trips/1697022"&gt;Grizzly Peak&lt;/a&gt; I was running
late this morning, Dan waited patiently for me at Bica again, and then we went
up to Grizzly Peak and split off our separate ways.
(37.2 km, 702 m gain) &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-08-19 &lt;a href="http://ridewithgps.com/trips/1697010"&gt;To Bica and Back&lt;/a&gt; This
&lt;a href="http://bicacoffeehouse.com/"&gt;hipster cafe&lt;/a&gt; was giving away free coffee on
account of their third anniversary, so I met up there with Dan, had a good
conversation catching up, and then headed home.
(17.4 km, 86 m gain) &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-08-17 &lt;a href="http://ridewithgps.com/trips/1655053"&gt;Pinehurst - MacArthur&lt;/a&gt; Got to
do some exploring around upper Rockridge while waiting for Jon, and then we did
the Pinehurst - Redwood ride together.
(64.4 km, 1171 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-08-14 &lt;a href="http://ridewithgps.com/trips/1636482"&gt;Grizzly Peak&lt;/a&gt; morning ride with Sara. Bumped into &lt;a href="http://penandpants.com/"&gt;Matt
Davis&lt;/a&gt; during our pre-ride coffee at Actual Cafe (he
just moved to the neighborhood) 
(32.5 km, 722 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-08-11 &lt;a href="http://ridewithgps.com/trips/1620142"&gt;A ride to Concord&lt;/a&gt;  where I
met up and chatted with my old friend Janet. We chatted for a few hours, and I
did not have enough time left to ride all the way home, so I took BART from
Concord to Rockridge, and &lt;a href="http://ridewithgps.com/trips/1620155"&gt;took a ride home from Rockridge
BART&lt;/a&gt;.
(56 km, 1182 m gain) &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-08-01 &lt;a href="http://ridewithgps.com/trips/1555932"&gt;Pinehurst - Reliez - Spruce&lt;/a&gt;
Finally went on a good long ride.  Bonked and took a 10 minute nap in the sun at
Wagner Ranch elementary before heading up Wildcat Canyon.
(96.6 km, 2048 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-07-22 Tunnel - Claremont loop
Another morning ride with Sara.
(27 km, 583 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-07-21 &lt;a href="http://ridewithgps.com/trips/1555947"&gt;A ride to Jon and Sarah's new
place!&lt;/a&gt; I dropped off some freshly made
preserves from strawberries we had picked from &lt;a href="http://www.eatwell.com"&gt;our
farm&lt;/a&gt; the day before. Redwood is pretty steep over
there.
(50 km, 809 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-07-13 &lt;a href="http://ridewithgps.com/trips/1493371"&gt;Tunnel - Claremont loop&lt;/a&gt; First
ride with &lt;a href="http://ourenvironment.berkeley.edu/people_profiles/sara-e-emery/"&gt;Sara
Emery&lt;/a&gt;!
Neither of us had ridden in a few weeks due to travel and being
sick, so we took it easy. Actual Cafe apparently only opens at 8am on the
weekend, so we doped at Cole Coffee in Rockridge.
(35 km, 591 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-07-03 &lt;a href="http://ridewithgps.com/trips/1463169"&gt;Marin - Tunnel Rd loop&lt;/a&gt; - first ride in over a week due to
extensive conferencing and travel. Met David, who has a cool rig with an
aerodynamic bubble out front, vertical steering, and an electric regenerative
assist.
(33.7 km, 765 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-06-22 &lt;a href="http://ridewithgps.com/trips/1463163/"&gt;The Populaire (SF
Randoneurs)&lt;/a&gt; my first randoneuring event!
(116.3 km, 1637 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-06-18 &lt;a href="http://ridewithgps.com/trips/1422565"&gt;Mt Diablo (half-way)&lt;/a&gt; - My
first metric century. Ran out of time and decided to not try for the summit this
time. Good thing I didn't,  it was dark by the time I made it back to Tilden.
Took a new basket I got at a big box for $15 in preparation for the Populaire on
Saturday - but made the mistake of carrying my U-lock and empty metal sandwich
container - tons of rattling the whole time, except for the slow ascents. Mt
Diablo's south side road is freshly paved and the views are breathtaking. 
(115.5 km, 1825 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-06-14 &lt;a href="http://ridewithgps.com/trips/1407559"&gt;Broadway-Centennial&lt;/a&gt; Another
morning ride with Dan, another double espresso cubano doping dosage at Actual
(pre-ride). Dan found some rope for his boat as we approached campus.
(32 km, 671 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-06-13 Spin class with Randy. Climbed some hills, had several streaks around
300 watts and higher, which seemed impossibly high a couple of months ago. Randy
told me that the North side of Mt Diablo is steeper, but he prefers it -
South side is nicely paved and better for descents.
(22 km, 35 minutes)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-06-13 &lt;a href="http://ridewithgps.com/trips/1406320"&gt;Broadway Terrace - Grizzly
Peak&lt;/a&gt; - First time going up Broadway Ter -
it's steeper than Tunnel Rd, and my left calf was very unhappy about that. Also,
I Wish I had a higher gear for downhills - another cyclist in a red jersey that
I passed during the climb caught up with me on the descent from Grizzly Peak,
but pedaling at those speeds and my gearing is useless. We chatted briefly after
Centennial, and he was impressed that I wasn't wearing cleats - strapless
toe-clips for the win!
(24.5 km, 638 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-06-11 &lt;a href="http://ridewithgps.com/trips/1400451"&gt;Tunnel Rd Only&lt;/a&gt; Road again
with &lt;a href="http://www.ocf.berkeley.edu/~dcoates/"&gt;Dan Coates&lt;/a&gt; this morning. We had
pre-ride espressos at Actual, and post-ride pastries with coffee at Nabolom,
with thick fog sandwiched in between.
(36 km, 637 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-06-09 &lt;a href="http://ridewithgps.com/trips/1396314"&gt;Happy-Reliez&lt;/a&gt; Overcast and a
bit chilly. New slightly thicker jersey and long sleeved shirt kept me
adequately warm. In good spirits, was told I'm "going way too fast" as I passed
a cyclist going up Happy Valley road. :)
(77.5 km, 2062 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-06-04 &lt;a href="http://ridewithgps.com/trips/1380920"&gt;Centennial-Happy-Lamorinda&lt;/a&gt;
Succeeded in doing a standing climb all the way up Happy Valley Rd.
(64.5 km, 1604 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-06-01 &lt;a href="http://ridewithgps.com/trips/1371198"&gt;Mt Diablo Prelude&lt;/a&gt; I flirted
with Mt Diablo, but got a flat and was stranded in Danville until the cavalry
came and picked me up.
(50.5 km, 1216 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-31 &lt;a href="http://ridewithgps.com/trips/1367726"&gt;Wildcat Only&lt;/a&gt; it was really
hot on the other side of the hill.
(35.5 km,  665 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-30 &lt;a href="http://ridewithgps.com/trips/1366752"&gt;Morning Claremont Loop&lt;/a&gt; - &lt;a href="http://www.ocf.berkeley.edu/~dcoates/"&gt;Dan
Coates&lt;/a&gt; joined me for a ride. I was
doping (Espresso Cubano at Actual Cafe), but carried my bag the whole way, as a
handicap.
(27 km, 583 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-28 Spin Class at RSF: speed (30-30 sprints and standing endurance). We
got a bonus 15 minutes at the end.
(29 km, 60 minutes)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-28 &lt;a href="http://ridewithgps.com/trips/1359257"&gt;Redwood-Pinehurst-Tunnel&lt;/a&gt; -
glad to see dozens of cyclists going up Tunnel Road in pairs as I was coming
down.  (50 km, 1099 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-26 &lt;a href="http://ridewithgps.com/trips/1353456"&gt;South Park-Papa-Happy-Reliez-Bear
Creek-Happy-Orinda-Wildcat&lt;/a&gt; Had an extra
hour today, made good use of it with some extra climbing. Went through the
blocked off section of El Toyonal - lots of horses, and also a terrible road,
wouldn't recommend it.
(90 km, 2276 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-25 &lt;a href="http://ridewithgps.com/trips/1350417"&gt;Wildcat-Papa Bear-Happy
Valley-Lamorinda&lt;/a&gt; - First time taking
Happy Valley Rd - rough on the ascent, but buttery smooth on the way down.
Stopped for sugary coffee in Orinda.  I like ridewithgps's interface a lot
better, and the elevation gain it recorded was 1.5 km, a full 500m later than
MapMyRide - because MMR smooths things over more. I like the interface better
(you can zoom in on portion of a ride quicker), so I think I'm going to stick
with RWGPS from now on.
(72 km, 1550 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-23 &lt;a href="http://www.mapmyride.com/routes/view/213844993"&gt;Tunnel-Claremont&lt;/a&gt;
Right leg kind of bumming - but surprised at how much strength my legs had at
the top of Grizzly Peak - stayed in high gear all along even that last hill.
(23 km, 405 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-21 &lt;a href="http://www.mapmyride.com/routes/view/212715051"&gt;Inspiration Point-Wildcat Roundtrip-Grizzly
Peak&lt;/a&gt; - South Park Drive still
kicks my butt, so I'll have to do it more often.
(37 km, 690 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-17 - Spin class at RSF, got there 10 minutes late, but hey, every ride
counts!
(16 km, 35 minutes)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-17 - &lt;a href="http://www.mapmyride.com/routes/view/210567881"&gt;Tunnel Rd-Claremont-Tunnel Rd-Grizzly
Peak&lt;/a&gt;
Tunnel Rd uphill is so nice, today I rode it twice! On the second go around, on
the rolling part of Grizzly Peak Blvd, I hit the Bohemian Rhapsody solo - and
left a cycling team in the dust!
(48 km, 893 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-16 - &lt;a href="http://www.mapmyride.com/routes/view/210104979"&gt;Redwood-St Mary's-Reliez Valley-Three Bears-Grizzly
Peak&lt;/a&gt;
(93.5km, 1451 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-14 - &lt;a href="http://www.mapmyride.com/routes/view/208532541"&gt;Tunnel-Pinehurst-Redwood-Tunnel&lt;/a&gt;
A good ride, solid two hours.  Watched a raptor taking off right in front of me
while cycling up Redwood, beautiful bird.
(49.5 km, 822 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-11 - &lt;a href="http://www.mapmyride.com/routes/view/207071925"&gt;Three bears - Papa first&lt;/a&gt;
Helped one guy find his cycling computer. Saw a wild turkey with a bunch of
chicks. Was way to windy on San Pablo Dam Rd as I approached 80, and all along
80. I wouldn't like cycling in the pacific northwest - apparently it's always
windy there.
(53.5 km, 589 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-10 - &lt;a href="http://www.mapmyride.com/routes/view/206406505"&gt;Claremont-Tunnel
Rd&lt;/a&gt;. Morning ride - thick fog
along Grizzly Peak Blvd and Skyline. Bumped into and chatted with &lt;a href="http://www.mckusick.com/"&gt;Kirk
McKusick&lt;/a&gt; while enjoying my cup of coffee after the
ride.&lt;br&gt;
(26.5 km, 443 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-08 - &lt;a href="http://www.mapmyride.com/routes/view/205657052"&gt;Centennial-Grizzly Peak-Tunnel
Rd&lt;/a&gt; 
Was told "hey bro, call it out!" when I passed another cyclist on Grizzly Peak,
which I'm ok with, but he kept yelling something long after I was out of hearing
range.  My first time going &lt;em&gt;down&lt;/em&gt; Tunnel Rd. 
(22.5 km, 441 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-06 - &lt;a href="http://www.mapmyride.com/routes/view/205903430"&gt;Page Mill-Altamont Loop, from
Stanford&lt;/a&gt;. After the first day
of Software Carpentry at Stanford, I spent an hour in front of the Thai
restaurant where Bernard, &lt;a href="http://arokem.org/"&gt;Ariel&lt;/a&gt;, and I had dinner trying
to get my bike lock unlocked. &lt;a href="http://sirl.stanford.edu/~bob/"&gt;Bob&lt;/a&gt; suggested I
put WD-40 in the lock, and it worked to revive it!
(22.5 km, 214 m gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-05 - &lt;a href="http://www.mapmyride.com/routes/view/203798518"&gt;Page Mill-Altamont Loop&lt;/a&gt;
Saw three deer on Page Mill. Remarkable how easy this was compared to what a
Page Mill ride was like a decade ago for me.
(14.4 miles, 702 ft gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-03 - &lt;a href="http://www.mapmyride.com/routes/view/203639168"&gt;Centennial-Grizzly
Peak-Claremont&lt;/a&gt; Short ride. Didn't
have much time, just enough for a small climb. But every ride counts.
(9.4 miles, 1398 ft gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-05-01 - &lt;a href="http://www.mapmyride.com/routes/view/201723738"&gt;Redwood-Pinehurst&lt;/a&gt;, again.
Concentrated on cadence. A fellow cyclist I passed on the Tunnel Road climb
stayed not too far behind the whole way up, and caught up near the top. I told
him "Thanks for keeping me honest", to which he replied "It was the other way
around". He took a left onto Grizzly, as I continued down Skyline. Briefly
stopped at the Canyon post office at 4:30pm, as they were closing up. Will have
to send postcards from there, sometime.
(31 miles, 2772 ft gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-04-30 -
&lt;a href="http://www.mapmyride.com/routes/view/201723738"&gt;Redwood-Pinehurst&lt;/a&gt; Pushed
through in higher gears as much as possible, strength training. Took a slightly
different route to get to the hills, taking College all the way to Broadway.
(31 miles, 2772 ft gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-04-28 -  &lt;a href="http://www.mapmyride.com/routes/view/199917630"&gt;Wildcat-Three
Bears-Wildcat&lt;/a&gt;
My first time riding Three Bears! I was not super fond of the beginning of the
Three Bears route (Alhambra Valley Rd) - it's quite choppy and not as nicely
paved as most other places I'm used to riding, but having the road talk to you
is quite encouraging and novel, to me. Examples of signage in the asphalt:
"Momma" at the beginning of the first big hill, or "feeding zone", or "almost"
within the last 100 yards of the "Papa Bear" hill.
(38.5 miles, 3051 ft gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-04-27 - &lt;a href="http://www.mapmyride.com/routes/view/199358350"&gt;Wildcat-Orinda-Moraga-Pinehurst-Grizzly Peak, with a Rosie
finish&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Fueled by two cups of coffee (one from Nabolom, one from Local-123), and
pastries from Nabolom, Crixa Cakes, and Starter Bakery - I decided to binge on
the pain, as well. I particularly loved slicing through Camino Pablo and Moraga
Way in high gear. Made it almost all the way up Pinehurst in second lowest gear
- only had to switch to the lowest for the last 100 yards, or so.  The finish
was anything but rosy - a very strong wind from the bay made me wish I had a
sail with me.
(44 miles, 2782 ft gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-04-24 - &lt;a href="[http://www.mapmyride.com/us/berkeley-ca/vision-science-ride-route-160608138"&gt;Grizzly Peak
loop&lt;/a&gt;,
same as a week ago, had to wade through the thick low-lying clouds all along
the ridge - near zero visibility up there this time. Bumped into Brandon at the
gym afterwards. Turns out the VS ride I missed  yesterday was just him and
Zack, and they went up Spruce and came down Centennial.
(15 miles, 1575 ft gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-04-23 - &lt;a href="http://www.mapmyride.com/routes/view/197647740"&gt;Claremont Only&lt;/a&gt;.
Missed the Vision Science ride, and had to get back quickly, so only had time
for a very short (but fairly intense climb) ride. Claremont has too much
automotive activity this time of day (4-5pm).
(6.25 miles, 974 ft gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-04-21 - &lt;a href="http://www.mapmyride.com/us/albany-ca/bay-trail-lake-anza-route-161648156"&gt;Rosie the Riveter to Lake
Anza&lt;/a&gt;.
Amazing how a bar I ate along the way made me not even tired at the end of the
ride. The last hill (Canon Drive) was easier than it had been all winter long.
Snacks FTW!&lt;/p&gt;
&lt;p&gt;Wore boardshorts today, and amazing how many fewer nods I got from fellow
cyclists - it's like they don't recognize their own if I don't look the part.
It's the cadence, not the clothes that make a cyclist.
(20 miles, 1119 ft gain) &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-04-19 - Longer ride:
&lt;a href="http://www.mapmyride.com/routes/view/196205476"&gt;Redwood-Pinehurst&lt;/a&gt;, ran out of
steam (completely bonked) at the bottom of the last hill on Pinehurst to get
back to the ridge, and had to just slowly waddle my Resolved to never go on
rides longer than 15 miles without a snack.
(30 miles, 2680 ft gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2013-04-17 - Rode the &lt;a href="[http://www.mapmyride.com/us/berkeley-ca/vision-science-ride-route-160608138"&gt;Grizzly Peak
loop&lt;/a&gt;,
from campus to Broadway and then up. Dan Coates would have joined, but had a
flat, and turns out the glue in his patch kit was all dry. Brandon Lujan also
stopped by, on his bike, wondering why no one responded to his Bay-to-Breakers
thread on vs-social. I watched the sun set behind Mount Tam as I rode along the
Grizzly Peak ridge, and got back to the gym just at twilight.&lt;br&gt;
(15 miles, 1575 ft gain)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a id="about"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="why-keep-a-log"&gt;Why keep a log?&lt;/h1&gt;
&lt;p&gt;This is a log that's inspired by the &lt;a href="http://davisskate.tripod.com/SkateLog.html"&gt;Davis Wednesday Night Skate
Log&lt;/a&gt;. I'm in
there somewhere at least a couple of times (01/21/04, 09/29/04) and my brother
Mike even more frequently. Another point of inspiration is Ned "Bike Nomad"
Konz's &lt;a href="http://bike-nomad.com/1999trip.html"&gt;trip logs&lt;/a&gt; and Steven Roberts'
&lt;a href="http://microship.com/bike/winnebiko2/maggie.html"&gt;"Miles with Maggie"&lt;/a&gt; portion
of his &lt;a href="http://microship.com/bike/"&gt;bicycle adventures&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;About a month after I started keeping this log, I came across yet another
example of why I like keeping logs (and reading them) - this one is from Rob,
the owner of Blue Heron Bikes in Berkeley. Read &lt;a href="http://blueheronbikesberkeley.com/?p=75"&gt;Rob's October Bike
Vacation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I don't keep track of every single time I get on a bicycle - that would be too
tedious, since I have a 6 mile round-trip home-campus commute every day.  These
are just rides I do for fun and exercise.  I get no sense of accomplishment
keeping track of rides where I'm riding in a manner as to minimize my sweatiness
during my trips to and from campus.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Here's some ASCII art I made that I now use as my email signature:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;                   _
                  / \
                A*   \^   -
             ,./   _.`\\ / \
            / ,--.S    \/   \
           /  `&amp;quot;~,_     \    \
     __o           ?
   _ \&amp;lt;,_         /:\
--(_)/-(_)----.../ | \
--------------.......J
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="cycling"></category><category term="cycling"></category></entry><entry><title>remembering John Hunter (1968-2012)</title><link href="//pirsquared.org/blog/jdh.html" rel="alternate"></link><published>2012-09-03T14:51:53-07:00</published><updated>2012-09-03T14:51:53-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2012-09-03:/blog/jdh.html</id><content type="html">&lt;p&gt;John Hunter, the author of &lt;a href="http://matplotlib.sourceforge.net/"&gt;matplotlib&lt;/a&gt;, &lt;a href="http://mail.scipy.org/pipermail/ipython-dev/2012-August/010135.html"&gt;passed away on August 28th, 2012&lt;/a&gt;. He will be dearly missed.&lt;/p&gt;
&lt;p&gt;Please donate to the &lt;a href="http://numfocus.org/johnhunter/"&gt;John Hunter Memorial Fund&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;what follows are excerpts from my paper journal over the past week:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;John Hunter passed away this morning,
Oh my god. John Hunter was incredibly
kind and warm -- I can&amp;#39;t believe he bought
me this laptop. I can&amp;#39;t believe that such
a wonderful man could be dead -- so suddenly.

    What a tremendous loss.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;I keep pacing around the house.
I just need to leave.
    calmly.
My thoughts are with John&amp;#39;s
family. &amp;amp; with the folks in Louisiana.

    A rat in a maze --
panicked -- &amp;amp; the water
level rises still. escalates.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    Our loss of John makes me
want to code furiously.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;I feel the urge to code furiously,
but only have the capacity to tweet about
it, and lack thereof to censor myself.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;I don&amp;#39;t believe I&amp;#39;m losing
my mind. I believe I never had
one to begin with.
  I&amp;#39;m not losing my mind. I never
  had one to begin with.
  I&amp;#39;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, &amp;amp; then go to try &amp;amp;
talk w/ Greg Wilson.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;I must be mistaken. Maybe I was.
Who&amp;#39;s to say that I wasn&amp;#39;t.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;The scientific python community lost one
of it&amp;#39;s giants this week, and
I lost an important mentor.

Remembering John Hunter (JDH)

    People keep dying. I don&amp;#39;t know
how to deal with that -- I feel like
I never really processed dedushka&amp;#39;s death --
nor Ken Green&amp;#39;s, nor Jessi Debaca&amp;#39;s,
nor babushka&amp;#39;s

... I lost another mentor. Most of
these people (all?) don&amp;#39;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 &amp;quot;dwoof&amp;quot; - did I get
that right, David?) is more than
capable as a command-line
cowboy (David doesn&amp;#39;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&amp;#39;s also a role model in other ways --
he&amp;#39;s very calm and collected (unless
he senses you&amp;#39;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 &amp;amp; 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 --
&amp;amp; how to do it. He&amp;#39;s warm -- and always
had this kind smile about him.

    After hanging out with John at PyData --
this email arrived in my inbox
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="_1"&gt;&lt;img alt="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" src="//pirsquared.org/images/jdh-laptop.png"&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Fernnado knew about the email -- &amp;amp; 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 -- &amp;quot;Have
you checked your email?&amp;quot; -- with a
twinkle in his eye &amp;quot;Let&amp;#39;s go have you
check your email right now&amp;quot; -- &amp;amp; he
walked over to turn on his desktop machine.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    On the mailing lists -- I always tried to
emulate John&amp;#39;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, &amp;amp; keep
remembering John -- for many, many,
many years to come.

I feel the urge to reach
out to everyone I know &amp;amp; don&amp;#39;t know.
I&amp;#39;m desperate -- i think I&amp;#39;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.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;I am posting this, but it isn&amp;#39;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&amp;#39;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.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;videos of John Hunter's talks:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=e3lTby5RI54"&gt;matplotlib: Lessons from middle age. (Scipy
2012)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=DNRJwENqEUY"&gt;Advanced Matplotlib Tutorial
(PyData)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://archive.org/details/scipy09_advancedTutorialDay1_3"&gt;SciPy 2009 - Advanced tutorial 3: Advanced topics in
matplotlib&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://archive.org/details/scipy09_day1_18-Lightning_talks_9-13"&gt;(beginning)
SampleDoc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://archive.org/details/scipy09_day2_09-Panel_visualization_tools"&gt;Scipy '09 Panel on Visualization
tools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://archive.org/details/scipy09_day1_02-Core_projects"&gt;Scipy '02 Core Projects
update&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://videolectures.net/mloss08_hunter_mat"&gt;NIPS Workshop on Machine Learning Open Source Software
(MLOSS)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Vs3FiyXyD14"&gt;Fernando Perez and John Hunter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blip.tv/carlfk/matplotlib-the-popular-2d-plotting-library-2577381"&gt;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."&lt;/a&gt;&lt;/p&gt;</content><category term="technology"></category><category term="journal excerpt"></category><category term="python"></category><category term="people"></category></entry><entry><title>pheriday 2: termcasting overview</title><link href="//pirsquared.org/blog/pheriday-termcasting.html" rel="alternate"></link><published>2012-08-05T01:12:33-07:00</published><updated>2012-08-05T01:12:33-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2012-08-05:/blog/pheriday-termcasting.html</id><content type="html">&lt;iframe src="//player.vimeo.com/video/46955561" width="800" height="450" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="//vimeo.com/46955561"&gt;pheriday 2: termcasting overview (2012-08-03)&lt;/a&gt; from &lt;a href="//vimeo.com/pivanov"&gt;Paul Ivanov&lt;/a&gt; on &lt;a href="//vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;paul's habitual errant ramblings (on Fr)idays (2012-08-03)  &lt;/p&gt;
&lt;p&gt;show notes:&lt;br&gt;
http://pirsquared.org/blog/2012/08/04/termcasting/&lt;br&gt;
gopher://sdf.org/1/users/ivanov/pheridays/2012-08-03 (yes, gopher!)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;try to not say "uuuuhhhhmmnn"&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;BAM/PFA Summer Cinema on Center Street
http://bampfa.berkeley.edu/filmseries/summercinema&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;SciPy 2012 videos up, go check them out! (I have!)
http://www.youtube.com/nextdayvideo
(removed nextdayvideo internal box url, by request)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Software Carpentry: Record and Playback post
http://software-carpentry.org/2012/07/record-and-playback/&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;termcasting: a review of what's out there.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;h4 id="playterm-vs-asciiio-vs-shelrtv"&gt;(playterm vs ascii.io vs shelr.tv)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;tldr&lt;/strong&gt;: 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)&lt;/p&gt;
&lt;p&gt;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)&lt;/p&gt;
&lt;p&gt;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&lt;/p&gt;
&lt;p&gt;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&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;my wanted list for termcasting&lt;/li&gt;
&lt;li&gt;should support ttyrec files (upload and download)&lt;/li&gt;
&lt;li&gt;live-streaming (like ustream - but for coding)&lt;/li&gt;
&lt;li&gt;termcast.org has ttrtail which does just this&lt;/li&gt;
&lt;li&gt;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&lt;/li&gt;
&lt;li&gt;a .tty editor that's like a video editor cut out portions [i.e. dead time]&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;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! "&lt;code&gt;ttyrec -e screen
-x&lt;/code&gt;".  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.&lt;/p&gt;
&lt;p&gt;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/&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;tools used:
Debian GNU/Linux sid, recordmydesktop, xmonad, fbpanel, screen, chromium, cheese, xcompmgr, audacity, avconv&lt;/p&gt;</content><category term="technology"></category><category term="python"></category><category term="pheriday"></category><category term="science"></category></entry><entry><title>pheriday 1: software carpentry, digital artifacts, visiting other OSes</title><link href="//pirsquared.org/blog/pheriday-software-carpentry.html" rel="alternate"></link><published>2012-07-27T23:26:43-07:00</published><updated>2012-07-27T23:26:43-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2012-07-27:/blog/pheriday-software-carpentry.html</id><content type="html">&lt;p&gt;Here's pheriday 1, another edition of
&lt;strong&gt;p&lt;/strong&gt;aul's &lt;strong&gt;h&lt;/strong&gt;abitual &lt;strong&gt;e&lt;/strong&gt;rrant &lt;strong&gt;r&lt;/strong&gt;amblings (on Fr)&lt;strong&gt;idays&lt;/strong&gt;&lt;/p&gt;
&lt;iframe src="//player.vimeo.com/video/46528772" frameborder="0" width="800" height="450"&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="//vimeo.com/46528772"&gt;pheriday 1: software carpentry, digital artifacts, visiting other OSes (2012-07-27)&lt;/a&gt; from &lt;a href="//vimeo.com/pivanov"&gt;Paul Ivanov&lt;/a&gt; on &lt;a href="//vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="//pirsquared.org/pheridays/2012-07-27.mp4"&gt;2012-07-27.mp4 (28 MB)&lt;/a&gt;
&lt;a href="//pirsquared.org/pheridays/2012-07-27.avi"&gt;2012-07-27.avi (71 MB)&lt;/a&gt;
&lt;a href="//pirsquared.org/pheridays/2012-07-27.ogv"&gt;2012-07-27.ogv (321 MB)&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="show-notes"&gt;show notes&lt;/h1&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;SDF Public Access UNIX System
&lt;a href="http://sdf.org"&gt;http://sdf.org&lt;/a&gt;
&lt;a href="gopher://sdf.org/1"&gt;gopher://sdf.org/1&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;try to not say "uuuuhhhhmmnn"&lt;/li&gt;
&lt;li&gt;be lazy (software carpentry)&lt;/li&gt;
&lt;li&gt;flipside of "publisher's block" (git-annex)&lt;/li&gt;
&lt;li&gt;visiting another country (windows 8 release preview)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;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: 
&lt;a href="//software-carpentry.org/"&gt;Software Carpentry&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="//software-carpentry.org/about/ninety-second-pitch/"&gt;If you have 90 seconds, watch the pitch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;play it in 60 seconds, instead:
&lt;code&gt;mplayer -af scaletempo -speed 1.5 Software_Carpentry_in_90_Seconds-AHt3mgViyCs.flv&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="//pirsquared.org/blog/2009/12/26/publishers-block/"&gt;publisher's block&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="//www.goodreads.com/book/show/6683549-you-are-not-a-gadget"&gt;Jaron Lanier's &lt;em&gt;You Are Not A Gadget&lt;/em&gt;&lt;/a&gt;
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.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.everythingismiscellaneous.com/"&gt;David Weinberger’s &lt;em&gt;Everything is Miscellaneous&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="//pirsquared.org/blog/2007/07/31/information/"&gt;My review&lt;/a&gt; of
David Weinberger’s Everything is Miscellaneous, where I go into more depth
about "information overload".&lt;/p&gt;
&lt;p&gt;&lt;a href="http://git-annex.branchable.com/"&gt;git-annex&lt;/a&gt;
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!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.haiku-os.org/"&gt;Haiku OS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;tools used:
Debian GNU/Linux sid, recordmydesktop, xmonad, fbpanel, screen,
iceweasel, cheese, xcompmgr, youtube-dl, mplayer, screen&lt;/p&gt;
&lt;p&gt;&lt;a href="gopher://sdf.org/1/users/ivanov/pheridays/2012-07-27"&gt;gopher version of this post&lt;/a&gt; (&lt;a href="http://gopher.floodgap.com/gopher/gw?a=gopher%3A%2F%2Fsdf.org%2F1%2Fusers%2Fivanov%2Fpheridays%2F2012-07-27"&gt;proxy&lt;/a&gt;)&lt;/p&gt;</content><category term="technology"></category><category term="gopher"></category><category term="python"></category><category term="science"></category><category term="pheriday"></category></entry><entry><title>pheriday 0: scientist-hacker howto (video post)</title><link href="//pirsquared.org/blog/pheriday-scientist-hacker.html" rel="alternate"></link><published>2012-07-20T23:55:41-07:00</published><updated>2012-07-20T23:55:41-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2012-07-20:/blog/pheriday-scientist-hacker.html</id><content type="html">&lt;p&gt;Hey everyone, here's pheriday 0, the first of 
&lt;strong&gt;p&lt;/strong&gt;aul's &lt;strong&gt;h&lt;/strong&gt;abitual &lt;strong&gt;e&lt;/strong&gt;rrant &lt;strong&gt;r&lt;/strong&gt;amblings (on Fr)&lt;strong&gt;idays&lt;/strong&gt;&lt;/p&gt;
&lt;iframe src="http://player.vimeo.com/video/46123218" frameborder="0" width="800" height="450"&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="http://vimeo.com/46123218"&gt;pheriday 0: scientist-hacker howto (2012-07-20)&lt;/a&gt; from &lt;a href="http://vimeo.com/pivanov"&gt;Paul Ivanov&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://510families.com/berkeley-kite-festiva/"&gt;Berkeley Kite Festival (510 Families)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://vimeo.com/channels/mostdays"&gt;Merlin Mann's Most Days &lt;/a&gt;(specifically the &lt;a href="http://vimeo.com/channels/mostdays/2792722"&gt;travel day one on 2009-01-11&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Sad that I missed &lt;a href="http://conference.scipy.org/scipy2012/"&gt;SciPy Conference this year&lt;/a&gt;. One of the things I like doing at scipy is nerding it up with my friends, seeing each others workflows, showing off vim tricks, etc. This video was my attempt at scratching that itch, a little bit. As I mention in the video, this is take 2. Take 1 ended when I ran out disk space, but needless to say, it was more awesome than this. It seems I am cursed with losing first takes, see also a &lt;a href="inscight.org/2011/07/23/episode-18-scipy-2011-recap"&gt;summary of last year's SciPy conference,&lt;/a&gt; where this exact same thing happened.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://numfocus.org"&gt;NumFOCUS: NumPy Foundation for Open Code for Usable Science&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://groups.google.com/group/numfocus/about"&gt;NumFOCUS Google Group&lt;/a&gt;
see thread titled: "[Funding] Notes from Funding BOF at SciPy2012"&lt;/p&gt;
&lt;p&gt;&lt;a href="http://tldp.org/index.html"&gt;TLDP: The Linux Documentation Project&lt;/a&gt; &lt;a href="http://tldp.org/sorted_howtos_full.html"&gt;(page I was scrolling through)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Transition to Gopher was rough this time, it was better during the first take.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lorance.freeshell.org/w3m/"&gt;Lorance Stinson's w3m (better) gopher support&lt;/a&gt;
Use this if, for example, going to &lt;code&gt;w3m gopher://sdf.org&lt;/code&gt; you get errors like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[unsupported] &amp;#39;/1&amp;#39; doesn&amp;#39;t exist! [unsupported] This resource cannot be located.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It still took some tweaking, shoot me an email for details&lt;/p&gt;
&lt;p&gt;&lt;a href="http://gopher.floodgap.com/gopher/gw?gopher://sdf.org/0/users/rbigelo/gopher.txt"&gt;Robert Bigelow's About | Gopher &amp;amp; GopherSpace&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://gopher.floodgap.com/gopher/gw?gopher://sdf.org/0/users/rbigelo/gopher.txt"&gt;Here's the HTTP Proxied version of the above:&lt;/a&gt;
&lt;a href="http://gopher.floodgap.com/gopher/"&gt;Gopher proxy&lt;/a&gt; provided by Floodgap&lt;/p&gt;
&lt;p&gt;SDF Public Access UNIX System
&lt;a href="http://sdf.org"&gt;http://sdf.org&lt;/a&gt;
&lt;a href="gopher://sdf.org/1"&gt;gopher://sdf.org/1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Eric S. Raymond's &lt;a href="http://catb.org/~esr/faqs/hacker-howto.html"&gt;How To Become a Hacker Howto&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Fernando Perez' &lt;a href="http://fperez.org/py4science/starter_kit.html"&gt;Py4Science Starter Kit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Q: Why are you using "Chromium --incognito"?
I have chronic &lt;a href="http://urbandictionary.com/define.php?term=tabitis/"&gt;tabitis&lt;/a&gt;, and this is one way of mitigating that problem. If the
browser crashes or I shutdown my computer, I won't have those tabs around
anymore.&lt;/p&gt;
&lt;p&gt;programs used: Debian GNU/Linux sid, recordmydesktop, xmonad, fbpanel, screen, chromium, cheese, xcompmgr, mutt, wyrd, tail, w3m&lt;/p&gt;
&lt;p&gt;&lt;a href="gopher://sdf.org/1/users/ivanov/pheridays/2012-07-20"&gt;gopher version of this post&lt;/a&gt; (&lt;a href="http://gopher.floodgap.com/gopher/gw?a=gopher%3A%2F%2Fsdf.org%2F1%2Fusers%2Fivanov%2Fpheridays%2F2012-07-20"&gt;proxy&lt;/a&gt;)&lt;/p&gt;</content><category term="technology"></category><category term="gopher"></category><category term="hello-world"></category><category term="python"></category><category term="science"></category><category term="pheriday"></category></entry><entry><title>Ada Lovelace Day: remembering Shirley Theis and Evelyn Silvia</title><link href="//pirsquared.org/blog/ada-lovelace-day.html" rel="alternate"></link><published>2011-10-07T17:01:29-07:00</published><updated>2011-10-07T17:01:29-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2011-10-07:/blog/ada-lovelace-day.html</id><content type="html">&lt;p&gt;In case you didn't know it - today is &lt;a href="http://findingada.com/"&gt;Ada Lovelace Day!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now, as any self-respecting Computer Science degree-wielding person should, I, too, think it's important to celebrate the day named after the world's very first programmer.&lt;/p&gt;
&lt;p&gt;For me, the first math teacher I remember making a big difference was Shirley Theis - who taught me Algebra in 8th grade at McKinley Middle School in Redwood City, CA. Mrs Theis, an energetic dynamo in her mid fifties, was a deeply motivated and caring teacher, who expected a lot out of her students, but never in a disciplinary manner.  She was full of enthusiasm, which projected out and infected even the most timid or disaffected student: in her class, you couldn't be just a sack of potatoes planted in your seat. &lt;/p&gt;
&lt;p&gt;She often lead class in a nearly theatrical manner - pacing back and forth, egging students on by eagerly repeating their partial responses, getting exponentially more excited if the student was on the right track, barely containing herself from jumping up and down in anticipation of that lightbulb going off -- and yet just as quickly waning in her enthusiasm,becoming a personified caricature of hopelessness and despair to let you know the instant a response was starting to go astray.&lt;/p&gt;
&lt;p&gt;It may have been the only math class I've ever taken where there were group assignments - we would work with a partner or a few classmates in trying to figure out an assignment, first trying it solo, and then putting our heads together to figure out why our answers disagree and which is the right one. I believe it was Mrs. Theis who succinctly captured a value I hold in high regard: "it's not about how far you go - it's about how many people you bring with you."&lt;/p&gt;
&lt;p&gt;There was one other mathematics teacher I had in my life who clearly stands out: it was &lt;a href="http://www.math.ucdavis.edu/~emsilvia/"&gt;Professor Evelyn Silvia&lt;/a&gt; who had a comparable level of enthusiasm and energy, and from whom I had the pleasure of taking the first upper-division math course (Math 108 - Intro to Abstract Math) during my second quarter at UC Davis. Dr. Silvia was the real deal - she cared, gesticulated, encouraged us to question why something was true,  and had an approach which demanded we each take ownership of our education. The book for the course, &lt;em&gt;Introduction to Abstract Mathematics: A Working Excursion&lt;/em&gt; by D.O. Cutler and E.M. Silvia was a blue workbook - each of us had our own copy, and there were blanks left out for us to write our own answers to the exercises. The fact that the book had blanks for me to fill in was so inviting, there was a kind of "working mathematician" approach that came with it with that it made me really enjoy and look forward to working through the material. I still have mine.  &lt;/p&gt;
&lt;p&gt;Dr. Silvia was incredibly sharp, not just intellectually but also
interpersonally. Not only could she gauge when the class was lost, but she also
had a knack for spotting if something was affecting you outside of class. She
was really committed to helping you not just as a student, but as a person.  I
remember spending hours at Mishka's, or Cafe Roma, or the CoHo, reading and
writing, wanting to do well and not let Silvia down, because she invested so
much energy and placed a great deal of trust in us.  &lt;/p&gt;
&lt;p&gt;So thank you both, Shirley Theis and Evelyn Silvia - you both encouraged me to grow a lot as a person, challenged my concept of what it means to be a student, and by your example provided a template of what it means to be an effective teacher, which I've imitated and embraced with pleasure in my own teaching.&lt;/p&gt;
&lt;p&gt;(tagged scipy to spread word of Ada Lovelace day to Planet SciPy)&lt;/p&gt;</content><category term="technology"></category><category term="mathematics"></category><category term="python"></category><category term="teaching"></category><category term="people"></category></entry><entry><title>vim-ipython two-way integration! (updated: 2011-08-02)</title><link href="//pirsquared.org/blog/vim-ipython.html" rel="alternate"></link><published>2011-07-28T23:28:10-07:00</published><updated>2011-07-28T23:28:10-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2011-07-28:/blog/vim-ipython.html</id><content type="html">&lt;p&gt;I'm very pleased to share with you a demo the forthcoming vim-ipython integration which will work with IPython 0.11(trunk).&lt;/p&gt;
&lt;p&gt;You can either use the Flash player below, or &lt;a href="/vim-ipython/vim-ipython.ogv"&gt;download the OggVorbis file (14MB)&lt;/a&gt; &lt;strong&gt;update:&lt;/strong&gt; &lt;a href="/vim-ipython/vim-ipython-shell.ogv"&gt;vim-ipython 'shell' demo (9.6MB)&lt;/a&gt;. The blog-free form of this post is &lt;a href="//pirsquared.org/vim-ipython"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you like what you see and want to try it, you can get the details from the &lt;a href="//github.com/ivanov/vim-ipython"&gt;vim-ipython github page&lt;/a&gt; &lt;del&gt;and it currently requires 4 line changes to IPython, which are &lt;a href="https://github.com/ipython/ipython/pull/631"&gt;currently in this pull request&lt;/a&gt;.&lt;/del&gt; (Fixed to work on IPython trunk with no changes).&lt;/p&gt;
&lt;p&gt;Big thanks to &lt;a href="//twitter.com/minrk"&gt;Min&lt;/a&gt; for walking me through the new IPython kernel manager during the &lt;a href="//conference.scipy.org/scipy2011/"&gt;SciPy2011&lt;/a&gt; sprints.&lt;/p&gt;
&lt;div id="v82857"&gt;&lt;a href="//www.macromedia.com/go/getflashplayer"&gt;Get the Flash Player&lt;/a&gt;
to see this video, or &lt;a href="//pirsquared.org/vim-ipython/vim-ipython.ogv"&gt;download it in OggVorbis format&lt;/a&gt;&lt;/div&gt;
&lt;script type="text/javascript" src="https://media.dreamhost.com/mp4/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var swf = new SWFObject("https://media.dreamhost.com/mp4/player.swf", "mpl", "800", "619", 8);  swf.addParam("allowfullscreen", "true"); swf.addParam("allowscriptaccess", "always"); swf.addVariable("file", "//www.pirsquared.org/vim-ipython/vim-ipython_conv.flv"); swf.addVariable("image", "//www.pirsquared.org/vim-ipython/vim-ipython_conv.jpeg"); swf.write("v82857");
&lt;/script&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt;&lt;/em&gt; 2011-08-02&lt;/p&gt;
&lt;p&gt;vim-ipython ‘shell’ mode.&lt;/p&gt;
&lt;div id="v94640"&gt;&lt;a href="//www.macromedia.com/go/getflashplayer"&gt;Get the Flash Player&lt;/a&gt;
to see this video, or &lt;a href="//pirsquared.org/vim-ipython/vim-ipython-shell.ogv"&gt;download it in OggVorbis format&lt;/a&gt;&lt;/div&gt;
&lt;script type="text/javascript" src="https://media.dreamhost.com/mp4/swfobject.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var swf = new SWFObject("https://media.dreamhost.com/mp4/player.swf", "mpl", "800", "619", 8); swf.addParam("allowfullscreen", "true"); swf.addParam("allowscriptaccess", "always"); swf.addVariable("file", "//www.pirsquared.org/vim-ipython/vim-ipython-shell_conv.flv"); swf.addVariable("image", "//www.pirsquared.org/vim-ipython/vim-ipython-shell_conv.jpeg"); swf.write("v94640");
&lt;/script&gt;

&lt;p&gt;Just in case, here are the same videos as above, but hosted on Youtube:&lt;/p&gt;
&lt;iframe src="//www.youtube-nocookie.com/embed/ngNJyG5e8xY?rel=0" frameborder="0" width="425" height="349"&gt;&lt;/iframe&gt;
&lt;iframe src="//www.youtube-nocookie.com/embed/XON4josuRww?rel=0" frameborder="0" width="425" height="349"&gt;&lt;/iframe&gt;

&lt;p&gt;If you're have any issues, try searching for your error on the &lt;a href="//github.com/ivanov/vim-ipython/issues"&gt;vim-ipython github issues page&lt;/a&gt;, and if you don't find it, please file a new one, and I'll help you out there.&lt;/p&gt;</content><category term="technology"></category><category term="hello-world"></category><category term="python"></category><category term="vim"></category><category term="vim-ipython"></category></entry><entry><title>Money and CA Propositions</title><link href="//pirsquared.org/blog/ca-prop.html" rel="alternate"></link><published>2010-06-07T17:28:14-07:00</published><updated>2010-06-07T17:28:14-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2010-06-07:/blog/ca-prop.html</id><content type="html">&lt;p&gt;Since tomorrow we'll be having another one of those &lt;a href="//vote.sos.ca.gov/"&gt;practice democracy drills&lt;/a&gt; here in California, I thought I'd put together a few bar charts.&lt;/p&gt;
&lt;p&gt;There are five propositions on tomorrow's ballot. In researching them, Lena came across  the Cal-Access &lt;a href="//cal-access.sos.ca.gov/Campaign/Measures/"&gt;Campaign Finance Activity: Propositions &amp;amp; Ballot Measures&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Unfortunately, for each proposition, you have to click through each committee to get the details for the amount of money they've raised and spent. Here's a run-down in visual form, the only data manipulation I did was round to the nearest dollar. Note: no committees formed to support or oppose Proposition 13.&lt;/p&gt;
&lt;p&gt;Here's how much money was raised, by proposition:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Money
Raised" src="//pirsquared.org/images/CA-props/CA-Props-June8th2010-Contributions-Subplots.png" title="Money Raised for CA Propositions June 8th, 2010. Visualization by Paul Ivanov"&gt;&lt;/p&gt;
&lt;p&gt;Just in case you didn't get the full picture, here is the same data plotted on a common scale:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Money Raised (common
scale)" src="//pirsquared.org/images/CA-props/CA-Props-June8th2010-Contributions.png" title="Money Raised for CA Propositions June 8th, 2010, shown with a common scale. Visualization by Paul Ivanov"&gt;&lt;/p&gt;
&lt;p&gt;And the same two plots for money spent ((I don't fully understand what these numbers mean, as some groups' "Total Expenditures" exceed their "Total Contributions" and still had positive "Ending Cash")):&lt;/p&gt;
&lt;p&gt;&lt;img alt="Money Spent" src="//pirsquared.org/images/CA-props/CA-Props-June8th2010-Expenditures-Subplots.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Money Spent (common scale)" src="//pirsquared.org/images/CA-props/CA-Props-June8th2010-Expenditures.png"&gt;&lt;/p&gt;
&lt;p&gt;It could just be my perception of things, but I get pretty suspicious when there's a ton of money involved in politics, especially when it's this lopsided. &lt;/p&gt;
&lt;p&gt;The only thing I have to add is you should Vote "YES" on Prop 15, because &lt;a href="//www.youtube.com/watch?v=qZy13Hw3RvU"&gt;Larry Lessig says so,&lt;/a&gt; and so do the &lt;a href="//acgreens.wordpress.com"&gt;Alameda County Greens&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update #1:&lt;/em&gt; Let me write it out in text, so that the search engines have an easier time finding this. According to the official record from &lt;a href="//cal-access.sos.ca.gov/Campaign/Measures/"&gt;Cal-Access (Secretary of State)&lt;/a&gt;, as of May 22nd, 2010, there were $54.4 million spent in &lt;strong&gt;support&lt;/strong&gt; of various propositions, most notably $40.5 million on Prop 16, $8.9 million on Prop 17, and $4.6 million on Prop 14. Compare that with a "grand" total of less than $1.2 million spent to &lt;strong&gt;oppose&lt;/strong&gt; them, with a trivial $78 thousand (!!) to oppose Prop 16's $40.5 million deep pockets. &lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update #2:&lt;/em&gt; The California Voter Foundation included more recent totals (they don't seem to be that different), as well as a listing of the top 5 donors for each side of a proposition in their &lt;a href="//calvoter.org/voter/elections/2010/primary/props/index.html"&gt;Online Voter Guide&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Also, here's the python code used to generate these plots (enable javascript to get syntax highlighting):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Create contributions and expenditures bar charts of committees supporting and&lt;/span&gt;
&lt;span class="c1"&gt;# opposing various propositions on the California Ballot for June 8th, 2010&lt;/span&gt;
&lt;span class="c1"&gt;# created by Paul Ivanov (http://pirsquared.org)&lt;/span&gt;

&lt;span class="c1"&gt;# figure(0) - Contributions by Proposition (as subplots)&lt;/span&gt;
&lt;span class="c1"&gt;# figure(1) - Expenditures by Proposition (as subplots)&lt;/span&gt;
&lt;span class="c1"&gt;# figure(2) - Contributions on a common scale&lt;/span&gt;
&lt;span class="c1"&gt;# figure(3) - Expenditures on a common scale&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;matplotlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;locale&lt;/span&gt;

&lt;span class="c1"&gt;# This part was done by hand by collecting data from CalAccess:&lt;/span&gt;
&lt;span class="c1"&gt;# http://cal-access.sos.ca.gov/Campaign/Measures/&lt;/span&gt;
&lt;span class="n"&gt;prop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
     &lt;span class="mf"&gt;4650694.66&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;4623830.07&lt;/span&gt;    &lt;span class="c1"&gt;# Yes on 14 Contributions, Expenditures&lt;/span&gt;
    &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;216050&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;52796.71&lt;/span&gt;         &lt;span class="c1"&gt;# No  on 14 Contributions, Expenditures&lt;/span&gt;
    &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;118807.45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;264136.30&lt;/span&gt;     &lt;span class="c1"&gt;# Yes on 15 Contributions, Expenditures&lt;/span&gt;
    &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;200750.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;86822.79&lt;/span&gt;      &lt;span class="c1"&gt;# No  on 15 Contributions, Expenditures&lt;/span&gt;
    &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;40706258.17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;40582036.58&lt;/span&gt; &lt;span class="c1"&gt;# Yes on 16 Contributions, Expenditures&lt;/span&gt;
    &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;83187.29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;78063.91&lt;/span&gt;       &lt;span class="c1"&gt;# No  on 16 Contributions, Expenditures&lt;/span&gt;
    &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;10328675.12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;8932786.06&lt;/span&gt;  &lt;span class="c1"&gt;# Yes on 17 Contributions, Expenditures&lt;/span&gt;
    &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1229783.79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;965218.48&lt;/span&gt;    &lt;span class="c1"&gt;# No  on 17 Contributions, Expenditures&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;The two args are the value and tick position&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$0&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;1e3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;$&lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;1e6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;$&lt;/span&gt;&lt;span class="si"&gt;%1.0f&lt;/span&gt;&lt;span class="s1"&gt;K&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;1e-3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;$&lt;/span&gt;&lt;span class="si"&gt;%1.0f&lt;/span&gt;&lt;span class="s1"&gt;M&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;1e-6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.ticker&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FuncFormatter&lt;/span&gt;
&lt;span class="n"&gt;formatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FuncFormatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;yes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;blue&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# color for yes/no stance&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;             &lt;span class="c1"&gt;# alpha for yes/no stance&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Yes&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;No &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;       &lt;span class="c1"&gt;# text  for yes/no stance&lt;/span&gt;

&lt;span class="n"&gt;raised&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;spent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Raised for&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Spent on&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# reuse code by injecting title specifics&lt;/span&gt;
&lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Contributions&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Expenditures&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;footer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;Data from CalAccess: http://cal-access.sos.ca.gov/Campaign/Measures/&lt;/span&gt;
&lt;span class="s2"&gt;&amp;#39;Total &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; 1/1/2010-05/22/2010&amp;#39; field extracted for every committee&lt;/span&gt;
&lt;span class="s2"&gt;and summed by position (&amp;#39;Support&amp;#39; or &amp;#39;Oppose&amp;#39;).  No committees formed to&lt;/span&gt;
&lt;span class="s2"&gt;support or oppose Proposition 13. cc-by Paul Ivanov (http://pirsquared.org).&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="c1"&gt;# will inject field[col] in all plots&lt;/span&gt;

&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mf"&gt;.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.34&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;.9&lt;/span&gt; &lt;span class="c1"&gt;# spine/ticklabel color&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;savefig.dpi&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fixup_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot; Tufte-fy the axis labels - use different color than data&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;spines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# liberate the data! hide right and top spines&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_left&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# don&amp;#39;t tick on the right&lt;/span&gt;

    &lt;span class="c1"&gt;# there&amp;#39;s gotta be a better way to set all of these colors, but I don&amp;#39;t&lt;/span&gt;
    &lt;span class="c1"&gt;# know that way, I only know the hard way&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;spines&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_ticklines&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_ticklines&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_ticklabels&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_ticklabels&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;which&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;major&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;linestyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# for subplot spacing, I fiddle around using the f.subplot_tool(), then get&lt;/span&gt;
&lt;span class="c1"&gt;# this dict by doing something like:&lt;/span&gt;
&lt;span class="c1"&gt;#    f = plt.gcf()&lt;/span&gt;
&lt;span class="c1"&gt;#    adjust_dict= f.subplotpars.__dict__.copy()&lt;/span&gt;
&lt;span class="c1"&gt;#    del(adjust_dict[&amp;#39;validate&amp;#39;])&lt;/span&gt;
&lt;span class="c1"&gt;#    f.subplots_adjust(**adjust_dict)&lt;/span&gt;

&lt;span class="n"&gt;adjust_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bottom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.12129189716889031&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hspace&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.646815834767644&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;left&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.13732508948909858&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;right&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.92971038073543777&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;top&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.91082616179001742&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wspace&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.084337349397590383&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;raised&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="c1"&gt;#column to plot - money spent or money raised&lt;/span&gt;
    &lt;span class="c1"&gt;# subplots for each proposition (Fig 0 and Fig 1)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clf&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dpi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;    &lt;span class="c1"&gt;#prop number&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;stance&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;align&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grouping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lbl&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# drop the cents, since we&amp;#39;ve rounded&lt;/span&gt;
            &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ticks&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ticklabels&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Yes on &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;No on &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="c1"&gt;# put a big (but faded) &amp;quot;Proposition X&amp;quot; in the center of this subplot&lt;/span&gt;
        &lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;k&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transAxes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Proposition&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_major_formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# plugin our currency labeler&lt;/span&gt;
        &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_major_locator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_nbins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;# put fewer tickmarks/labels&lt;/span&gt;

        &lt;span class="n"&gt;fixup_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;adjust_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.13732508948909858&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.92971038073543777&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots_adjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;adjust_dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Figure title, subtitle&lt;/span&gt;
    &lt;span class="n"&gt;extra_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;serif&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;top&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transFigure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Money &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; CA Propositions&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;June 8th, 2010 Primary&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;#footer&lt;/span&gt;
    &lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bottom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;left&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;footer&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_figheight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;6.&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_figwidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3.6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CA-Props-June8th2010-&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;-Subplots.png&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="c1"&gt;# all props on one figure (Fig 2 and Fig 3)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clf&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;adjust_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.96&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots_adjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;adjust_dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_figheight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;6.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_figwidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;7.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;extra_args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;serif&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;top&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transFigure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Money &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; CA Propositions&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;.96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;June 8th, 2010 Primary&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;left&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bottom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;left&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adjust_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;left&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;footer&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;extra_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;stance&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;abscissa&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;.30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lbl&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# drop the cents, since we&amp;#39;ve rounded&lt;/span&gt;
        &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; Total&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;lbl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abscissa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;align&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lbl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
            &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;grouping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lbl&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# drop the cents, since we&amp;#39;ve rounded&lt;/span&gt;
            &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abscissa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;stance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;lbl&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xmin&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ticks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ticklabels&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Proposition &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
    &lt;span class="n"&gt;fixup_subplot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# plt.legend(prop=dict(family=&amp;#39;monospace&amp;#39;,size=9)) # this makes legend tied&lt;/span&gt;
    &lt;span class="c1"&gt;# to the subplot, tie it to the figure, instead&lt;/span&gt;
    &lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_legend_handles_labels&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figlegend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lower right&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;prop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;monospace&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_frame&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_visible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yaxis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_major_formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# plugin our currency labeler&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CA-Props-June8th2010-&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;.png&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="democracy"></category><category term="python"></category><category term="visualization"></category><category term="greens"></category><category term="money"></category><category term="election"></category></entry><entry><title>Immigration in the US, contextualized (with pictures)</title><link href="//pirsquared.org/blog/melting-pot.html" rel="alternate"></link><published>2010-05-29T03:07:19-07:00</published><updated>2010-05-29T03:07:19-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2010-05-29:/blog/melting-pot.html</id><summary type="html">&lt;p&gt;So I probably don't need to tell you this since you already know, but&lt;/p&gt;
&lt;h2 id="arizona-sucks"&gt;Arizona sucks!&lt;/h2&gt;
&lt;p&gt;It turns out that even documented immigrants agree, and I have the graphs to prove it!&lt;/p&gt;
&lt;p&gt;You see, it all started when I took a great &lt;a href="//vis.berkeley.edu/courses/cs294-10-sp10/wiki/index.php"&gt;Visualization course&lt;/a&gt; this past term which was taught by Maneesh Agrawala. Maneesh gave enough structure for the assignments, but also left some aspect of each open ended. For example, our first assignment had a fixed dataset which everyone had to make a static visualization of, but the means by which we did that was entirely up to us. A lot of people used Excel (in graduate level CS class? gross!), some people wrote little programs (I wrote mine in python using matplotlib and numpy, and did some cool stuff that I will have to post about another time and contribute back to matplotlib), there was even a poor sap who did it all in Photoshop, as I recall, but anything was fair game. Turns out we could even just draw or make something by hand and turn it in!&lt;/p&gt;
&lt;p&gt;The second assignment, the source of my graphs which quantitatively demonstrate the suckiness of Arizona, required us to use interactive visualization software to iteratively develop a visualization by first asking a question, then making a visualization to address this question, and going back several times refine the question and make successive visualizations.&lt;/p&gt;
&lt;p&gt;On thing to keep in mind is that, overall, naturalized citizens are both an exclusive and a discerning lot. In most cases, you have to be a permanent resident (have a Green card) for 5 years before you can apply. And there are &lt;a href="//en.wikipedia.org/wiki/Permanent_residence_(United_States)#Immigration_eligibility_and_quotas"&gt;quotas for how many people can get a Green card every year&lt;/a&gt;, so there are lots of hoops to jump through. Given the
amount of effort involved, wouldn't it be nice to look at a breakdown of naturalized citizens by state? Because that would give us an idea about which states immigrants percieve as, for lack of a better word, "awesome", or if you're
not so generous, "least sucky". I bet you'll feel that this second description is more appropriate once you take a look at the data, but keep my "least sucky" premise in mind as you read my original write-up which focused on a different angle (but from which we can still draw some reasonable conclusions). I'll return to make a few more comments about the title of this post after the copy-pasted portion.&lt;/p&gt;
&lt;p&gt;here's my original write-up:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;begin cut ---&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="there-are-three-kinds-of-lies-lies-damned-lies-and-statistics"&gt;There are three kinds of lies: lies, damned lies, and statistics.&lt;/h2&gt;
&lt;p&gt;As an immigrant, I've always had the subjective feeling that about half of the people I'm acquainted with are either themselves immigrants, or the children of immigrants. The US prides itself in being a melting pot, a country built by immigrants, so I wanted to dive into the data that would help me understand just how large of a role immigration plays in terms of the entire country. The question I started with, for the purpose of this assignment is this:&lt;/p&gt;
&lt;h3 id="whats-the-relationship-between-naturalizations-and-births-in-the-us"&gt;What's the relationship between naturalizations and births in the US?&lt;/h3&gt;
&lt;p&gt;But what I really wanted was to find out was what kind of question do I need to ask to get the answer that would be consistent with my world view. :)&lt;/p&gt;
&lt;p&gt;To do this, I started with the &lt;a href="//www.dhs.gov/files/statistics/publications/yearbook.shtm"&gt;DHS 2008 Yearbook of Immigration Statistics&lt;/a&gt;, which was linked from the class website.&lt;/p&gt;
&lt;p&gt;The file I started with was natzsuptable1d.xls, which required cleanup before I could read it into Tableau. Turns out that even though "importing" to tableau format is supposed to speed things up, it seems very fragile and would regularly fail when I tried converting type to Number (there were some non-numeric codes, like 'D' for 'Data withheld to limit disclosure). &lt;strong&gt;&lt;em&gt;*NOT&lt;/em&gt;&lt;/strong&gt;* importing to Tableua's desired format also had the added benefit of allowing me to change the .xls files externally, and having all the adjustments made in Tableau, without having to re-import the data source.&lt;/p&gt;
&lt;p&gt;Frustratingly, the last column and last row kept not getting loaded in Tableau! I also ran into an issue which I think had to do with the 'Unknown' country of origin and 'Unknown' state of naturalization which made the totals funky. It took a while to figure out, but there was a problem with Korea, because there was a superscript 1 by it, indicating that data from North and South Korea were combined.&lt;/p&gt;
&lt;p&gt;I was trying to use the freshest data possible, so I used the CDC's National Vital Statistics System report titled &lt;a href="//www.cdc.gov/nchs/data/nvsr/nvsr57/nvsr57_12.pdf"&gt;Births: Preliminary Data for 2007&lt;/a&gt;. I just had to copy paste the desired data, and massage it to fit the proper order columns in the excel table I already had handy. I put zeros for U.S. Armed Services Posts and similar territories which is probably not accurate, but this data was not available in the reports that I found. Interesting factoid: according to NVSS (CDC), in 2007 there were more people born in NYC than the rest of the state combined. (about 129K vs 126.5K). The only caveat with this data is that it contains only 98.7% of the data. The states with some missing portion of their data tabulated are Michigan (at 80.2% completeness), Georgia (86.4%), Louisiana (91.4%), Texas (99.4%), Alaska (99.7%), Nevada (99.7%), Delaware (99.9%). Thus, state-level analysis for MI, GA, and LA may be distorted.&lt;/p&gt;
&lt;p&gt;The data I had from DHS is for Fiscal Year 2008, which, as it turns out, goes from October 1st, 2007 - Sept 30th, 2008. Thus, no matter which combination of NVSS and DHS datasets I used, there would necessarily be a mismatch in the date range covered by each, so I settled with describing my visualization as "using the latest available data", noting the actual dates for each dataset in the captions. Also, the NVSS report contained a graph of births over time, which fluctuates very modestly from year-to-year, thus the visualization would not change qualitatively if I had 2008 birth data on hand.&lt;/p&gt;
&lt;p&gt;I was having a really hard time trying to get a look at the data I wanted to see in one sheet, and ended up trying to make a dashboard that combined several sheets. I couldn't figure out a good way to link the different states across datasets. I struggled for quite a while to pull out the data that I wanted to look at, and ended up having to copy past everything from DHS and NVSS (transposed) onto a new sheet in Gnumeric.&lt;/p&gt;
&lt;p&gt;Here's the result:&lt;/p&gt;
&lt;p&gt;[caption id="" align="alignnone" width="744" caption="Initial visualization"]&lt;img alt="" src="//pirsquared.org/images/melting-pot/Pi_US_PopGrowth.png"&gt;[/caption]&lt;/p&gt;
&lt;p&gt;&lt;a href="/courses/cs294-10-sp10/wiki/index.php/File:Pi_US_PopGrowth.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, in all of the US, about 1 in 5 new american citizens is an immigrant, or for every four births, we have one naturalization. That was kind of unsatisfying. I've lived in California the entire time I've been in the US, and I feel that at least California is more diverse than that. There's all those states in the middle of the country that few people from the rest of the world would want to immigrate to, yet the people living in them are still having babies, throwing off the numbers which would otherwise support my subjective world view...&lt;/p&gt;
&lt;p&gt;So I decided to look at the breakdown by state.&lt;/p&gt;
&lt;h3 id="broken-down-by-state-whats-the-relationship-between-naturalizations-and-births-in-the-us"&gt;Broken down by state, what's the relationship between naturalizations and births in the US?&lt;/h3&gt;
&lt;p&gt;[caption id="" align="alignnone" width="1226" caption="my second iteration"]&lt;img alt="" src="//pirsquared.org/images/melting-pot/Pi_one_bar.png"&gt;[/caption]&lt;/p&gt;
&lt;p&gt;&lt;a href="/courses/cs294-10-sp10/wiki/index.php/File:Pi_one_bar.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I added the reference lines so that you could both read off the approximate total easier, and be able to do proportion calculations visually, instead of mentally. This started looking promising, as I've only lived in California, and it looks like it's got quite a lot of immigrants as a portion of total new citizens.&lt;/p&gt;
&lt;p&gt;It was still kind of hard to see the totals, so I decide to create my very first calculated field - which would had the very simple formula [Births in 2007]+[Total Naturalized]. Using this new field, I could now make a map, to see the growth broken down geographically. This was just a way of reaffirming my earlier bias against the middle states having babies without attracting a sufficient number of immigrants to conform to my world view.&lt;/p&gt;
&lt;p&gt;[caption id="" align="alignnone" width="1072" caption="gratuitous map (was too easy to do using the software)"]&lt;img alt="" src="//pirsquared.org/images/melting-pot/Pi_state_map.png"&gt;[/caption]&lt;/p&gt;
&lt;p&gt;&lt;a href="/courses/cs294-10-sp10/wiki/index.php/File:Pi_state_map.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the breakdown by state bar graph, it was also difficult to visually compare the total births by state, because they all started at a different place, depending on the number of naturalizations for that state. So I decided to split the single bar and make small multiples for each state.&lt;/p&gt;
&lt;p&gt;[caption id="" align="alignnone" width="1278" caption="back to something more interpretable"]&lt;img alt="" src="//pirsquared.org/images/melting-pot/Pi_state_bars.png"&gt;[/caption]&lt;/p&gt;
&lt;p&gt;&lt;a href="/courses/cs294-10-sp10/wiki/index.php/File:Pi_state_bars.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It's interesting that the contribution of naturalizations slightly changes the ordering of the growth of states. For example, Florida has fewer births than New York, yet it's total growth is larger, because it naturalized 30,000 more people than New York. With this small multiples arrangement, it was now possible to do positional comparisons across categories, not just between naturalizations and totals. Turns out that more people get naturalized in California than are born in the entire state of New York. And since New York has the third highest number of births annually, more people got naturalized in California than are born in any state other than CA and TX.&lt;/p&gt;
&lt;p&gt;This was too large of a graph, and the story I'm interested in is really the ratio between the birth and naturalizations (the closer to 1:1, the better), so I made another calculated field, which is exactly such a ratio, multiplied by a factor of a thousand, so I could give it a sensible description (Naturalizations per 1000 births). This refines my question&lt;/p&gt;
&lt;h3 id="for-every-1000-people-born-in-the-us-how-many-many-immigrants-become-naturalized"&gt;For every 1000 people born in the US, how many many immigrants become naturalized?&lt;/h3&gt;
&lt;p&gt;I then ordered on these ratios, and decided to filter the top states. Guam would have made the cut, but it is not a state, and (though I didn't mention it earlier) it's NVSS birth data was only 77% complete, so I excluded it. Fifteen is a nice odd number, but it actually marked a nice transition, as after Texas, everything else is less than 200 naturalizations per 1,000 births.&lt;/p&gt;
&lt;p&gt;The small multiples bar graphs still looked too busy, and there was redundancy in the data, which didn't tell a succinct story. So I switched to just look at the ratios alone. This revealed, that, indeed, the fact that I've been living in California makes my perspective quite unique, as it is one of three states, along with Florida and New Jersey, to have an outstandingly large number of naturalizations compared to births. It is so high, indeed, that it puts the naturalization per births rate in these three states at more than twice the national average!&lt;/p&gt;
&lt;p&gt;Looking at ratio alone tells us about the diversity in each states growth, but carries more meaning in the context of total growth . Thus, added the combined totals (naturalizations and births) as a size variable, for context. The alternating bands to both make it easier to read off the rows, and to aid the comparison of sizes by framing every data point in a common reference window. It obviates that California is the state with 864,261 new citizens because fills the frame completely.&lt;/p&gt;
&lt;h3 id="final-question-what-are-the-top-15-melting-pot-states"&gt;Final question: What are the Top 15 "Melting Pot" States?&lt;/h3&gt;
&lt;p&gt;[caption id="" align="alignnone" width="1095" caption="almost done, would be nice to include context from the visualization I started with"]&lt;img alt="" src="//pirsquared.org/images/melting-pot/Pi_Top15_MeltingPots.png"&gt;[/caption]&lt;/p&gt;
&lt;p&gt;&lt;a href="/courses/cs294-10-sp10/wiki/index.php/File:Pi_Top15_MeltingPots.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ordering the data in this way also shed light on the small but still very diverse states that would not have otherwise made the cut (and did not pop out in any manner on my previous bar graphs). Rhode Island and Hawaii got it going on, in terms of attracting immigrants.&lt;/p&gt;
&lt;p&gt;Certainly the fact that I'm an immigrant myself also greatly influences whom I associate with, further skewing my …&lt;/p&gt;</summary><content type="html">&lt;p&gt;So I probably don't need to tell you this since you already know, but&lt;/p&gt;
&lt;h2 id="arizona-sucks"&gt;Arizona sucks!&lt;/h2&gt;
&lt;p&gt;It turns out that even documented immigrants agree, and I have the graphs to prove it!&lt;/p&gt;
&lt;p&gt;You see, it all started when I took a great &lt;a href="//vis.berkeley.edu/courses/cs294-10-sp10/wiki/index.php"&gt;Visualization course&lt;/a&gt; this past term which was taught by Maneesh Agrawala. Maneesh gave enough structure for the assignments, but also left some aspect of each open ended. For example, our first assignment had a fixed dataset which everyone had to make a static visualization of, but the means by which we did that was entirely up to us. A lot of people used Excel (in graduate level CS class? gross!), some people wrote little programs (I wrote mine in python using matplotlib and numpy, and did some cool stuff that I will have to post about another time and contribute back to matplotlib), there was even a poor sap who did it all in Photoshop, as I recall, but anything was fair game. Turns out we could even just draw or make something by hand and turn it in!&lt;/p&gt;
&lt;p&gt;The second assignment, the source of my graphs which quantitatively demonstrate the suckiness of Arizona, required us to use interactive visualization software to iteratively develop a visualization by first asking a question, then making a visualization to address this question, and going back several times refine the question and make successive visualizations.&lt;/p&gt;
&lt;p&gt;On thing to keep in mind is that, overall, naturalized citizens are both an exclusive and a discerning lot. In most cases, you have to be a permanent resident (have a Green card) for 5 years before you can apply. And there are &lt;a href="//en.wikipedia.org/wiki/Permanent_residence_(United_States)#Immigration_eligibility_and_quotas"&gt;quotas for how many people can get a Green card every year&lt;/a&gt;, so there are lots of hoops to jump through. Given the
amount of effort involved, wouldn't it be nice to look at a breakdown of naturalized citizens by state? Because that would give us an idea about which states immigrants percieve as, for lack of a better word, "awesome", or if you're
not so generous, "least sucky". I bet you'll feel that this second description is more appropriate once you take a look at the data, but keep my "least sucky" premise in mind as you read my original write-up which focused on a different angle (but from which we can still draw some reasonable conclusions). I'll return to make a few more comments about the title of this post after the copy-pasted portion.&lt;/p&gt;
&lt;p&gt;here's my original write-up:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;begin cut ---&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="there-are-three-kinds-of-lies-lies-damned-lies-and-statistics"&gt;There are three kinds of lies: lies, damned lies, and statistics.&lt;/h2&gt;
&lt;p&gt;As an immigrant, I've always had the subjective feeling that about half of the people I'm acquainted with are either themselves immigrants, or the children of immigrants. The US prides itself in being a melting pot, a country built by immigrants, so I wanted to dive into the data that would help me understand just how large of a role immigration plays in terms of the entire country. The question I started with, for the purpose of this assignment is this:&lt;/p&gt;
&lt;h3 id="whats-the-relationship-between-naturalizations-and-births-in-the-us"&gt;What's the relationship between naturalizations and births in the US?&lt;/h3&gt;
&lt;p&gt;But what I really wanted was to find out was what kind of question do I need to ask to get the answer that would be consistent with my world view. :)&lt;/p&gt;
&lt;p&gt;To do this, I started with the &lt;a href="//www.dhs.gov/files/statistics/publications/yearbook.shtm"&gt;DHS 2008 Yearbook of Immigration Statistics&lt;/a&gt;, which was linked from the class website.&lt;/p&gt;
&lt;p&gt;The file I started with was natzsuptable1d.xls, which required cleanup before I could read it into Tableau. Turns out that even though "importing" to tableau format is supposed to speed things up, it seems very fragile and would regularly fail when I tried converting type to Number (there were some non-numeric codes, like 'D' for 'Data withheld to limit disclosure). &lt;strong&gt;&lt;em&gt;*NOT&lt;/em&gt;&lt;/strong&gt;* importing to Tableua's desired format also had the added benefit of allowing me to change the .xls files externally, and having all the adjustments made in Tableau, without having to re-import the data source.&lt;/p&gt;
&lt;p&gt;Frustratingly, the last column and last row kept not getting loaded in Tableau! I also ran into an issue which I think had to do with the 'Unknown' country of origin and 'Unknown' state of naturalization which made the totals funky. It took a while to figure out, but there was a problem with Korea, because there was a superscript 1 by it, indicating that data from North and South Korea were combined.&lt;/p&gt;
&lt;p&gt;I was trying to use the freshest data possible, so I used the CDC's National Vital Statistics System report titled &lt;a href="//www.cdc.gov/nchs/data/nvsr/nvsr57/nvsr57_12.pdf"&gt;Births: Preliminary Data for 2007&lt;/a&gt;. I just had to copy paste the desired data, and massage it to fit the proper order columns in the excel table I already had handy. I put zeros for U.S. Armed Services Posts and similar territories which is probably not accurate, but this data was not available in the reports that I found. Interesting factoid: according to NVSS (CDC), in 2007 there were more people born in NYC than the rest of the state combined. (about 129K vs 126.5K). The only caveat with this data is that it contains only 98.7% of the data. The states with some missing portion of their data tabulated are Michigan (at 80.2% completeness), Georgia (86.4%), Louisiana (91.4%), Texas (99.4%), Alaska (99.7%), Nevada (99.7%), Delaware (99.9%). Thus, state-level analysis for MI, GA, and LA may be distorted.&lt;/p&gt;
&lt;p&gt;The data I had from DHS is for Fiscal Year 2008, which, as it turns out, goes from October 1st, 2007 - Sept 30th, 2008. Thus, no matter which combination of NVSS and DHS datasets I used, there would necessarily be a mismatch in the date range covered by each, so I settled with describing my visualization as "using the latest available data", noting the actual dates for each dataset in the captions. Also, the NVSS report contained a graph of births over time, which fluctuates very modestly from year-to-year, thus the visualization would not change qualitatively if I had 2008 birth data on hand.&lt;/p&gt;
&lt;p&gt;I was having a really hard time trying to get a look at the data I wanted to see in one sheet, and ended up trying to make a dashboard that combined several sheets. I couldn't figure out a good way to link the different states across datasets. I struggled for quite a while to pull out the data that I wanted to look at, and ended up having to copy past everything from DHS and NVSS (transposed) onto a new sheet in Gnumeric.&lt;/p&gt;
&lt;p&gt;Here's the result:&lt;/p&gt;
&lt;p&gt;[caption id="" align="alignnone" width="744" caption="Initial visualization"]&lt;img alt="" src="//pirsquared.org/images/melting-pot/Pi_US_PopGrowth.png"&gt;[/caption]&lt;/p&gt;
&lt;p&gt;&lt;a href="/courses/cs294-10-sp10/wiki/index.php/File:Pi_US_PopGrowth.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, in all of the US, about 1 in 5 new american citizens is an immigrant, or for every four births, we have one naturalization. That was kind of unsatisfying. I've lived in California the entire time I've been in the US, and I feel that at least California is more diverse than that. There's all those states in the middle of the country that few people from the rest of the world would want to immigrate to, yet the people living in them are still having babies, throwing off the numbers which would otherwise support my subjective world view...&lt;/p&gt;
&lt;p&gt;So I decided to look at the breakdown by state.&lt;/p&gt;
&lt;h3 id="broken-down-by-state-whats-the-relationship-between-naturalizations-and-births-in-the-us"&gt;Broken down by state, what's the relationship between naturalizations and births in the US?&lt;/h3&gt;
&lt;p&gt;[caption id="" align="alignnone" width="1226" caption="my second iteration"]&lt;img alt="" src="//pirsquared.org/images/melting-pot/Pi_one_bar.png"&gt;[/caption]&lt;/p&gt;
&lt;p&gt;&lt;a href="/courses/cs294-10-sp10/wiki/index.php/File:Pi_one_bar.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I added the reference lines so that you could both read off the approximate total easier, and be able to do proportion calculations visually, instead of mentally. This started looking promising, as I've only lived in California, and it looks like it's got quite a lot of immigrants as a portion of total new citizens.&lt;/p&gt;
&lt;p&gt;It was still kind of hard to see the totals, so I decide to create my very first calculated field - which would had the very simple formula [Births in 2007]+[Total Naturalized]. Using this new field, I could now make a map, to see the growth broken down geographically. This was just a way of reaffirming my earlier bias against the middle states having babies without attracting a sufficient number of immigrants to conform to my world view.&lt;/p&gt;
&lt;p&gt;[caption id="" align="alignnone" width="1072" caption="gratuitous map (was too easy to do using the software)"]&lt;img alt="" src="//pirsquared.org/images/melting-pot/Pi_state_map.png"&gt;[/caption]&lt;/p&gt;
&lt;p&gt;&lt;a href="/courses/cs294-10-sp10/wiki/index.php/File:Pi_state_map.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the breakdown by state bar graph, it was also difficult to visually compare the total births by state, because they all started at a different place, depending on the number of naturalizations for that state. So I decided to split the single bar and make small multiples for each state.&lt;/p&gt;
&lt;p&gt;[caption id="" align="alignnone" width="1278" caption="back to something more interpretable"]&lt;img alt="" src="//pirsquared.org/images/melting-pot/Pi_state_bars.png"&gt;[/caption]&lt;/p&gt;
&lt;p&gt;&lt;a href="/courses/cs294-10-sp10/wiki/index.php/File:Pi_state_bars.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It's interesting that the contribution of naturalizations slightly changes the ordering of the growth of states. For example, Florida has fewer births than New York, yet it's total growth is larger, because it naturalized 30,000 more people than New York. With this small multiples arrangement, it was now possible to do positional comparisons across categories, not just between naturalizations and totals. Turns out that more people get naturalized in California than are born in the entire state of New York. And since New York has the third highest number of births annually, more people got naturalized in California than are born in any state other than CA and TX.&lt;/p&gt;
&lt;p&gt;This was too large of a graph, and the story I'm interested in is really the ratio between the birth and naturalizations (the closer to 1:1, the better), so I made another calculated field, which is exactly such a ratio, multiplied by a factor of a thousand, so I could give it a sensible description (Naturalizations per 1000 births). This refines my question&lt;/p&gt;
&lt;h3 id="for-every-1000-people-born-in-the-us-how-many-many-immigrants-become-naturalized"&gt;For every 1000 people born in the US, how many many immigrants become naturalized?&lt;/h3&gt;
&lt;p&gt;I then ordered on these ratios, and decided to filter the top states. Guam would have made the cut, but it is not a state, and (though I didn't mention it earlier) it's NVSS birth data was only 77% complete, so I excluded it. Fifteen is a nice odd number, but it actually marked a nice transition, as after Texas, everything else is less than 200 naturalizations per 1,000 births.&lt;/p&gt;
&lt;p&gt;The small multiples bar graphs still looked too busy, and there was redundancy in the data, which didn't tell a succinct story. So I switched to just look at the ratios alone. This revealed, that, indeed, the fact that I've been living in California makes my perspective quite unique, as it is one of three states, along with Florida and New Jersey, to have an outstandingly large number of naturalizations compared to births. It is so high, indeed, that it puts the naturalization per births rate in these three states at more than twice the national average!&lt;/p&gt;
&lt;p&gt;Looking at ratio alone tells us about the diversity in each states growth, but carries more meaning in the context of total growth . Thus, added the combined totals (naturalizations and births) as a size variable, for context. The alternating bands to both make it easier to read off the rows, and to aid the comparison of sizes by framing every data point in a common reference window. It obviates that California is the state with 864,261 new citizens because fills the frame completely.&lt;/p&gt;
&lt;h3 id="final-question-what-are-the-top-15-melting-pot-states"&gt;Final question: What are the Top 15 "Melting Pot" States?&lt;/h3&gt;
&lt;p&gt;[caption id="" align="alignnone" width="1095" caption="almost done, would be nice to include context from the visualization I started with"]&lt;img alt="" src="//pirsquared.org/images/melting-pot/Pi_Top15_MeltingPots.png"&gt;[/caption]&lt;/p&gt;
&lt;p&gt;&lt;a href="/courses/cs294-10-sp10/wiki/index.php/File:Pi_Top15_MeltingPots.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ordering the data in this way also shed light on the small but still very diverse states that would not have otherwise made the cut (and did not pop out in any manner on my previous bar graphs). Rhode Island and Hawaii got it going on, in terms of attracting immigrants.&lt;/p&gt;
&lt;p&gt;Certainly the fact that I'm an immigrant myself also greatly influences whom I associate with, further skewing my world view towards a 1:1 ratio, but I'm actually quite impressed with just how close to that ratio is in California - 1:1.9. Of course, the data I've analyzed does not include the American-born 1st generation of children, nor does it take into account the number of immigrants living in the US that do not have citizenship. All of these factors would surely push the ratio even closer toward 1:1.&lt;/p&gt;
&lt;p&gt;I decided to combine the US total growth information, since it's gives further perspective on the entire data set, such as the fact that California accounts for about 16% of total US growth. It also sheds light on how the US average was calculated. A new "twice the nat'l avg" line makes explicit the three most diverse outlier states mentioned before. I also changed the colors to match the convention used in the bar charts made earlier. The US combined total line semantically links the data plotted with the national growth bar chart - i.e. the green dots are formed by the sum of born and naturalized citizens.&lt;/p&gt;
&lt;p&gt;[caption id="" align="aligncenter" width="1259" caption="What are the Top 15 "Melting Pot" States?"]&lt;img alt="" src="//pirsquared.org/images/melting-pot/Pi_MeltingPots_UStotal.png"&gt;[/caption]&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;---- end of cut&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="/courses/cs294-10-sp10/wiki/index.php/File:Pi_MeltingPots_UStotal.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ok, so, to be honest, it turns out that I wrote a large chunk of this post (Arizona suckage included) before I actually looked back at my visualizations, only going off my memory that it wasn't in the top 10. So Arizona is just below the national average in this "Melting Pot" ratio (a measure I made up, the number of naturalization per 1000 births). Since it is #12, some might say, "Paul, Arizona's on your top 15 list", to which I'll reply: "So's Texas."&lt;/p&gt;
&lt;p&gt;I guess I just wanted to share these purdy graphs I made a few months back, and it seemed like there was a somewhat topical angle on them a few weeks back, when         I remembered that I hadn't posted them on here yet. Anyway, I'd love to hear back your thoughts.&lt;/p&gt;</content><category term="democracy"></category><category term="visualization"></category></entry><entry><title>on facebook, you die a quiet death...</title><link href="//pirsquared.org/blog/facebook.html" rel="alternate"></link><published>2010-02-27T06:56:13-08:00</published><updated>2010-02-27T06:56:13-08:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2010-02-27:/blog/facebook.html</id><content type="html">&lt;p&gt;So I finally got around to quitting facebook. I came to the HackerDojo tonight, and Waleed was working on sending out notifications for users of his app, because Facebook is disabling notifications as of March 1st.&lt;/p&gt;
&lt;p&gt;Notifications was the way I was planning to announce my departure, because the "app" I created for that purpose would still be around after I deleted my account. But I was only able to send out a few of these notifications before facebook would not let me anymore.&lt;/p&gt;
&lt;p&gt;Here's the message (with the cool icon I made) as it appeared on
Facebook:&lt;a href="//pirsquared.org/blog/images/2010-02-27-053336_324x129_scrot.png"&gt;&lt;img alt="Notification" src="//pirsquared.org/blog/images/2010-02-27-053336_324x129_scrot.png"&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But that wasn't going to stop me: so I made a status update - which contained essentially the same message:      &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Hey guys, as I alluded to in a status update a few weeks back:

I&amp;#39;m leaving Facebook.

This walled garden isn&amp;#39;t the way the web was meant to be, and I *refuse* to
continue participating in it.

You can always find me by either searching for &amp;quot;Paul Ivanov&amp;quot;, or through the
various means listed [on my website](//pirsquared.org/personal.html).

best, 
-pi
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And then I was off to "Deactivate" myself. Beware - Facebook will play on your heartstrings by telling you that a couple of your friends will miss you - putting their photos right there and beckoning you to message them - but I was prepared to deflect this Faustian bargain.
&lt;a href="//pirsquared.org/blog/images/2010-02-27-051712_692x720_scrot.png"&gt;&lt;img alt="&amp;quot;Don't go! Ashley and Andrew will miss
you!!!&amp;quot;" src="//pirsquared.org/blog/images/2010-02-27-051712_692x720_scrot.png"&gt;&lt;/a&gt;
 Though after I said "yes, really", it asked me for my password, and following that also sent a CAPTCHA! ("the escapade" indeed!)&lt;/p&gt;
&lt;p&gt;&lt;a href="//pirsquared.org/blog/images/2010-02-27-051909_639x436_scrot.png"&gt;&lt;img alt="&amp;quot;the escapade&amp;quot;
indeed" src="//pirsquared.org/blog/images/2010-02-27-051909_639x436_scrot.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and then, just like that: POOF! I vanished. Without any trace. The fake temporary account I created had no friends - my last (and all) status updates lost in the ether (at least as far as facebook &lt;em&gt;users&lt;/em&gt; are concerned). But rest assured that the data lingers - permenantly - as facebook was immediately suggesting that my new fake account, who now had no friends to speak of - connect with the people I had been friends with, even though my account was gone.&lt;/p&gt;
&lt;p&gt;For most of my friends, I got your birthdays, schools and jobs, as well as the most recent photo, and all of the friend-to-friend connection among you. For most - I actually had a stale copy (of everything but the photos) from 2007, which when I originally wrote the export scripts I used, and Facebook was just starting to open up its API and quickly devolving to a MySpace clone. It's not like I even frequently used the site - but reading about &lt;a href="//twitter.com/ivanov/status/7690140942"&gt;this&lt;/a&gt; reminded me to quit for good. &lt;/p&gt;
&lt;p&gt;So I finally did.&lt;/p&gt;</content><category term="technology"></category></entry><entry><title>Publisher's Block</title><link href="//pirsquared.org/blog/publishers-block.html" rel="alternate"></link><published>2009-12-26T01:55:55-08:00</published><updated>2009-12-26T01:55:55-08:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2009-12-26:/blog/publishers-block.html</id><content type="html">&lt;p&gt;One of the reasons I find it so difficult to get more than a couple of entries
in per year, is that I know they aren't going anywhere after I post them.
They're sticking around for a while, and if they're full of trivial crap then
that doesn't reflect very well on me. Posting about trivial stuff was ok when I
was still trying to establish a sense of identity. These days, when I write
something public, say on a mailinglist, I agonize over every detail because I
know that this digital breadcrumb with my name attached will be around forever.
So I keep raising the stakes to myself, neurotically checking over every
possible extra whitespace in a patch I send in, sinking hours into something
that should have taken 15 minutes.&lt;/p&gt;
&lt;p&gt;I'm finally getting to the point where I realize it's a problem that, for
example, even when I'm texting someone, I try to get all of the spelling and
punctuation correct.&lt;/p&gt;
&lt;p&gt;It's slowing me down.&lt;/p&gt;
&lt;p&gt;I've had a lot of half-written blog posts that, after stepping away from them
for a short while just don't seem significant enough.  I try to only publish
pieces that either I think about for a while, or that I'm not hearing/reading
others write about. But I'm always mindful about adding noise.  The way I see
it, when it became super easy for anyone to publish online, a lot of content
flooded in that I simply don't care for. Same idea with web 2.0 - because of
Ruby on Rails, Django, and other web frameworks, writing a fancy (but useless)
website became super easy - and now we're oversaturated with them ((Though this
problem will probably sort itself out with time. I didn't intent to write about
this now, so I'll just keep that remark without developing it further)).  So
there's this internal tension: I think there's too much crap-content out there
but at the same time my internal filter keeps me from publishing &lt;em&gt;anything&lt;/em&gt;.  I
rarely express my thoughts about what I find important in writing anymore.
Others don't seem to make such a big deal about self-filtering, and are much
more prolific writers/bloggers/coders, etc.&lt;/p&gt;
&lt;h1 id="lts"&gt;&lt;a id='LTS' href="#LTS"&gt; LTS &lt;/A&gt;&lt;/h1&gt;
&lt;p&gt;So here's a new acronym-sized motto to help correct this behavior, which is
starting to get sprinkled in comments in the software I'm writing for my
research: LTS. Life's too short.&lt;/p&gt;
&lt;p&gt;&lt;img alt="LTS" src="//pirsquared.org/blog/images/LTS_code.png" title="LTS has been showing up in my code coments"&gt;&lt;/p&gt;
&lt;p&gt;I use it as a reminder of what in the past was one of my frequently used maxims:
most things in life are pass or fail. This doesn't mean that it's ok to do a
half-assed job on everything, but given that there's a limited amount of time, I
should focus my efforts only on that which is truly important. Typos in a text
message or extra trailing whitespace do not qualify as such.&lt;/p&gt;
&lt;p&gt;I wasn't always this careful about what I publish. I've had some form of internet presence (as embarrassing as it may seem now) since I was in middle school. It started in one of those geocities neighborhoods, I don't even remember any details right now, probably because my brothers helped me to set it up. I didn't use my real name until I started a &lt;a href="http://shad0kn1ght.tripod.com/basement/"&gt; poetry website&lt;/a&gt; freshman year in high school.&lt;/p&gt;
&lt;p&gt;I used my full name, because I wanted to express my thoughts and have them be connect back to my persona, not a pseudonym that I might grow tired of. I was &lt;a href="http://shad0kn1ght.tripod.com/basement/again/Excuses.txt"&gt;quite explicit about this&lt;/a&gt; at the time. And I didn't filter myself, I just counted a total of 20 poems on there which were written in the course of a year. None of them &lt;em&gt;really&lt;/em&gt; make me cringe, and some I'm still quite proud of.&lt;/p&gt;
&lt;p&gt;I had nothing to gain by hiding behind an alias. I think that attaching my real name somehow made my thoughts sincere. I started blogging socially my senior year in high school (&lt;a href="http://pavelthegeek.livejournal.com/2001/"&gt;livejournal&lt;/a&gt;), and looking back on the &lt;a href="http://pavelthegeek.livejournal.com/1480.html"&gt;first entry there&lt;/a&gt;, I was just trying to capture day-to-day events and thoughts. &lt;a href="http://www.vim.org"&gt;Vim&lt;/a&gt;, &lt;strong&gt;THE&lt;/strong&gt; editor, is mentioned five times in the first two entries :) . But there are some very candid and thoughtful remarks in there, too.&lt;/p&gt;
&lt;p&gt;It's kind funny to have your more than 10 year old website cited in a Yahoo!
Answer to the question: "What is the best way to live life to the fullest?".
&lt;img alt="Basement cited" src="//pirsquared.org/blog/images/basement_cited.png" title="My first website recently cited in Yahoo! Answers"&gt; I mean, it &lt;strong&gt;is&lt;/strong&gt; yahoo
answers, we're really scraping the bottom of the barrel when it comes to content
(( in fact, Elaine absolutely &lt;em&gt;refuses&lt;/em&gt; to read anything on that site anymore,
despite the fact that frequently, her google search string is verbatim the same
as the question which comes up as one of the top results)) , but it's still
cool. Yeah, ok, so it's doubly embarrassing because the citation is just for the
lyrics to "The Sunscreen Song". I'm ok with that.&lt;/p&gt;
&lt;p&gt;And I'm very grateful for my many friends and colleagues who, by their example, continue to give me the courage to release my thoughts and code out in the open. Thank you.&lt;/p&gt;
&lt;p&gt;As I was putting my finishing touches on this post, I found a recent entry on Scot Hacker's blog titled &lt;a href="http://birdhouse.org/blog/2009/12/22/facebook-and-privacy/"&gt;"(I Don’t Care About) Facebook and Privacy"&lt;/a&gt; that covers similar ground: "For me, it’s simple: If what you have to say shouldn’t be said to the whole world, then don’t say it online." I agree, and it's a more sensible standard than my "everything you say will forever be connected to you, so don't screw it up!" But just to be clear, this should only apply to things you &lt;em&gt;intend&lt;/em&gt; to write up and release: I absolutely oppose &lt;a href="http://www.eff.org/deeplinks/2009/12/google-ceo-eric-schmidt-dismisses-privacy"&gt;Eric Schmidt's dismissal of privacy&lt;/a&gt;. Eric says, "If you have something that you don't want anyone to know, maybe you shouldn't be doing it in the first place." Due to its construction, it bears striking similarity to Scot's quote above with which I mostly agree. But to me, Eric's statement is a &lt;em&gt;1984&lt;/em&gt;-sized world apart.&lt;/p&gt;
&lt;p&gt;Anyway, hopefully I've adequately explained my "publisher's block", and there are many related topics left to explore, but this is where I'll have to end this post for now. LTS.&lt;/p&gt;</content><category term="technology"></category><category term="vim"></category></entry><entry><title>Standing up to the Madness is an excellent read</title><link href="//pirsquared.org/blog/madness.html" rel="alternate"></link><published>2009-05-02T22:38:33-07:00</published><updated>2009-05-02T22:38:33-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2009-05-02:/blog/madness.html</id><content type="html">&lt;p&gt;&lt;a href="//www.democracynow.org/store/product/11/BKSUTMPB"&gt;&lt;img alt="Standing up to the Madness: Ordinary Heroes in Extraordinary
Times" src="//pirsquared.org/blog/images/pbsuttm.png"&gt;&lt;/a&gt;My &lt;a href="//redwood.berkeley.edu"&gt;labmate&lt;/a&gt; Tim sent me an email on Wednesday (April 15th) saying that Amy Goodman "&lt;a href="//democracynow.org"&gt;Democracy Now!&lt;/a&gt; fame, and my heroin" [&lt;em&gt;sic&lt;/em&gt;]  was speaking on campus at noon. The place was packed, and it's the best way I could have imagined to snap back out of the Qualifying Exam bubble I've spent the last several months in, and re-engage with the world at large.&lt;/p&gt;
&lt;p&gt;One of the excuses for the tour is the paperback release of &lt;a href="//www.democracynow.org/store/product/11/BKSUTMPB"&gt;Standing up to the Madness: _ Ordinary Heroes in Extraordinary Times_&lt;/a&gt; by Amy and David Goodman.&lt;/p&gt;
&lt;p&gt;Now that I'm a &lt;a href="//twitter.com/ivanov/status/1494064656"&gt;&lt;em&gt;tenured&lt;/em&gt; grad student&lt;/a&gt;, I can actually allow myself to read for pleasure - guilt free! So I went to the library that Thursday, and picked up the hardcover, which came out last year.&lt;/p&gt;
&lt;p&gt;What I liked about this book is what sets it apart from other political books of today. Amy and David don't just provide us with a laundry list of wrongdoing by the Bush administration, congress, various governmental agencies, as well as highlighting some of the ongoing local struggles. Though the book is chock-full of such details, they are all provided in the context of a particular vignette. What's more - instead of simply stating the problems, or providing an outline of the authors' opinions regarding what course of action should be taken, the book highlights the work average citizens have already done to oppose injustice, censorship, racism, etc. One example is T-shirt "terrorist" Raed Jarrar, who wore a shirt with the words "We will not be silent" - written in both English and Arabic - a reference to &lt;a href="//en.wikipedia.org/wiki/White_Rose"&gt;the White Rose&lt;/a&gt; - and was forced to put another shirt over it because JetBlue customers were threatened or offended. With the help of the ACLU, Jarrar sued the TSA and JetBlue, who &lt;a href="//raedinthemiddle.blogspot.com/2009/01/i-won.html"&gt;ended up paying $240,000 to settle the discrimination charges&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Like Hochschild's King Leopold's Ghost ((which, after I first read it in 2001 became my measuring stick for gauging the quality of non-fiction)), this book is non-fiction that reads like fiction. Not because it is well-written, though it is, but because of the shocking realities of the content.  Leadership cannot be taught, it can only be revealed. Standing up to the Madness gives us dozens of snapshots of the ongoing work of ordinary heroes.&lt;/p&gt;</content><category term="books"></category></entry><entry><title>Duopoly (or why I'm not voting for Obama)</title><link href="//pirsquared.org/blog/duopoly.html" rel="alternate"></link><published>2008-07-04T13:12:02-07:00</published><updated>2008-07-04T13:12:02-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2008-07-04:/blog/duopoly.html</id><content type="html">&lt;p&gt;Let me ask you a question: Do you think that the two-party system is good for the United States?&lt;/p&gt;
&lt;p&gt;I find it very difficult to engage in debates about national politics because the average citizen has so little influence over these matters. I think that it's much more worthwhile to get informed about and involved in local politics, because that's where someone like me can actually have influence.&lt;/p&gt;
&lt;p&gt;Nevertheless my own answer to the question is that it's probably not a good thing.  There's this high-dimensional landscape of issues that people care and have different ideas about - reproductive rights, gun control, immigration, education, social programs, the size of government, taxation, the list goes on and on. Yet that gets projected down to this one dimensional line with just "Left" and "Right" with optional "far" and "center" prefixes.&lt;/p&gt;
&lt;p&gt;And, sadly, the common consensus is that on election day you have only two possible boxes to check. A single decision. One bit. &lt;strong&gt;0&lt;/strong&gt; or &lt;strong&gt;1&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The Democrats and Republicans are playing a small concessions type of game. They sort of shuffle around slightly to appeal to enough of those voters who aren't already automatically voting for them.  If you only vote for one or the other, they have no reason to change - they already have your vote.&lt;/p&gt;
&lt;p&gt;Voters in safe &lt;em&gt;rarely contested&lt;/em&gt; states, have the unique opportunity to vote their conscience without fear ((Electoral College: bug or feature?)). When I &lt;a href="http://twitter.com/ivanov/statuses/843377424"&gt;twittered&lt;/a&gt; about &lt;a href="http://www.salon.com/opinion/greenwald/2008/06/21/obama/index.html"&gt;Obama's support for the FISA Compromise&lt;/a&gt;, Philip, a disappointed California voter &lt;a href="http://twitter.com/philipn/statuses/843623031"&gt;replied&lt;/a&gt;: "our voting system forces us to vote strategically and i'll be voting obama ." This doesn't make any sense to me! Obama will carry California. Democrats almost automatically get California ((The only way the Democrats might not get California is if Arnold runs as VP for a moderate Republican, and that just is not happening this year.)) .&lt;/p&gt;
&lt;p&gt;So why give in? You're not happy with the Democratic candidate ((There are &lt;a href="http://www.politico.com/news/stories/0708/11517.html"&gt;more reasons&lt;/a&gt; to not be happy)), the candidate who will carry California regardless of how you vote, yet you still feel unable to voice your disapproval in the electoral arena. David &lt;a href="http://twitter.com/dreid/statuses/843670464"&gt;wrote&lt;/a&gt;: "I'm not going to throw away my vote on the green party," but aren't you just throwing away your vote to the democrats, instead?&lt;/p&gt;
&lt;p&gt;The role of third parties is to emphasize new and different ideas, to bring folks who've given up hope back to the table, and to make the major parties shift in &lt;strong&gt;MEANINGFUL&lt;/strong&gt; ways. Here are some great YouTube clips on the role of third parties in the US: &lt;a href="http://youtube.com/watch?v=Zw1Aji8FzJc"&gt;Part One&lt;/a&gt;, &lt;a href="http://youtube.com/watch?v=bVRevKOtSh0"&gt;Part Two&lt;/a&gt;, &lt;a href="http://youtube.com/watch?v=oC8g7YNmCpM"&gt;Part Three&lt;/a&gt;, &lt;a href="http://youtube.com/watch?v=Zece3k884R0"&gt;Part Four&lt;/a&gt;, &lt;a href="http://youtube.com/watch?v=szBugsr7bls"&gt;Part Five&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you still have doubts about voting for a third party candidate and/or you live in a swing state - consider the &lt;a href="http://www.votepact.org/index2.shtml"&gt;votepact.org proposal&lt;/a&gt;: find a fellow kindred heart on the other side of the political spectrum who's also unhappy with the candidate on their side, and together vote for a third party (fill out your absentees together over coffee).&lt;/p&gt;</content><category term="democracy"></category><category term="greens"></category></entry><entry><title>My first foray into the production of motion pictures</title><link href="//pirsquared.org/blog/ihouse_video.html" rel="alternate"></link><published>2007-11-28T05:11:10-08:00</published><updated>2007-11-28T05:11:10-08:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-11-28:/blog/ihouse_video.html</id><content type="html">&lt;p&gt;I want to thank &lt;a href="http://curtsiffert.com"&gt;Curt Siffert&lt;/a&gt; for granting me
permission to use his song "All Aboard (v2)" which you can &lt;a href="http://curtsiffert.com/bitsandpieces"&gt;download (for free)
here&lt;/a&gt;. This is the first video ((yes,
okay, it's more of a slideshow with an intro, but my brother Mike told me that
&lt;a href="http://en.wikipedia.org/wiki/Ken_Burns_Effect"&gt;Ken Burns&lt;/a&gt; would be proud)) I've
ever made, but I've wanted to make films for as long as I've been writing
((creatively, which would be
&lt;a href="http://members.tripod.com/shad0kn1ght/basement/"&gt;1999&lt;/a&gt; - &lt;em&gt;warning:&lt;/em&gt; link
contains some extremely cheesy content, including an &lt;a href="http://members.tripod.com/shad0kn1ght/basement/news.html"&gt;early
version&lt;/a&gt; of what
evolved into this journal)) (even before
&lt;a href="http://halfjapanesesal.livejournal.com"&gt;Sally&lt;/a&gt; said "Hey guys, I'm going to
make movies!" &lt;a href="http://youtube.com/watch?v=aljvbTwxNYQ"&gt;and then did&lt;/a&gt;), so I'm
glad I've finally started.&lt;/p&gt;
&lt;p&gt;I put this together for a video contest here at I-house. You can &lt;a href="http://youtube.com/group/ihousecontest"&gt;see all of the
videos for the contest here&lt;/a&gt;, the winner
was &lt;a href="http://youtube.com/watch?v=MYnrZZXH4vw"&gt;Life At I-House, A Glimpse&lt;/a&gt; by
KirstyandEliana.&lt;/p&gt;</content><category term="life"></category><category term="berkeley"></category></entry><entry><title>Napoleon@Home - Distributed World Domination</title><link href="//pirsquared.org/blog/napoleon.html" rel="alternate"></link><published>2007-10-13T21:07:29-07:00</published><updated>2007-10-13T21:07:29-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-10-13:/blog/napoleon.html</id><content type="html">&lt;p&gt;&lt;a href="//pirsquared.org/napoleon"&gt;&lt;img alt="Napoleon@Home" src="//pirsquared.org/napoleon/napoleonathome.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'm about to give &lt;a href="//pirsquared.org/napoleon"&gt;this&lt;/a&gt; Lightning Talk at &lt;a href="//superhappydevhouse.org/SuperHappyDevHouse20"&gt;SHDH20&lt;/a&gt;.&lt;/p&gt;</content><category term="technology"></category><category term="berkeley"></category><category term="talk"></category></entry><entry><title>Weinberger's talk and OLPC</title><link href="//pirsquared.org/blog/weinbergers-talk-and-olpc.html" rel="alternate"></link><published>2007-08-08T05:45:17-07:00</published><updated>2007-08-08T05:45:17-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-08-08:/blog/weinbergers-talk-and-olpc.html</id><content type="html">&lt;p&gt;Here's &lt;a href="http://video.google.com/videoplay?docid=2159021324062223592"&gt;David Weinberger talking&lt;/a&gt; about &lt;em&gt;Everything is Miscellaneous&lt;/em&gt; (the book I reviewed &lt;a href="http://www.pirsquared.org/blog/2007/07/31/information/"&gt;here&lt;/a&gt; and many others did &lt;a href="http://www.everythingismiscellaneous.com/reviews/"&gt;here&lt;/a&gt;). The hour-long talk stands on its own and covers much of the book, though I don't recommend watching it if you're planning to read the book.&lt;/p&gt;
&lt;p&gt;I went to Linux World Expo today and played with one of these upcoming &lt;a href="http://en.wikipedia.org/wiki/OLPC"&gt;One-Laptop-Per-Child&lt;/a&gt; project's XO-1 laptops at the Creative Commons booth.
&lt;img alt="OLPC XO-1 at Linux World" src="http://www.pirsquared.org/blog/images/linuxworldolpc.jpg"&gt;
_ Photo by &lt;a href="http://laughingsquid.com/"&gt;Scott Beale / Laughing Squid&lt;/a&gt; &lt;a href="http://creativecommons.org/licenses/by-nc-nd/2.0/"&gt;(cc)
&lt;/a&gt;&lt;em&gt;
While OLPC is a noble effort, I think it still feels like another example of trying to solve a problem with technology where technology is not the bottleneck. For example, I was bummed that they took away the hand-crank power-supply a while back because I think this severely limits who'll be able to eventually use these. The UI and networking stuff is pretty novel, but my overall impression is that it's too gadgety. I felt pretty lost in all just the buttons on the keyboard, but then again I only used it for 20 minutes and this wasn't made for me. With that said, I'm not holding my breath, but it _could&lt;/em&gt; be a great thing if this takes off. I say "could" because technology &lt;em&gt;by itself&lt;/em&gt; just isn't enough ((A point the OLPC project acknowledges in their &lt;a href="http://laptop.org/vision/mission/"&gt;vision&lt;/a&gt;.)). This is a point I keep coming back to again and again.&lt;/p&gt;</content><category term="technology"></category></entry><entry><title>uncomfortably sincere</title><link href="//pirsquared.org/blog/uncomfortably-sincere.html" rel="alternate"></link><published>2007-08-07T06:34:08-07:00</published><updated>2007-08-07T06:34:08-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-08-07:/blog/uncomfortably-sincere.html</id><content type="html">&lt;p&gt;From my paper journal:  &lt;/p&gt;
&lt;p&gt;&lt;img alt="Only a Sith Lord deals in
absolutes" src="http://www.pirsquared.org/blog/images/star-wars-sith-lords.jpeg"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;23:37 May 10th, 2007 &lt;em&gt;Thursday&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So what good is all of this if we don't engage one another - on a very real level? "Only a Sith Lord deals in absolutes," man - so let's get off the condescending trips and the polarizing anti-discourse. Let's use our full range - zero, one, two, five, seven, eight, ten, etc  and not just on or off - there's an infinitude of wonder in between and out in every dimension.&lt;/p&gt;
&lt;p&gt;I resolve to hesitantly dip my toes in, from time to time, instead of being all in or all out. Talk to a beat stranger - but not &lt;em&gt;every&lt;/em&gt; beat stranger. Give up some left over food to the guys on Bancroft and Telegraph (the Shattuck hobos are too hip for me - but I hope they aren't for someone else -- I &lt;em&gt;know&lt;/em&gt; they aren't). I can just eavesdrop on the world from time to time - I can't always be wide-eyed gulping from the fire hydrant of information flowing at 100 terabits per second eyes glazed over passed out exhausted gasping for a sense of self disoriented head-spun hours or days later. Just a drinking fountain or a tap and a few cups or liters a day would be fine. No need to parch yourself and dry up like a raisin all the time. It's ok to wrinkle and shrivel - and you don't need to burst, either - just be &lt;em&gt;uncomfortably sincere&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I think I'm going to try that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Related brief thought:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;17:36 June 22nd, 2007 &lt;em&gt;Friday&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bumper Sticker Activists (Telegraph in Berkeley)  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The last thing we need is more Bumper Sticker Activism. Wearing a clever T-shirt does &lt;em&gt;&lt;strong&gt;not&lt;/strong&gt;&lt;/em&gt; constitute civic participation.&lt;/p&gt;</content><category term="life"></category><category term="journal excerpt"></category></entry><entry><title>thoughts about the sea of information</title><link href="//pirsquared.org/blog/information.html" rel="alternate"></link><published>2007-07-31T04:23:27-07:00</published><updated>2007-07-31T04:23:27-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-07-31:/blog/information.html</id><content type="html">&lt;p&gt;&lt;img alt="Everything is Miscellaneous" src="https://www.pirsquared.org/blog/images/everythingmisc.thumbnail.jpg"&gt;I just finished reading ((In three evening sittings at Moe's Books)) David Weinberger's &lt;em&gt;Everything is Miscellaneous&lt;/em&gt; and I find it to be a pretty engaging description of how the state of knowledge evolved with time, and now it has given me a chance to write down some thoughts.&lt;/p&gt;
&lt;p&gt;The basic gist of the book is that knowledge is no longer tied to the physical (e.g. books), which used to limit how one went about organizing and finding it (e.g. Dewey decimal system). Now we can attach as much metadata as our hearts desire, which technology helps us sift through to help us find what we want. Instead of each book having a particular place, as in a warehouse, or a relative position (alphabetical within a subject), an individual leaf of information lives on a multitude of trees simultaneously, and the trees themselves are dynamically created and rearranged for each user on the fly.&lt;/p&gt;
&lt;p&gt;The first few chapters focused on how knowledge has been historically organized over the centuries. I did skim through a few of the middle chapters, it seemed to be pretty straightforward commentary on the digital lives most of us now lead - user created content, social tags and lists, auto-recommendation, etc. Some over-simplified, in that sometimes unavoidable awkwardness  that comes out of describing something neat and complex yet obvious to those leading digital lives. It was refreshing to read about the downsides of scientific publications like Nature and Science (e.g. good science isn't enough ((some might even argue "isn't required")) to publish because of how few articles get in, the research has to be "sexy")  and how the new comer &lt;a href="https://www.plosone.org/"&gt;PLoS One&lt;/a&gt; aims to correct these shortcomings. Because this was just the topic that was discussed at the &lt;a href="https://neuroscience.berkeley.edu/"&gt;Neuroscience&lt;/a&gt; retreat last year (in a lecture about the then-upcoming PLoS One), scientists care about this stuff and it comes back every so often.&lt;/p&gt;
&lt;p&gt;Although I never considered it myself, I totally &lt;em&gt;got it&lt;/em&gt; when Danae started her Master of Library Science. I would argue that more than anything else, what we're producing most of in the world today is information. Perhaps &lt;em&gt;capture&lt;/em&gt; and &lt;em&gt;disseminate&lt;/em&gt; is a more appropriate description. Information, by itself, is agnostic to how it gets used (or abused). But the &lt;a href="https://www.ocf.berkeley.edu/~stoll/"&gt;Cliff Stoll&lt;/a&gt;-ian side of me says that we should be weary of the exponentially growing amount of information, and not just for the obvious Big Brother / privacy reasons (e.g. "&lt;em&gt;&lt;a href="https://hosted.ap.org/dynamic/stories/O/OH_PLATE_HUNTER_OHOL-?SITE=WBNSTV&amp;amp;SECTION=HOME&amp;amp;TEMPLATE=DEFAULT"&gt;Plate reader draws objections of ACLU&lt;/a&gt;&lt;/em&gt;").&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The non-obvious threat of information is that we're drowning in it&lt;/strong&gt; (my claim).  Here I'm glad Weinberger mentions Cass Sunstein's book &lt;em&gt;Republic.com&lt;/em&gt; ((&lt;em&gt;Republic.com&lt;/em&gt; starts with a succinct vignette: "&lt;a href="https://web.archive.org/web/20170702224602/http://press.princeton.edu/chapters/s7014.html"&gt;the daily me&lt;/a&gt;")), the basic thesis of which ((on my quick skimming at the UCD bookstore this past Picnic Day.))  is that with more and more information out there, we can all end up listening, watching, and reading only &lt;em&gt;that&lt;/em&gt; which reinforces our world view - drowning out everything else without even having to plug up our ears and going &lt;em&gt;"LALALALALA"&lt;/em&gt;, but by finding podcasts, channels, and blogs where others are doing the &lt;em&gt;"LALALALALA"&lt;/em&gt; for us.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Touched by His Noodly Appendage" src="https://www.pirsquared.org/blog/images/noodledoodlewall.jpg"&gt;In many ways, this leads to huge portions of the population nonsensically parroting something like "Evolution is just a theory" to one another. Scientific theories both explain observed phenomena (why living organisms share so much of their DNA) and make predictions about future observations (my niece's hair color based on that of her parents, or maybe one you don't hear about so often: regular use of antibacterial soap &lt;em&gt;might&lt;/em&gt; be a bad idea, placing evolutionary pressure on the bacteria to evolve immunity to the soap). Moreover simpler or more elegant, straightforward theories are preferred (aka &lt;a href="https://en.wikipedia.org/wiki/Occam%27s_Razor"&gt;Occam's Razor&lt;/a&gt;). Which is why Intelligent Design is on par with &lt;a href="https://www.venganza.org/"&gt;Flying Spaghetti Monsterism&lt;/a&gt;, not science. But this has been better described in &lt;a href="https://en.wikipedia.org/wiki/Theory#Science"&gt;other places&lt;/a&gt; and elsewhere (suggestions welcome). The point is that I'm worried that there's no way anyone get through to the people that end up isolating themselves in their own feedback loops. I worry that not enough people engage enough to think on their own. Technology can't fix this problem. No amount of metadata will ever be enough (( a point I think the book misses)).&lt;/p&gt;
&lt;p&gt;In this entry, I've linked to Wikipedia a few times, and while I agree it should not be regularly used for primary research, I also welcome the explicit uncertainty inherent in a publicly editable wiki, as it reflects the tentative nature of information, and I think we should be somewhat skeptical about a great deal. I have also been recommended, though I have not yet read Manuel Castells' &lt;em&gt;The Internet Galaxy&lt;/em&gt;, though perhaps it is more topical for a future post I've been brewing for a while. Has anyone read it? ...Anyway, this is my first pass at processing this stuff, hope it's not too scatterbrained (( Cory Doctrow does a better job &lt;a href="https://www.boingboing.net/2007/05/02/everything-is-miscel.html"&gt;reviewing the book&lt;/a&gt;.)).&lt;/p&gt;</content><category term="books"></category></entry><entry><title>And it begins again...</title><link href="//pirsquared.org/blog/hello-world.html" rel="alternate"></link><published>2007-07-20T01:04:03-07:00</published><updated>2007-07-20T01:04:03-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-07-20:/blog/hello-world.html</id><content type="html">&lt;p&gt;&lt;a href="http://www.pirsquared.org/blog/"&gt;&lt;img alt="screen cap" src="http://www.pirsquared.org/blog/images/blog.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So I finally bit the bullet and put up my own blog. It was just one of those wait and see things for a while, but now I find myself reading most things via rss feeds, so I really had no excuse not to move on from &lt;a href="http://www.livejournal.com/~pavelthegeek"&gt;my livejournal&lt;/a&gt;. I was afraid of abandoning my lj-friends - but &lt;a href="http://zade.scrump.net/"&gt;Yuan&lt;/a&gt; found a happy medium with cross-posting back to her lj (though now that she has an rss feed &lt;em&gt;I&lt;/em&gt; read her entries first in Thunderbird, sometimes days ahead of visiting my friends page)&lt;/p&gt;
&lt;p&gt;I'm still getting settled in, so this isn't quite live yet.&lt;/p&gt;
&lt;p&gt;Anyway, I've had a couple of entries on the back burner that I've been working on, and they feel serious enough to warrant having their own place, instead of being a part of a corpus I &lt;a href="http://pavelthegeek.livejournal.com/2001/08/27/"&gt;started almost six years ago&lt;/a&gt; (in high school, no less). More and more people I know host their own blogs and it's always nice to have a fresh start (though I've reposted a hand full of my most recent LJ entries to get a running start).&lt;/p&gt;</content><category term="technology"></category><category term="hello-world"></category></entry><entry><title>visualizing world statistics (Gapminder - Hans Rosling)</title><link href="//pirsquared.org/blog/visualizing-world-statistics-gapminder-hans-rosling.html" rel="alternate"></link><published>2007-07-03T11:04:00-07:00</published><updated>2007-07-03T11:04:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-07-03:/blog/visualizing-world-statistics-gapminder-hans-rosling.html</id><content type="html">&lt;p&gt;&lt;em&gt;Graph:&lt;/em&gt;  **CO2 emissions per capita versus Time **
&lt;img alt="CO2 vs Time - Gapminder" src="//www.pirsquared.org/images/screenshots/CO2_vs_Time_GapMinder.png"&gt;
Above: a plot I made using Gapminder. When I first tried this tool a few months ago, I was left confused and unimpressed. Luckily, since then, I've stumbled upon the following two explanatory videos (~20 min each).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ted.com/talks/view/id/92"&gt;last year&lt;/a&gt; and &lt;a href="http://www.ted.com/index.php/talks/view/id/140"&gt;this year&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After watching the videos, you can &lt;a href="http://tools.google.com/gapminder"&gt;play with Gapminder yourself&lt;/a&gt; as it is a web-based tool.&lt;/p&gt;
&lt;p&gt;More info and tool links at &lt;a href="http://www.gapminder.org/"&gt;gapminder.org&lt;/a&gt;.&lt;/p&gt;</content><category term="democracy"></category><category term="visualization"></category></entry><entry><title>View of the Golden Gate Bridge from I-house Cafe (google maps streetview)</title><link href="//pirsquared.org/blog/view-of-the-golden-gate-bridge-from-i-house-cafe-google-maps-streetview.html" rel="alternate"></link><published>2007-05-30T21:34:00-07:00</published><updated>2007-05-30T21:34:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-05-30:/blog/view-of-the-golden-gate-bridge-from-i-house-cafe-google-maps-streetview.html</id><content type="html">&lt;p&gt;goddamn google just doesn't know what to do with itself, anymore.&lt;/p&gt;
&lt;p&gt;&lt;a href="//maps.google.com/?ie=UTF8&amp;amp;om=1&amp;amp;layer=c&amp;amp;cbll=37.869711,-122.252181&amp;amp;cbp=1,254.052202760752,0.443760628001835,3&amp;amp;ll=37.887183,-122.242126&amp;amp;spn=0.037257,0.080338&amp;amp;z=14"&gt;&lt;img alt="View of the Golden Gate Bridge from I-house Cafe" src="//pirsquared.org/images/screenshots/ihouse%20golden%20gate%20bridge%20view.png"&gt;
View of the Golden Gate Bridge from I-house Cafe&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oh yeah, feel free to drag the little man around the blue highlighted streets, and then rotate / zoom in the overlaid photo. Here's the &lt;a href="http://maps.google.com/help/maps/streetview/index.html"&gt;official demo&lt;/a&gt; (cheesy video). In San Fracisco, almost every street is completely covered. They also did much of Mountain View, Palo Alto, San Jose, and all of Manhattan, that I've checked.&lt;/p&gt;
&lt;p&gt;Rediculous.&lt;/p&gt;</content><category term="life"></category></entry><entry><title>The practical and the ideological</title><link href="//pirsquared.org/blog/the-practical-and-the-ideological.html" rel="alternate"></link><published>2007-03-15T03:46:00-07:00</published><updated>2007-03-15T03:46:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-03-15:/blog/the-practical-and-the-ideological.html</id><content type="html">&lt;p&gt;&lt;a href="http://www.anunreasonableman.com/"&gt;&lt;img alt="An Unreasonable Man" src="//pirsquared.org/images/screenshots/anunreasonableman.png"&gt;&lt;/a&gt;
To start off with the latter: on Friday, after dinner with Robert and Julia at Zachary's, we went to a screening of &lt;a href="http://www.anunreasonableman.com/"&gt;An Unreasonable Man&lt;/a&gt; - which filled the gap in my knowledge of Ralph Nader between &lt;em&gt;Unsafe at Any Speed&lt;/em&gt; / Nader's Raiders and the 2000 election. Fascinating balanced documentary. You can still see it this week, but it'll only be around the theatres a short while.&lt;/p&gt;
&lt;p&gt;The practical:  After getting lunch with Robert and Jon on Saturday, I got the chance to hear recent UCSB alum Logan Green talk about &lt;a href="http://www.zimride.com"&gt;Zimride&lt;/a&gt;, this new cool webapp he's just put together. Carpooling made easy and safe. Here's what it looks like:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20070417015548/https://www.zimride.com/"&gt;&lt;img alt="zimride - carpooling made easy" src="https://web.archive.org/web/20090729062215if_/http://zimride.com/images/logo.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://web.archive.org/web/20070417015548/https://www.zimride.com/"&gt;&lt;img alt="" src="//pirsquared.org/images/screenshots/zimride.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="//pirsquared.org/images/screenshots/zimride_add.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="//pirsquared.org/images/screenshots/zimride_offer.png"&gt;&lt;/p&gt;
&lt;p&gt;Zimride integrates with facebook, so you actually get to know something about your potential drivers/hitchers, and they might even end up being someone you know! Moreover, you can advertise your ride via those facebook stalker feeds.
&lt;img alt="" src="//pirsquared.org/images/screenshots/zimride_facebook.png"&gt;&lt;/p&gt;</content><category term="democracy"></category><category term="greens"></category></entry><entry><title>SLC punk'd!</title><link href="//pirsquared.org/blog/slc-punkd.html" rel="alternate"></link><published>2007-02-22T07:29:00-08:00</published><updated>2007-02-22T07:29:00-08:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-02-22:/blog/slc-punkd.html</id><content type="html">&lt;p&gt;I'm going to a &lt;a href="//cosyne.org/Cosyne_07"&gt;conference&lt;/a&gt; for a week in Utah. It'll be my first time in Park City, and my &lt;a href="//pavelthegeek.livejournal.com/2003/08/23/"&gt;second time&lt;/a&gt; in Salt Lake City. Here's a map of downtown SLC, color-coded to emphasize the insanity:&lt;/p&gt;
&lt;p&gt;&lt;img alt="SLC Punk'd (by Paul Ivanov)" src="//pirsquared.org/images/screenshots/SLC_punkd.png"&gt;&lt;/p&gt;
&lt;p&gt;**worst. planning. ever. **
(...and I don't buy &lt;a href="//saltlakecity.about.com/library/weekly/98art/aa031698.htm"&gt;their propagnda&lt;/a&gt; - next to the green arrow on the map above, you could be on N W Temple, between W N Temple and W S Temple [or is it E S Temple?])&lt;/p&gt;</content><category term="life"></category><category term="visualization"></category></entry><entry><title>coming to you live from my desk...</title><link href="//pirsquared.org/blog/coming-to-you-live-from-my-desk.html" rel="alternate"></link><published>2007-01-22T07:43:00-08:00</published><updated>2007-01-22T07:43:00-08:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-01-22:/blog/coming-to-you-live-from-my-desk.html</id><content type="html">&lt;p&gt;So I've finally gotten a new phone and my camera that had been flakey for the last year decided to start working properly again - and I am happy with technology! In celebration I decided to take some &lt;a href="http://www.flickr.com/photos/pivanov/tags/ihouse/"&gt;pictures of my room&lt;/a&gt; (messy edition)
&lt;img alt="" src="http://farm1.static.flickr.com/131/365669284_3058449fec_o.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I imported these pictures using &lt;a href="http://f-spot.org/Main_Page"&gt;F-Spot&lt;/a&gt;, which has a decent tagging interface that I should make use of to catalogue a bunch of old photos.  F-Spot also happily resized and exported them to Flickr, tags and all (other stuff also supported). Hopefully this also means I'll start taking pictures again.&lt;/p&gt;</content><category term="life"></category><category term="hello-world"></category></entry><entry><title>A picture of me and some of my housemates...</title><link href="//pirsquared.org/blog/a-picture-of-me-and-some-of-my-housemates.html" rel="alternate"></link><published>2007-01-13T08:24:00-08:00</published><updated>2007-01-13T08:24:00-08:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-01-13:/blog/a-picture-of-me-and-some-of-my-housemates.html</id><content type="html">&lt;p&gt;&lt;img alt="" src="http://ihouse.berkeley.edu/jpg/2006FallResidents.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I-house is a pretty fun place to live (I'm off on the right side).&lt;/p&gt;
&lt;p&gt;P.S. Ñ Ð½Ð°ÑÑ‚ÑƒÐ¿Ð°ÑŽÑ‰Ð¸Ð¼ ÑÑ‚Ð°Ñ€Ñ‹Ð¼ Ð½Ð¾Ð²Ñ‹Ð¼ Ð³Ð¾Ð´Ð¾Ð¼! happy &lt;a href="http://en.wikipedia.org/wiki/Old_New_Year"&gt;old new year!&lt;/a&gt;&lt;/p&gt;</content><category term="life"></category><category term="berkeley"></category></entry><entry><title>Changelogs with dates (!) + gui goodness</title><link href="//pirsquared.org/blog/changelogs-with-dates-gui-goodness.html" rel="alternate"></link><published>2007-01-04T03:31:00-08:00</published><updated>2007-01-04T03:31:00-08:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2007-01-04:/blog/changelogs-with-dates-gui-goodness.html</id><content type="html">&lt;p&gt;&lt;em&gt;&lt;strong&gt;... please date your software releases ...&lt;/strong&gt;&lt;/em&gt; I've been trying out a lot of new software lately, and it's the most frustrating thing in the world to not be able to figure out &lt;strong&gt;WHEN&lt;/strong&gt; a particular version came out.&lt;/p&gt;
&lt;p&gt;Sure, there's a changelog that tells me all the neat bug fixes from the last version, but what good does that do me if I can't tell whether the software was last updated 8 years ago or 8 days ago? It's such a simple thing, but I can't believe at the number of projects out there that have no mention of release dates on their website.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;... changing topics... &lt;/em&gt;&lt;/strong&gt; Anyone have a gui &lt;a href="http://subversion.tigris.org/"&gt;svn&lt;/a&gt; client they particularly like? I've started playing with &lt;a href="http://esvn.umputun.com/"&gt;eSvn&lt;/a&gt; (0.7.0 testing version), it's clean and simple (someone else came to the &lt;a href="http://swoes.blogspot.com/2006/04/subversion-gui-for-linux.html"&gt;same conclusion&lt;/a&gt;). It looks like this: &lt;img alt="eSvn 0.7.0 screenshot" src="//pirsquared.org/images/screenshots/eSvn0.7.0.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://subcommander.tigris.org/"&gt;Subcommander&lt;/a&gt; has a neat looking &lt;a href="http://subcommander.tigris.org/images/screenshots-subcommander.png"&gt;log graph&lt;/a&gt; (bottom), and &lt;a href="http://www.alwins-world.de/wiki/programs/kdesvn"&gt;kdesvn&lt;/a&gt; has a &lt;a href="http://www.alwins-world.de/wiki/programs/kdesvn/ScreenShots?action=AttachFile&amp;amp;do=get&amp;amp;target=revision_tree.jpg"&gt;history browser&lt;/a&gt;, anyone use stuff like that?&lt;/p&gt;
&lt;p&gt;I've also tried &lt;a href="http://subclipse.tigris.org/"&gt;subclipse&lt;/a&gt;. Yep, I finally bit the bullet and started trying &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; and other GUI stuff, like &lt;a href="http://sources.redhat.com/insight/"&gt;Inisght&lt;/a&gt; (gdb gui), although I continue to live in &lt;a href="http://www.vim.org"&gt;Vim&lt;/a&gt; (which has &lt;a href="http://vim.sourceforge.net/scripts/script.php?script_id=90"&gt;an CVS/SVN integration plugin&lt;/a&gt; I've found useful)&lt;/p&gt;</content><category term="technology"></category></entry><entry><title>damn you, amazon.</title><link href="//pirsquared.org/blog/damn-you-amazon.html" rel="alternate"></link><published>2006-12-22T04:29:00-08:00</published><updated>2006-12-22T04:29:00-08:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2006-12-22:/blog/damn-you-amazon.html</id><content type="html">&lt;p&gt;So I used to go to the Super Crown by my house all the time when I was in high school. It became sort of a ritual for me, whenever I was feeling in the dumps, not getting any work done, or just needed a break and a walk to refresh my mind, I'd head out, usually around 9 o'clock at night, and spend a few hours sitting on their comfortable couch seats (or on the floor, when those were occupied) reading the first few chapters of some book, usually technologically related. The only one I remember finishing entirely at Crown, in several visits, was &lt;em&gt;&lt;a href="http://www.amazon.com/ENIAC-Triumphs-Tragedies-Worlds-Computer/dp/0802713483/sr=8-1/qid=1166757417/"&gt;ENIAC: The Triumphs and Tragedies of the World's First Computer&lt;/a&gt;&lt;/em&gt;, though I know I peeked into a bunch of others on telecommunications, AI, Unix, CS, etc. My        thinking was that it's good to expose myself to just a little bit of a something that I didn't know anything about, and I'd walk away refreshed by the new knowledge. I treated the bookstore as a library       (incidentally, the French word for bookstore is &lt;em&gt;librairie&lt;/em&gt;, so you can't blame me there), and even took little notes of the things I had learned along the way, in part so that I could return to the page I read up to the previous time. I bought books, there, too, when I had the cash - Cliff Stoll, Steven Levy, Robert Pirsig, Daniel Quinn, Tim Berners-Lee, many others, too; I usually keep the receipt in the    book (and would write the same sorts of notes on the receipts).&lt;/p&gt;
&lt;p&gt;It became a really familiar place, the same classical music, the same new book smells. I never really had to talk to anyone, or say anything, so it very much became a place where I could go and clear my     head, just sort of process my thoughts. Then it went out of business and closed, which really made me sad. Luckily, Tower Books, nearby, had just started operating, and though it didn't have as large of a     selection, I migrated over there, and got used to the music, atmosphere, and the staff there. So Tower, too, became familiar with time, and they were open till midnight, which suited my fancy more. Going down there at night became a ritual, whenever I was feeling uninspired, I'd just head over to there and immerse myself in some new book, if only for a few hours. I think I'm kind of different that way. If you've   ever been in a bookstore with me, you'll know that I always want to stick around for a while, even though I usually have no specific book in mind, I just like to go and sit and read something new for a while. For example, I always like to drop by Borders whenever I'm on University in Palo Alto, but also usually overlook that whoever it is that I'm with, whether it's Elaine, or Philip, or Jon, doesn't have the same approach to visiting bookstores.&lt;/p&gt;
&lt;p&gt;Cody's Books on Telegraph closed earlier this year, though Moe's is still around. Now Tower's closing up shop, I just walked around the all of the empty shelves and saw very few books that'd be of any       interest to me. Ended up picking up two DVDs: &lt;a href="http://www.amazon.com/Making-Gay-Lesbian-Community-Stonewall/dp/B0001US7TU/sr=8-1/qid=1166759178/"&gt;Before Stonewall&lt;/a&gt;, and &lt;a href="http://www.amazon.com/Brother-Sergei-Bodrov-Jr/dp/B00006LPEK/sr=1-2/qid=1166759308/"&gt;Ð‘Ñ€Ð°Ñ‚&lt;/a&gt; (Brother) for $6 each.  It's really makes me uncomfortable and sad knowing that I won't have that little place to escape to,         anymore. I'm not a big fan of changes like these.&lt;/p&gt;</content><category term="books"></category></entry><entry><title>Todd Chretien, Greens, Choice Voting</title><link href="//pirsquared.org/blog/todd-chritien-greens-choice-voting.html" rel="alternate"></link><published>2006-10-18T04:29:00-07:00</published><updated>2006-10-18T04:29:00-07:00</updated><author><name>Paul Ivanov</name></author><id>tag:pirsquared.org,2006-10-18:/blog/todd-chritien-greens-choice-voting.html</id><content type="html">&lt;p&gt;Sentence long update on life: I'm at &lt;a href="http://vision.berkeley.edu"&gt;Berkeley studying Vision Science&lt;/a&gt; now.&lt;/p&gt;
&lt;p&gt;I've started getting involved with the (currently small) Campus Greens organization (which meets Mondays at 7:10 in 200 Wheeler).&lt;/p&gt;
&lt;p&gt;So today I heard &lt;a href="http://www.todd4senate.org"&gt;Todd Chretien&lt;/a&gt;, Green senatorial candidate speak to a group of about 30 as part of the ASUC Speaker Series. Todd titled his talk "Why Students Should Never, Ever Vote for the Democrats," which I think is somewhat unfortunate. Todd has an eloquent platform and I share a lot of the same views, but I also think that the title incites the type of reaction that eliminates any possibility for reasonable discussion or discourse.&lt;/p&gt;
&lt;p&gt;I think that people don't want to listen to you if you insult them, or just say something shocking - the novelty (if any) quickly wears off (it's taken me a while to figure this out, but I think I learned the difficulty in trying to actively engage those who support the Democrats when talking (ranting?) to &lt;a href="http://madcow23sg.livejournal.com"&gt;Janet&lt;/a&gt; on the streets of Brussels over the summer).&lt;/p&gt;
&lt;p&gt;I think that we need more boring nitty-gritty politics, because no one will hand over the helm to people with big ideas (even if they &lt;em&gt;are&lt;/em&gt; the right ideas). The big picture is important, but it has to be negotiated with real, tangible, local progress.&lt;/p&gt;
&lt;p&gt;Todd gave a short run through of his top three issues ( war in Iraq, education, the two party system), and then opened it up for Q &amp;amp; A. In answering the questions, he covered a lot of ground in both domestic and foreign policy, but I felt like it was a discussion of issues larger than those someone who admitted he had no chance of winning could hope to influence....&lt;/p&gt;
&lt;p&gt;So as the last question for the night, after expressing these sentiments I asked what we could do locally, that's within our power, mentioning current &lt;a href="http://www.fairvote.org/pr/choiceintro.htm"&gt;choice voting&lt;/a&gt; efforts in &lt;a href="http://davischoicevoting.org"&gt;Davis&lt;/a&gt; and &lt;a href="http://www.oaklandirv.org/"&gt;Oakland&lt;/a&gt;. Unfortunately, Todd stuck to his anti-war protest-in-the-streets approach (even taking an outlandish pot shot at proportional representation by mentioning something about Hitler getting elected).&lt;/p&gt;
&lt;p&gt;Most of my life I, too, have been a big ideas person, but I can't say I've accomplished much with them, which is why I'm trying something new...&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;By the way, &lt;a href="http://hajenso.livejournal.com"&gt;Kenji&lt;/a&gt; and &lt;a href="http://codetoad.livejournal.com"&gt;Philip&lt;/a&gt;, you continued work on important matters has been really inspiring.Here's my letter to the editor regarding choice voting that never got printed in the Davis Enterprise:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Until I came to UC Davis, I had never realized that there &lt;em&gt;could&lt;/em&gt; be different voting systems. Choice voting is a way of reaching a majority (greater than 50%) consensus.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Choice voting allows everyone to vote their conscience without the fear of having your vote "wasted." After the polls close, if your top-ranked candidate, Alice, has the least amount of votes, she is eliminated and your vote transfers to your next choice, Bob, in your order of preference. This process ("instant run-off") continues until candidates reach enough votes to be elected (the threshold). This consensus building mechanism ensures that the elected officials will represent the greatest possible proportion of the voters.&lt;/p&gt;
&lt;p&gt;Contrast this with the current system: candidate Mallory and Minnie, representing a minority of the population could get elected when multiple similar candidates (Alice, Bob, Chris, and Debra) representing the viewpoints of the majority of the population split the vote between one other.&lt;/p&gt;
&lt;p&gt;This would not happen under choice voting, because when Alice is eliminated, those votes would go to the next choices of her supporters. This would provide more votes for the remaining majority candidates, ensuring that one of them gets elected.&lt;/p&gt;
&lt;p&gt;I encourage Davis voters to vote yes on Measure L this November so that the City can continue looking into this effective system.&lt;/p&gt;
&lt;p&gt;Paul Ivanov
UC Davis Class of 2005&lt;/p&gt;
&lt;p&gt;(cute &lt;a href="http://www.betterballotcampaign.org/BBC/video"&gt;choice voting promotional video&lt;/a&gt;)&lt;/p&gt;</content><category term="democracy"></category><category term="greens"></category></entry></feed>