<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Writing on Noetic Nought</title>
    <link>https://punchagan.muse-amuse.in/tags/writing/</link>
    <description>Recent content in Writing on Noetic Nought</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <copyright>© 2006-2026 CC-BY-SA-4.0</copyright>
    <lastBuildDate>Wed, 13 Nov 2024 00:17:00 +0530</lastBuildDate>
    <atom:link href="https://punchagan.muse-amuse.in/tags/writing/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Responsive Auto Export for Org Hugo</title>
      <link>https://punchagan.muse-amuse.in/blog/responsive-auto-export-for-org-hugo/</link>
      <pubDate>Wed, 13 Nov 2024 00:17:00 +0530</pubDate>
      <guid>https://punchagan.muse-amuse.in/blog/responsive-auto-export-for-org-hugo/</guid>
      <description>&lt;p&gt;I use &lt;a href=&#34;https://github.com/kaushalmodi/ox-hugo/&#34;&gt;ox-hugo&lt;/a&gt; to &lt;a href=&#34;https://punchagan.muse-amuse.in/blog/deploying-hugo-drafts-simplified/&#34;&gt;write blog posts&lt;/a&gt; in org-mode and publish them using &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;. I&#xA;&lt;a href=&#34;https://punchagan.muse-amuse.in/blog/why-i-like-org-as-a-markup/&#34;&gt;enjoy using org-mode&lt;/a&gt; for any writing that I do, including blog posts (when I am&#xA;able to get myself to write them). After a long hiatus, I&amp;rsquo;ve been trying to get&#xA;back to blogging, as this post might have given away. But, ox-hugo&amp;rsquo;s &lt;a href=&#34;https://ox-hugo.scripter.co/doc/auto-export-on-saving/&#34;&gt;auto&#xA;export&lt;/a&gt; seemed much slower than I remember it being.&lt;/p&gt;&#xA;&lt;p&gt;Each time I hit save on my &lt;code&gt;blog-posts.org&lt;/code&gt; file, Emacs gets busy for about&#xA;10ish seconds exporting the post to Hugo markdown. And this is annoying because&#xA;I tend to hit &lt;code&gt;save-buffer&lt;/code&gt; multiple times while writing in &lt;code&gt;Emacs&lt;/code&gt; &amp;ndash; thanks,&#xA;muscle memory!&lt;/p&gt;&#xA;&lt;h2 id=&#34;enter-emacs-profiler&#34;&gt;Enter Emacs profiler&lt;/h2&gt;&#xA;&lt;p&gt;I was on a flight and had some time to dig into this. If I was online, I&#xA;probably would have looked through the README and/or the issue tracker, but I&#xA;&lt;a href=&#34;https://punchagan.muse-amuse.in/blog/how-i-learnt-to-use-emacs-profiler/&#34;&gt;jumped in&lt;/a&gt; with the handy &lt;a href=&#34;https://www.gnu.org/software/emacs/manual/html_node/elisp/Profiling.html&#34;&gt;Emacs profiler&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The profiler-report showed that a big chunk of time was being spent in&#xA;&lt;code&gt;org-id-update-id-locations&lt;/code&gt; even before the actual export started. And then,&#xA;during the export, a bulk of the time was spent in&#xA;&lt;code&gt;org-hugo--get-pre-processed-buffer&lt;/code&gt;. Once I knew the problem areas, I started&#xA;poking around in the &lt;code&gt;ox-hugo&lt;/code&gt; code to &amp;ldquo;fix&amp;rdquo; these issues.&lt;/p&gt;&#xA;&lt;h2 id=&#34;turn-off-org-id-location-update&#34;&gt;Turn off Org ID location update&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;org-id-update-id-locations&lt;/code&gt; scans a bunch of org-mode files and stores a&#xA;mapping of all the IDs of subtrees to their filenames. If you have a lot of org&#xA;subtrees this can take a while, even if none of them actually have IDs. It&#xA;turns out that I didn&amp;rsquo;t have any ID properties set, and this caused the &lt;a href=&#34;https://github.com/kaushalmodi/ox-hugo/blob/98421a1298adc6d80ce21b3cb5c951af818b27bf/ox-hugo.el#L4881-L4882&#34;&gt;update&#xA;function to run before every export&lt;/a&gt;!&lt;/p&gt;&#xA;&lt;p&gt;I simply added a new ID property on one of the subtrees in my blog-posts file&#xA;to prevent the ID updation from running on every export! I&amp;rsquo;m not sure how a&#xA;stale &lt;code&gt;org-id-locations&lt;/code&gt; value affects cross links, but at this stage of&#xA;writing I don&amp;rsquo;t care about the cross links. (spoiler: The next hack actually&#xA;nullifies any impact a stale value might have had!)&lt;/p&gt;&#xA;&lt;p&gt;Cutting down auto export time by 4-5 seconds is great! But, I&amp;rsquo;m still not happy&#xA;to wait for 5-6 seconds in the middle of writing my posts. Let&amp;rsquo;s look at the&#xA;other hotspot &amp;ndash; the buffer preprocessing!&lt;/p&gt;&#xA;&lt;h2 id=&#34;turn-off-buffer-preprocessing-maybe&#34;&gt;Turn off buffer preprocessing, maybe?&lt;/h2&gt;&#xA;&lt;p&gt;Currently, I don&amp;rsquo;t have any cross links between posts in my org-mode source.&#xA;So, I can turn off this feature completely by setting&#xA;&lt;code&gt;org-hugo--preprocess-buffer&lt;/code&gt; to &lt;code&gt;nil&lt;/code&gt;. Viola! Hitting &lt;code&gt;save-buffer&lt;/code&gt; doesn&amp;rsquo;t&#xA;freeze my Emacs any more. I can compose &amp;ldquo;100s of blog posts&amp;rdquo;™ in a flurry! ;)&lt;/p&gt;&#xA;&lt;p&gt;But, if I&amp;rsquo;m going to have these &amp;ldquo;100s of blog posts&amp;rdquo;, wouldn&amp;rsquo;t it be better to&#xA;have cross links? But, with preprocessing turned off when there are&#xA;cross-links, the &amp;ldquo;auto-export and build&amp;rdquo; workflow breaks. The variable&#xA;&lt;code&gt;org-hugo--preprocess-buffer&lt;/code&gt; MUST be non-nil to produce posts with &lt;strong&gt;valid&lt;/strong&gt;&#xA;cross-links. If not, the exported markdown file processed by &lt;code&gt;hugo&lt;/code&gt; ends up&#xA;having broken cross-links, which crashes &lt;code&gt;hugo serve&lt;/code&gt; and/or &lt;code&gt;hugo build&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Unsetting and setting the &lt;code&gt;org-hugo--preprocess-buffer&lt;/code&gt; variable for the&#xA;writing vs publishing phase, respectively, isn&amp;rsquo;t an ergonomic workflow. It&amp;rsquo;s&#xA;not an improvement over disabling and enabling the auto-export mode as needed.&#xA;I want to enjoy auto export with Hugo&amp;rsquo;s &lt;a href=&#34;https://gohugo.io/getting-started/usage/#livereload&#34;&gt;live reload&lt;/a&gt; feature.&lt;/p&gt;&#xA;&lt;h2 id=&#34;moar-workaround&#34;&gt;Moar workaround!&lt;/h2&gt;&#xA;&lt;p&gt;Looking through the code some more, I learnt &lt;a href=&#34;https://github.com/kaushalmodi/ox-hugo/blob/98421a1298adc6d80ce21b3cb5c951af818b27bf/ox-hugo.el#L2723&#34;&gt;&lt;code&gt;org-hugo-link&lt;/code&gt;&lt;/a&gt; first uses a&#xA;custom export handler, if one exists for a link&amp;rsquo;s protocol. I decided to piggy&#xA;back on this functionality and made up &lt;code&gt;hugo:&lt;/code&gt; protocol for cross-links.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;hugo&lt;/code&gt; link simply contains the &lt;code&gt;EXPORT_FILE_NAME&lt;/code&gt; of the linked blog post&#xA;i.e., name of the exported markdown file (without the .md extension) as the&#xA;&amp;lsquo;path&amp;rsquo; of the link. The custom protocol export handler can then generates a&#xA;&lt;code&gt;relref&lt;/code&gt; shortcode for Hugo to process in the exported markdown file.&lt;/p&gt;&#xA;&lt;p&gt;This nicely works around the need to preprocess my entire &lt;code&gt;blog-posts.org&lt;/code&gt;&#xA;buffer to generate &lt;strong&gt;valid&lt;/strong&gt; cross-links!&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-emacs-lisp&#34; data-lang=&#34;emacs-lisp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;org-link-set-parameters&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;hugo&amp;#34;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;:export&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;#&amp;#39;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;pc/org-hugo-link-export-to-md&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Export Hugo blog link to markdown file&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;defun&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;pc/org-hugo-link-export-to-md&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;desc&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;backend&lt;/span&gt; &lt;span class=&#34;kp&#34;&gt;&amp;amp;optional&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s&#34;&gt;&amp;#34;Export a link to a Hugo blog link in markdown format.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;message&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;format&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;path: %s, desc: %s, backend: %s&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;desc&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;backend&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cond&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;eq&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;backend&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;md&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;equal&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;org-export-current-backend&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;&amp;#39;hugo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;format&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;[%s]({{&amp;lt; relref \&amp;#34;%s\&amp;#34; &amp;gt;}})&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;desc&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;error&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Cannot export Hugo link to non-Hugo backend&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;error&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Cannot export Hugo link to non-Hugo backend&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;outro&#34;&gt;Outro&lt;/h2&gt;&#xA;&lt;p&gt;I made a &lt;a href=&#34;https://github.com/punchagan/dot-doom/blob/c45f01e6b20275ce1df943855626af5c40cb626c/config.el#L541-L564&#34;&gt;simple helper&lt;/a&gt; to make it easier to insert these cross-links with the&#xA;&lt;code&gt;hugo:&lt;/code&gt; protocol. It simply looks through all the headlines with an&#xA;&lt;code&gt;EXPORT_FILE_NAME&lt;/code&gt; property, and allows it to be inserted as a link with the&#xA;&lt;code&gt;hugo:&lt;/code&gt; protocol.&lt;/p&gt;&#xA;&lt;p&gt;Now, cross-linking posts and publishing posts with cross-links are both a&#xA;breeze. Stay tuned for the &amp;ldquo;100s of blog posts&amp;rdquo; ™ I&amp;rsquo;m going to write!&lt;/p&gt;&#xA;&lt;div style=&#34;font-size:small;&#34; class=&#34;reviewers&#34;&gt;&#xA;&lt;p&gt;Thanks to &lt;a href=&#34;http://baali.muse-amuse.in&#34;&gt;Shantanu&lt;/a&gt; and &lt;a href=&#34;https://x.com/kamalx&#34;&gt;Kamal&lt;/a&gt; for reading drafts of this post.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>2018 in Review</title>
      <link>https://punchagan.muse-amuse.in/blog/2018-in-review/</link>
      <pubDate>Thu, 17 Jan 2019 15:02:00 +0530</pubDate>
      <guid>https://punchagan.muse-amuse.in/blog/2018-in-review/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s my review of 2018 - my first successful annual review. I remember wanting&#xA;to do something like this, a couple of times before too. This time, I managed to&#xA;get started and wrap it up!&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been inspired to write one by a some reviews that I read this year &amp;ndash; some&#xA;of them do it every year.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Sher Minn&amp;rsquo;s &lt;a href=&#34;http://piratefsh.github.io/2018/12/25/2018-retrospective.html&#34;&gt;visual retorospective&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Nat&amp;rsquo;s &lt;a href=&#34;https://writing.natwelch.com/post/685&#34;&gt;month-wise review&lt;/a&gt;, with a review of 2018 goals and a bunch of goals&#xA;for 2019.&lt;/li&gt;&#xA;&lt;li&gt;Julia Evans has an &lt;a href=&#34;https://jvns.ca/blog/2018/12/23/2018--year-in-review/&#34;&gt;annual review&lt;/a&gt; with a bunch of &amp;ldquo;conclusions&amp;rdquo; listing what&#xA;worked in 2018.&lt;/li&gt;&#xA;&lt;li&gt;James Clear answers &lt;a href=&#34;https://jamesclear.com/2018-annual-review&#34;&gt;three questions every year&lt;/a&gt; - what went well, what didn&amp;rsquo;t,&#xA;and what were the learnings.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://sachachua.com/blog/2018/08/turning-35-life-as-a-34-year-old/&#34;&gt;Sacha Chua&lt;/a&gt;&amp;rsquo;s reviews were one of the earliest reviews that I read, and they&#xA;inspired so much awe! I may not be able to do as much quantified-self type&#xA;posts as her, any time soon, but I love them!&lt;/li&gt;&#xA;&lt;li&gt;Buster Benson does annual reviews on his &lt;a href=&#34;https://medium.com/@buster/42-dig-deeper-e2278d1fe015&#34;&gt;birthday every year&lt;/a&gt;. He gives himself&#xA;a motto to live-by, each year.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;My review isn&amp;rsquo;t as systematic as any of these. But, I have some inspiring&#xA;examples in front of me to aspire to. Hope this will start something that I can&#xA;keep doing annually from now, if not more frequently.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve divided my review into a few different areas - based mostly the time I have&#xA;spent on them, how important I feel they are, and the extent of notes I have in&#xA;those areas.&lt;/p&gt;&#xA;&lt;h2 id=&#34;work&#34;&gt;Work&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I continue to work on &lt;a href=&#34;https://github.com/akvo/akvo-rsr/&#34;&gt;RSR&lt;/a&gt; at &lt;a href=&#34;https://akvo.org/&#34;&gt;Akvo&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The most challenging project was to wrangle a legacy permissions system that&#xA;worked at an organization level to give some kind of user level permissions.&#xA;The project was plagued with incomplete communication of requirements from our&#xA;partners, failure to understand the complexity of the legacy code, and weird&#xA;bugs manifesting in even weirder ways. We eventually delivered something, but&#xA;I&amp;rsquo;m not at all happy with the solution, how long it took and how the whole&#xA;project felt.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The company has been in a cost-cutting mode, and has been rethinking the way&#xA;the products are positioned - &lt;a href=&#34;https://akvo.org/blog/reflecting-learning-and-connecting-in-2019/&#34;&gt;transitioning more into a single&#xA;solution/experience for our partners&lt;/a&gt;. This makes a lot of sense &amp;ndash; the focus&#xA;shifts from building tools to solving problems, which is great! But, I wasn&amp;rsquo;t&#xA;particularly happy about how much RSR features in these conversations. Towards&#xA;the end of the year, our team has managed to get more conversations going on&#xA;involving RSR, but we need more.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;A couple of friends asked me if I&amp;rsquo;d want to work for their companies, but I&#xA;decided not to. But, these were opportunities to think more about what I want&#xA;out of my job and the work I do. This is a work in progress.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I did some mentoring at one friend&amp;rsquo;s company, and got to know the team and&#xA;their work pretty well.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I gave an interview at a company that I came across at PyCon which went&#xA;horribly, partially because I didn&amp;rsquo;t prepare well and partially because of&#xA;interview jitters. I was expecting a better interview experience from them,&#xA;though, given how much I liked their team culture, etc.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I also happened to take my first ever front-end interviews, along with a team&#xA;mate. I really liked how he led the interviews, and made the interview&#xA;candidates feel comfortable. I learned a thing or two, including the fact that&#xA;I don&amp;rsquo;t know a lot of things that people with a more structured and systematic&#xA;approach to learning front-end development would know.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I didn&amp;rsquo;t attend too many events this year, like always. But, I really enjoyed&#xA;PyCon - especially the Keynotes by &lt;a href=&#34;https://www.youtube.com/watch?v=ls1jva653bc&#34;&gt;Sidu Ponnappa&lt;/a&gt; and &lt;a href=&#34;https://www.youtube.com/watch?v=-4fzFKihmJw&#34;&gt;Armin Ronacher&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;side-projects&#34;&gt;Side projects&lt;/h2&gt;&#xA;&lt;p&gt;I worked on a bunch of side-projects this year, some of them abandoned, some&#xA;completed and found useful, some abandoned after the first version turned out to&#xA;be not so useful. Most of the stuff was &amp;ldquo;webby&amp;rdquo;, and unsurprisingly a bunch of&#xA;my side-projects were Ultimate related.&lt;/p&gt;&#xA;&lt;dl&gt;&#xA;&lt;dt&gt;Zulip&lt;/dt&gt;&#xA;&lt;dd&gt;I spent a quite a bit of my spare time between about March and&#xA;September contributing to &lt;a href=&#34;https://zulipchat.com/&#34;&gt;Zulip&lt;/a&gt; &amp;ndash; mainly as a mentor on the&#xA;&lt;a href=&#34;https://github.com/zulip/zulip-terminal&#34;&gt;zulip-terminal&lt;/a&gt; project, apart from some minor contributions around&#xA;improving setting up of the dev environment for the &lt;a href=&#34;https://github.com/zulip/zulip-terminal&#34;&gt;zulip-server&lt;/a&gt;&#xA;project. I also facilitated a &lt;a href=&#34;https://in.pycon.org/cfp/devsprint-2018/proposals/zulip-sprint~eXlAe/&#34;&gt;Zulip sprint&lt;/a&gt; during PyCon at Hyderabad.&#xA;&lt;p&gt;I also got to attend the Zulip India Summit! It was great to meet a&#xA;whole bunch of Zulip contributors. I especially enjoyed the&#xA;conversations with and the presentations by Tim and Greg, mostly&#xA;around developer productivity.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m really impressed and inspired by the amount of care and effort&#xA;that is put into stream-lining the process of contributing to the&#xA;project, and the emphasis on developer productivity.&lt;/p&gt;&#xA;&lt;p&gt;I played around with a little bit of React Native development, but&#xA;wasn&amp;rsquo;t able to devote much time to it. I&amp;rsquo;d like to play around some&#xA;more with it, this year.&lt;/p&gt;&#xA;&lt;/dd&gt;&#xA;&lt;dt&gt;Find Playo Venue&lt;/dt&gt;&#xA;&lt;dd&gt;I wrote a &lt;a href=&#34;https://punchagan.github.io/playo-find-venue/&#34;&gt;simple map based tool&lt;/a&gt; to find the most suitably&#xA;located Playo venue with good ratings, when some of my friends and I were&#xA;playing a lot of badminton together. I still use it sometimes, but we&amp;rsquo;ve&#xA;mostly figured out our &amp;ldquo;favorite&amp;rdquo; venues.&lt;/dd&gt;&#xA;&lt;dt&gt;moditweetarchive&lt;/dt&gt;&#xA;&lt;dd&gt;I built a &lt;a href=&#34;http://moditweetarchive.herokuapp.com/&#34;&gt;site&lt;/a&gt; inspired by &lt;a href=&#34;http://trumptwitterarchive.com/&#34;&gt;this Trump tweet archive&lt;/a&gt; for&#xA;Modi&amp;rsquo;s tweets. I used &lt;a href=&#34;https://plot.ly/products/dash/&#34;&gt;Dash&lt;/a&gt; to build it, and it was quite fun, despite a few&#xA;annoyances. This tweet archive, though, isn&amp;rsquo;t as interesting as the Trump&#xA;archive, since the tweets are more calculated and strategic. But, a few&#xA;things could be added to make it more useful.&#xA;&lt;p&gt;The repo is private as of now, but I&amp;rsquo;m happy to share the code, if anyone&#xA;is interested.&lt;/p&gt;&#xA;&lt;/dd&gt;&#xA;&lt;dt&gt;Blaggregator&lt;/dt&gt;&#xA;&lt;dd&gt;I spent a couple of weekends maintaining &lt;a href=&#34;https://blaggregator.recurse.com/about/&#34;&gt;Blaggregator&lt;/a&gt;. I&#xA;updated Django to 1.11.x which is also something I did on Akvo&#xA;RSR (my work project), later during the year. I also worked on&#xA;making the crawl faster by handling dead blogs better, etc.&lt;/dd&gt;&#xA;&lt;dt&gt;weblogviz&lt;/dt&gt;&#xA;&lt;dd&gt;I tried to get started with learning some &lt;a href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;, and as an&#xA;exercise, I started building a &lt;a href=&#34;https://github.com/punchagan/weblogviz&#34;&gt;tool to analyze Apache logs&lt;/a&gt; and&#xA;show some useful stats.&lt;/dd&gt;&#xA;&lt;dt&gt;Org-mode to Zulip helpers&lt;/dt&gt;&#xA;&lt;dd&gt;I wrote some &lt;a href=&#34;https://github.com/punchagan/zulip-helpers.el&#34;&gt;Emacs helpers to post to Zulip&lt;/a&gt;. I&amp;rsquo;m&#xA;quite happy with being able to post longer messages from inside Emacs -&#xA;this lets me retain a copy of things like my checkins or interesting links&#xA;in my notes/journal file.&lt;/dd&gt;&#xA;&lt;dt&gt;aradhana.org&lt;/dt&gt;&#xA;&lt;dd&gt;I tried to help a friend of mine build a newer website for&#xA;&lt;a href=&#34;http://www.aradhana.org/&#34;&gt;aradhana.org&lt;/a&gt;, and spent about a couple of days on it. But,&#xA;there were other bigger problems which needed attention from&#xA;my friends, and this site just fell by the wayside.&lt;/dd&gt;&#xA;&lt;dt&gt;Abandoned projects&lt;/dt&gt;&#xA;&lt;dd&gt;There are bunch of other projects that I&amp;rsquo;ve abandoned. I&#xA;may end up spending some time looking into them, this year.&lt;/dd&gt;&#xA;&lt;/dl&gt;&#xA;&lt;h3 id=&#34;ultimate-related-projects&#34;&gt;Ultimate related projects&lt;/h3&gt;&#xA;&lt;dl&gt;&#xA;&lt;dt&gt;SOTG Calculator&lt;/dt&gt;&#xA;&lt;dd&gt;I had the chance to look at the &lt;a href=&#34;http://www.wfdf.org/sotg/spirit-rules-a-scoring&#34;&gt;Spirit scoring sheets&lt;/a&gt; for a&#xA;couple of tournaments, in the beginning of 2018, and was utterly&#xA;disappointed. I always knew that it was a lot of work to get the top scores&#xA;just a few minutes after the final game, but I found a lot more mistakes&#xA;than I expected &amp;ndash; a lot of them were easy to avoid with just a little&#xA;automation.&#xA;&lt;p&gt;To help improve the situation, I built a &lt;a href=&#34;http://sotg-calculator.herokuapp.com/&#34;&gt;simple webapp&lt;/a&gt; to compute the&#xA;scores from a Google Spread Sheet. Finding the initial adopters turned out&#xA;to be very hard, despite the app making life a lot easier for people. It&#xA;was disappointing to see people saying they didn&amp;rsquo;t have enough time to try&#xA;the app, and instead chose to manually compute everything that the app&#xA;could&amp;rsquo;ve done with a couple of clicks!&lt;/p&gt;&#xA;&lt;p&gt;But, eventually it started to be pushed as the official tool starting this&#xA;season, and has found a bunch of happy users.&lt;/p&gt;&#xA;&lt;/dd&gt;&#xA;&lt;dt&gt;Team RSVP&lt;/dt&gt;&#xA;&lt;dd&gt;We used Whatsapp to co-ordinate team practices and to keep track&#xA;of the players attending, etc. But, this started to get quite&#xA;spammy, and it was a hassle to have other conversations on the&#xA;group, while folks were calling in for a practice. It was a&#xA;nightmare to have people call in for two different events at the&#xA;same time.&#xA;&lt;p&gt;To see if people were willing to switch away to something less&#xA;spammy, a friend and I started with a &lt;a href=&#34;https://github.com/thatte-idli-kaal-soup/rsvpapp&#34;&gt;simple RSVP app&lt;/a&gt; and most&#xA;people seemed to not mind using it.&lt;/p&gt;&#xA;&lt;p&gt;Unsurprisingly, the app eventually got &lt;a href=&#34;https://rsvp.thatteidlikaalsoup.team/features&#34;&gt;a lot of features&lt;/a&gt; - to&#xA;make it easy to manage team practices and team resources like&#xA;photos and training material. It is being used regularly by the&#xA;team, without too many problems.&lt;/p&gt;&#xA;&lt;p&gt;As an after thought, may be we have an over-engineered solution,&#xA;and just asking everyone to use (Google) Calender &amp;amp; Email&#xA;would&amp;rsquo;ve worked.&lt;/p&gt;&#xA;&lt;/dd&gt;&#xA;&lt;dt&gt;Huddle magazine archive&lt;/dt&gt;&#xA;&lt;dd&gt;The Huddle was a good Ultimate related magazine run&#xA;by Ben &amp;amp; Andy a few years ago. They eventually stopped running it, and the&#xA;archives disappeared from the &lt;a href=&#34;https://the-huddle.org/&#34;&gt;original site&lt;/a&gt; but are available on the &lt;a href=&#34;https://www.usaultimate.org/huddle/issue001.aspx&#34;&gt;USA&#xA;Ultimate website&lt;/a&gt; which is super hard to read! I wrote some &lt;a href=&#34;https://github.com/thatte-idli-kaal-soup/the-huddle&#34;&gt;code&lt;/a&gt; to scrape&#xA;the site, and convert the articles into markdown posts and made a more&#xA;readable version of the magazine &lt;a href=&#34;https://thatte-idli-kaal-soup.github.io/the-huddle/&#34;&gt;here&lt;/a&gt;.&#xA;&lt;p&gt;I tried to get in touch with Ben &amp;amp; Andy, to ask if they were interested to&#xA;replace the &amp;ldquo;coming soon&amp;rdquo; message on the original site with these archives,&#xA;but didn&amp;rsquo;t succeed. Posting it on Reddit and sharing it with my team got&#xA;some people interested, and hopefully they keep using it.&lt;/p&gt;&#xA;&lt;/dd&gt;&#xA;&lt;dt&gt;vquiz&lt;/dt&gt;&#xA;&lt;dd&gt;To help my team with understanding rules better, I built a light&#xA;weight &lt;a href=&#34;https://github.com/punchagan/vquiz&#34;&gt;tool to easily create video based quizzes&lt;/a&gt; - embed video and&#xA;ask related questions, use videos to show answers.&#xA;&lt;p&gt;To build a question bank, I tried to get some people on the team to&#xA;volunteer, but it didn&amp;rsquo;t really take off.&lt;/p&gt;&#xA;&lt;/dd&gt;&#xA;&lt;/dl&gt;&#xA;&lt;h2 id=&#34;ultimate-frisbee&#34;&gt;Ultimate Frisbee&lt;/h2&gt;&#xA;&lt;p&gt;2018 was filled with a lot of Ultimate - not just playing, but also thinking,&#xA;talking and planning.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Our team had a couple of the best tournaments that we&amp;rsquo;ve since I&amp;rsquo;ve been&#xA;playing with the team - not just in terms of the results but in how much fun&#xA;we all seemed to have together.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I captained the team in a bunch of tournaments. I&amp;rsquo;m not sure how exactly I got&#xA;to be the captain &amp;ndash; I guess it was just stepping forward for a tournament and&#xA;offering to spend the time and effort required. It was a great learning for&#xA;me, and I&amp;rsquo;ve learned some things about people and leading them that I would&amp;rsquo;ve&#xA;taken much longer to learn. I also think I did get better over the course of&#xA;the year &amp;ndash; I got more confident and the team also trusted me much more.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;In the past, game time at tournaments has been a big concern. We experimented&#xA;with a bunch of simple rotation systems &amp;ndash; essentially just systems to keep&#xA;track of how much each person has been playing, and trying to prevent too many&#xA;imbalances. People were encouraged to bring forth their concerns and ideas&#xA;during the games, rather than keep everything until the end of the tournament&#xA;when it is not fixable until the next time!&lt;/p&gt;&#xA;&lt;p&gt;We had the luxury of being able to try this since everyone on the team had&#xA;more or less the same skill level, and everyone trusted the system. It helped&#xA;take players&amp;rsquo; minds off playing time, and helped them focus on actually making&#xA;the most of the opportunities on the field. Most of the complaints about&#xA;game-time seem to have gone away.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Communicating the reasoning behind a decision is as important as communicating&#xA;the plan. Often, I&amp;rsquo;d hear surprising responses to a plan or just generally&#xA;disappointing comments like how decisions were being made arbitrarily, when we&#xA;were actually spending a lot of time and energy to try and make decisions. On&#xA;most occasions, I felt the reason was the lack of an understanding of the&#xA;reasons behind a decision.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Team communication was another tricky thing that I&amp;rsquo;ve had to wrestle with. The&#xA;team still needs to find a balance between communicating over a WhatsApp group&#xA;or discussing things in person, and the fact that most people are very busy to&#xA;make in-person meetings with a good attendance happen. We are experimenting&#xA;with a few things to see what works and what doesn&amp;rsquo;t.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;At tournaments, having a positive environment where everyone is supportive and&#xA;has each others&amp;rsquo; back is the most important thing for me. Irrespective of how&#xA;much practice we had together and what kind of strategies we practiced, just&#xA;having a team where everyone is positive and helpful goes a long way.&lt;/p&gt;&#xA;&lt;p&gt;On the other hand, this positivity is also such a fragile thing that needs to&#xA;be carefully protected and nurtured. It&amp;rsquo;s very easy for one negative comment&#xA;or thought to spread negativity and discontent like wild-fire.&lt;/p&gt;&#xA;&lt;p&gt;I think as a captain, I should&amp;rsquo;ve strived harder to safe guarding and&#xA;cultivating this positivity in the team.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Thanks to some discussions I had with my teammates, I spent a lot of time&#xA;thinking about what it means to feel like a valued member of a team, and what&#xA;it means to feel like you are contributing and making a difference. Being&#xA;chosen an MVP during a game is external validation that you made a difference&#xA;in a game, but only one or two people get that validation in each game. What&#xA;about the rest of the dozen or so other people? How can we as a team recognize&#xA;and acknowledge each others&amp;rsquo; contributions to each point or game?&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Some of these questions will continue to take up some of my mindspace this year,&#xA;whether or not I continue to captain the team.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;I also took up the role of UPAI&amp;rsquo;s &lt;a href=&#34;http://indiaultimate.org/governance-committee&#34;&gt;Director of Technology&lt;/a&gt; (aka sys-admin) along&#xA;with AK. It&amp;rsquo;s mostly been minor email or slack related change requests, and&#xA;nothing more. But, it&amp;rsquo;s been fun to get to know some of the people in the&#xA;Ultimate community a little better. I also helped organize the &lt;a href=&#34;http://indiaultimate.org/p/proceedings-of-upai-national-conference-2018&#34;&gt;UPAI conference&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;writing&#34;&gt;Writing&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I wrote only 8 blog posts, but 6 of them in the second half of the year!&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Some friends and I started a &lt;a href=&#34;https://sasha.wtf/writing-club/&#34;&gt;Writing Club&lt;/a&gt; in July, and it&amp;rsquo;s been going strong&#xA;so far. It has not only helped me publish at least one blog post a month, but&#xA;based on the responses I&amp;rsquo;ve received, I feel it has also improved the quality&#xA;of my writing. A lot of credit goes to my friends who read initial drafts of&#xA;my writing, and gave me really good suggestions on how to improve them.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;My journaling and personal note taking improved slightly as compared to last&#xA;year - I have more notes for 2018, than 2017. And that&amp;rsquo;s how I was able to&#xA;write this review post. But, I think the notes are restricted to a few areas&#xA;of my life, and I can take some actions to write about other things that are&#xA;important too.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;relationships&#34;&gt;Relationships&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I started a couple of Zulip instances with my friends on it &amp;ndash; one with my&#xA;college friends and another with my Ultimate team mates on it. My friends from&#xA;college went back to WhatsApp, but the other Zulip realm has had some pretty&#xA;conversations, especially on #beanbags. It hasn&amp;rsquo;t been super active towards&#xA;the end of the year, but I&amp;rsquo;m really happy it exists, and hope it continues to&#xA;grow this year.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;It was good to have some more teammates turn into friends. Thanks to all the&#xA;Ultimate stuff I&amp;rsquo;ve been doing, I got to spend a lot more time with some of&#xA;the people that I previously hadn&amp;rsquo;t interacted much with.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Tarle, a teammate and friend, passed away. 4 months and he&amp;rsquo;s still dead. We&#xA;all miss him a lot! But, we&amp;rsquo;ve also come together stronger, in some ways.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve tried scheduling regular check-ins with some friends who live far away.&#xA;They worked for a bit, but seem to be easily swallowed by higher priority&#xA;things. When they did happen, though, they were quite nice!&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Towards the end of the year, I moved houses. The new house is well furnished&#xA;and has neighbors who mostly mind their business &amp;ndash; I had a lot of friends and&#xA;family visiting, which has been good.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;2019-goals-ideas&#34;&gt;2019 goals/ideas&lt;/h2&gt;&#xA;&lt;p&gt;I want to give having a motto for an year a shot, a la Buster Benson. My motto&#xA;for 2019 is &amp;ldquo;Be Deliberate&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m not sure I know exactly what this entails, and I&amp;rsquo;m sure I&amp;rsquo;ll get a better&#xA;understanding of it, as the year goes by. But, here are few things that I think&#xA;would be good starting points:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Choose what I read more deliberately, and read for understanding rather than&#xA;just information. Keep better notes of the books I read.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Go back to using &lt;a href=&#34;https://github.com/punchagan/howdy&#34;&gt;Howdy&lt;/a&gt; or creating check-ins with more people, and making sure&#xA;that they happen. Prefer meeting in person or audio/video calls, rather than&#xA;chat.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Journal more about feelings and thoughts, especially when making decisions,&#xA;rather than just about events. Journal about more areas of my life rather than&#xA;just &amp;ldquo;work&amp;rdquo; related stuff.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Consider hiring an editor to help write better blog posts, and improve writing&#xA;style. Getting reviews and suggestions from my Writing Club friends has been&#xA;good, but this would be a level up.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Look for mentors in other areas of life - especially those where I feel like&#xA;I&amp;rsquo;m plateauing.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Pick side projects more carefully. One thing that I would be deliberately&#xA;thinking more about would be working on side projects that pay.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Write quarterly posts to document my improved understanding of the theme &amp;ndash; Be&#xA;Deliberate &amp;ndash; and to track progress I&amp;rsquo;m making on these goals.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Thanks &lt;a href=&#34;https://tinyurl.com/ydd4s7jd&#34;&gt;Kartik Krovvidi&lt;/a&gt; and &lt;a href=&#34;http://baali.muse-amuse.in/&#34;&gt;Shantanu Choudhary&lt;/a&gt; for reading drafts of this post,&#xA;being excited about it, and useful suggestions to make it better.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>HT interactives</title>
      <link>https://punchagan.muse-amuse.in/blog/ht-interactives/</link>
      <pubDate>Thu, 28 Sep 2017 00:46:00 +0530</pubDate>
      <guid>https://punchagan.muse-amuse.in/blog/ht-interactives/</guid>
      <description>&lt;p&gt;I recently discovered the &lt;a href=&#34;http://www.hindustantimes.com/interactives/&#34;&gt;interactives&lt;/a&gt; by HindustanTimes, and thoroughly loved&#xA;some of them. It felt like a fresh breath of air amongst all the other Indian&#xA;data driven journalism that I have been coming across in the recent past.&lt;/p&gt;&#xA;&lt;p&gt;The visualizations are a lot more interactive than some of the other Indian&#xA;publications. These remind me of NYT&amp;rsquo;s interactives, which are amongst the best&#xA;you&amp;rsquo;d see, while more often than not exploring data in the Indian context. I&#xA;really like that they explore a variety of ways of doing these visualizations,&#xA;and don&amp;rsquo;t just fit the data into one of the many standard options available in a&#xA;visualization library.&lt;/p&gt;&#xA;&lt;p&gt;It feels like they are willing to take their time to do these visualizations,&#xA;and are willing to collect data from multiple sources, and combine multiple&#xA;datasets to tell a story. I also like the fact that the visualizations and the&#xA;articles are more open-ended, allowing users to interact with and explore the&#xA;data, rather than trying to come up with an article full of conclusions with a&#xA;click-baity title. The fact that one of the sections is called &lt;a href=&#34;http://www.hindustantimes.com/interactives-just-for-fun&#34;&gt;Just for Fun&lt;/a&gt;&#xA;speaks to me.&lt;/p&gt;&#xA;&lt;p&gt;The data and the code used in most of these interactives is open and available&#xA;on &lt;a href=&#34;https://github.com/HindustanTimesLabs/&#34;&gt;GitHub&lt;/a&gt;, which is nice!&lt;/p&gt;&#xA;&lt;p&gt;On the whole, I think they are doing pretty good work, and I shall be on the&#xA;lookout for even better stuff from them. I&amp;rsquo;m sure I&amp;rsquo;ll pick up a thing or two&#xA;from their work, in my projects. Hopefully, other teams doing similar work will&#xA;also learn from there and produce more good stuff for greedy readers like me.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Emacs frame as a pop-up input</title>
      <link>https://punchagan.muse-amuse.in/blog/emacs-frame-as-a-pop-up-input/</link>
      <pubDate>Thu, 14 Sep 2017 22:26:00 +0530</pubDate>
      <guid>https://punchagan.muse-amuse.in/blog/emacs-frame-as-a-pop-up-input/</guid>
      <description>&lt;p&gt;I wanted to try using a dialog box/pop-up window as a prompt to remind me to&#xA;periodically make journal entries.  I had the following requirements:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Simple, light-weight dialog box that allows text of arbitrary length&lt;/li&gt;&#xA;&lt;li&gt;Ability to launch the dialog from the shell&lt;/li&gt;&#xA;&lt;li&gt;Ability to have some placeholder or template text, each time the dialog is shown&lt;/li&gt;&#xA;&lt;li&gt;Save the input text to a specific &lt;code&gt;org-mode&lt;/code&gt; file&lt;/li&gt;&#xA;&lt;li&gt;Write as little code of my own, as possible, to do this&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I had initially thought about using a tool like &lt;code&gt;zenity&lt;/code&gt;, or write a simple&#xA;dialog box in Python using &lt;code&gt;Qt&lt;/code&gt;, &lt;code&gt;wx&lt;/code&gt; or even &lt;code&gt;tk&lt;/code&gt;, and then yank the input text&#xA;at the desired location. This probably wouldn&amp;rsquo;t have turned out to be too hard,&#xA;but getting things to look and work exactly the way I wanted would have required&#xA;more code than I was willing to write or maintain.&lt;/p&gt;&#xA;&lt;p&gt;After avoiding doing this for a while, I finally realized that I could simply&#xA;use Emacs with a new frame with the appropriate dimensions, and with the correct&#xA;file/buffer open to the desired location. This would&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;eliminate the need for me to write the UI myself&lt;/li&gt;&#xA;&lt;li&gt;eliminate the need to do text manipulation in code, to yank it at the right&#xA;place, in the right form. By directly opening up the editor at the required&#xA;location, the onus is on me (as a text inputting user) to put it in, the way I&#xA;want it.&lt;/li&gt;&#xA;&lt;li&gt;additionally provide me the comfort of being able to write with the full power&#xA;of Emacs - keybindings and all that jazz.&lt;/li&gt;&#xA;&lt;li&gt;let me leverage &lt;code&gt;elisp&lt;/code&gt; to do essentially whatever I want with the buffer&#xA;being displayed as the dialog box.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I ended up with a command that looks something like this&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;emacsclient -c -n&lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;            -F &lt;span class=&#34;s1&#34;&gt;&amp;#39;((title . &amp;#34;Title&amp;#34;) (left . (+ 550)) (top . (+ 400)) (width . 110) (height . 12))&amp;#39;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;            -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;(pc/open-journal-buffer)&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src=&#34;https://punchagan.muse-amuse.in/images/emacs-frame.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;This worked pretty nicely, except for the fact that with gnome-shell, the pop-up&#xA;frame doesn&amp;rsquo;t always appear raised. It often gets hidden in the Emacs windows&#xA;group, and the whole idea of the pop-up acting as a reminder goes for a toss!&#xA;But, thanks to &lt;a href=&#34;https://askubuntu.com/a/288483&#34;&gt;this Ask Ubuntu post&lt;/a&gt;, I could fix this pretty easily.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;emacsclient -c -n&lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;            -F &lt;span class=&#34;s1&#34;&gt;&amp;#39;((title . &amp;#34;Title&amp;#34;) (left . (+ 550)) (top . (+ 400)) (width . 110) (height . 12))&amp;#39;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;            -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;(progn (pc/open-journal-buffer) (raise-frame) (x-focus-frame (selected-frame)))&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Back, Hopefully</title>
      <link>https://punchagan.muse-amuse.in/blog/back-hopefully/</link>
      <pubDate>Fri, 01 Sep 2017 22:47:00 +0530</pubDate>
      <guid>https://punchagan.muse-amuse.in/blog/back-hopefully/</guid>
      <description>&lt;p&gt;I haven&amp;rsquo;t written anything here for almost a year. I needed to break the&#xA;silence. So, here we go with a not-so-useful post showing how frequently I have&#xA;been posting to this blog, to get a sense of how long this break has been in&#xA;comparison to other silences in the past.&lt;/p&gt;&#xA;&lt;p&gt;Neither the code below, nor the plots are very insightful. But, I just hope this&#xA;will get me started on the path to blogging more regularly. See you around!&lt;/p&gt;&#xA;&lt;h2 id=&#34;parsed-post-content&#34;&gt;Parsed post content&lt;/h2&gt;&#xA;&lt;p&gt;I wrote some code to parse the content of the blog, and each post object looks&#xA;something like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{&amp;#39;date&amp;#39;: datetime.datetime(2010, 3, 17, 18, 30, tzinfo=&amp;lt;UTC&amp;gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &amp;#39;draft&amp;#39;: False,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &amp;#39;tags&amp;#39;: [&amp;#39;blab&amp;#39;, &amp;#39;life&amp;#39;, &amp;#39;poem&amp;#39;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &amp;#39;title&amp;#39;: &amp;#39;Just another bunch&amp;#39;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Post count: 190&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;post-frequency-by-year&#34;&gt;Post frequency by year&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ipython&#34; data-lang=&#34;ipython&#34;&gt;import pandas&#xA;posts = pandas.DataFrame(posts)&#xA;counts = posts[&amp;#39;date&amp;#39;].groupby(posts[&amp;#39;date&amp;#39;].dt.year).count()&#xA;plot = counts.plot(kind=&amp;#39;bar&amp;#39;, figsize=(8, 6))&#xA;plot.set_xlabel(&amp;#39;Years&amp;#39;)&#xA;plot.set_ylabel(&amp;#39;# of posts&amp;#39;)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;lt;matplotlib.text.Text at 0x7f7d99ee20f0&amp;gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://punchagan.muse-amuse.in/images/ob-ipython-64158e1b9b5ccddff8534006a256c5b3.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&amp;lt;matplotlib.figure.Figure at 0x7f7d99ea7390&amp;gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;post-frequency-by-month&#34;&gt;Post frequency by month&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ipython&#34; data-lang=&#34;ipython&#34;&gt;# Add a DatetimeIndex to the Dataframe&#xA;posts.index = pandas.DatetimeIndex(posts[&amp;#39;date&amp;#39;].values)&#xA;counts = posts[&amp;#39;date&amp;#39;].groupby(pandas.TimeGrouper(&amp;#39;M&amp;#39;)).count()&#xA;ax = counts.plot(kind=&amp;#39;bar&amp;#39;, figsize=(12, 8))&#xA;&#xA;n = 5&#xA;ticks = ax.xaxis.get_ticklocs()&#xA;labels = counts.index.strftime(&amp;#39;%Y-%m&amp;#39;)&#xA;labels = ax.xaxis.set_ticklabels(labels[::n])&#xA;ticks = ax.xaxis.set_ticks(ticks[::n])&#xA;&#xA;ax.set_xlabel(&amp;#39;year-month&amp;#39;)&#xA;ax.set_ylabel(&amp;#39;# of posts&amp;#39;)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;lt;matplotlib.text.Text at 0x7f7d99e2f240&amp;gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://punchagan.muse-amuse.in/images/ob-ipython-bf5d9e24f4f23986583d3023df42c707.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&amp;lt;matplotlib.figure.Figure at 0x7f7d99e2cf98&amp;gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;work-flow&#34;&gt;Work-flow&lt;/h2&gt;&#xA;&lt;p&gt;I jumped onto the &lt;a href=&#34;https://gohugo.io&#34;&gt;hugo&lt;/a&gt; bandwagon too.&lt;/p&gt;&#xA;&lt;p&gt;I was totally impressed by how fast it is, and have been meaning to try it out&#xA;for a while, but wasn&amp;rsquo;t impressed with the built-in &lt;code&gt;org-mode&lt;/code&gt; support it came&#xA;with. This changed when I finally came across the &lt;a href=&#34;https://github.com/kaushalmodi/ox-hugo&#34;&gt;ox-hugo&lt;/a&gt; package that does a&#xA;wonderful job of exporting blog posts from an org file to hugo&amp;rsquo;s markdown&#xA;format. I have contributed a couple of patches to it, to make it work better for&#xA;myself and hopefully for others too.&lt;/p&gt;&#xA;&lt;p&gt;Also, for this post, I used &lt;code&gt;ob-ipython&lt;/code&gt; with the &lt;a href=&#34;http://kitchingroup.cheme.cmu.edu/blog/2017/01/29/ob-ipython-and-inline-figures-in-org-mode/&#34;&gt;enhancements from scimax&lt;/a&gt; and&#xA;it has really made the whole experience quite enjoyable.&lt;/p&gt;&#xA;&lt;p&gt;Among other things, I think one of the reasons for those peaks in the second&#xA;half of 2010, was having a smooth work-flow. My current work-flow feels pretty&#xA;nice too, and I hope it&amp;rsquo;ll reduce some of the friction in writing more posts.&lt;/p&gt;&#xA;&lt;p&gt;Onwards!&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Recurse Center, 2014-07-07</title>
      <link>https://punchagan.muse-amuse.in/recurse-center/recurse-center-2014-07-07/</link>
      <pubDate>Tue, 08 Jul 2014 10:07:20 -0400</pubDate>
      <guid>https://punchagan.muse-amuse.in/recurse-center/recurse-center-2014-07-07/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;As preparation for a one-on-one this week with one of the facilitators, I was&#xA;wondering if I was really getting better as a programmer, by doing what I am&#xA;doing.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I have heard at numerous places that reading and reflection are keys to&#xA;getting better. I feel like I haven&amp;rsquo;t been giving these things much attention&#xA;in the past couple of weeks. I don&amp;rsquo;t catch up on reading all the awesome&#xA;reading material shared on Zulip and I switched from writing this blog post&#xA;first thing in the morning, to any-time-after-lunch. I don&amp;rsquo;t think this&#xA;worked out very well. Writing the post worked as a way to reflect on what I&#xA;had done yesterday, and what I should be doing today. So, I am back to&#xA;writing the blog post, first thing in the morning!&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Yesterday, I worked on indexing the Python sources in a way that the&#xA;inspection code can look up, later.  During this process, I found that my&#xA;code to use libclang&amp;rsquo;s AST wasn&amp;rsquo;t generic enough, and I had to clean it up to&#xA;be able to extract useful information from any file in the &lt;code&gt;cpython&lt;/code&gt; sources.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;We also got to attend a super-awesome talk by &lt;a href=&#34;http://words.steveklabnik.com/&#34;&gt;Steve Labnik&lt;/a&gt;! He talked about&#xA;his progression from being an application developer, to writing libraries, to&#xA;working on languages (as a professional developer). He made a lot of&#xA;interesting and inspiring points during his talk.  Some of those that stuck&#xA;with me are:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;None of these is particularly harder than any of the other. Depending on&#xA;each person&amp;rsquo;s personality, or the way their brain works, they are good at&#xA;doing one or the other.&lt;/li&gt;&#xA;&lt;li&gt;Getting good at programming is a matter of showing up, more than about the&#xA;&amp;ldquo;genes&amp;rdquo;.  He repeated quite a few times that he disliked the idea of &amp;ldquo;baby&#xA;hacker&amp;rdquo;, and left out the story of his childhood and college programming&#xA;days! I&amp;rsquo;m totally stealing his idea of meeting every saturday at 1pm, with&#xA;a bunch of friends and working until it was 10pm or so, when they could get&#xA;cheap beer and food!  And he did this all through his college!  It is&#xA;interesting that this idea is so similar to Hacker School!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;It was a very enjoyable and inspiring talk on the whole.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The plan for today is to actually have the parsed information dumped into&#xA;some persistent format, and modify the inspect code to actually use it.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I will also be pairing with Kyle for a few hours on working through some of&#xA;&lt;a href=&#34;http://mitpress.mit.edu/books/audio-programming-book&#34;&gt;http://mitpress.mit.edu/books/audio-programming-book&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>Why I like Org as a markup</title>
      <link>https://punchagan.muse-amuse.in/blog/why-i-like-org-as-a-markup/</link>
      <pubDate>Wed, 12 Jan 2011 18:00:00 +0530</pubDate>
      <guid>https://punchagan.muse-amuse.in/blog/why-i-like-org-as-a-markup/</guid>
      <description>&lt;p&gt;Org-mode, as a mode, is obviously awesome.  The ability to move&#xA;around whole blocks of text, for re-organizing documents and the&#xA;usability of tables are just two brilliant features.&lt;/p&gt;&#xA;&lt;p&gt;But, the org markup itself is such a cool thing.  I&amp;rsquo;ve been&#xA;looking at &lt;code&gt;rst&lt;/code&gt; all day, and it&amp;rsquo;s such a pain to find out where&#xA;your headings are, what level your current sub-heading is at, etc.&#xA;(I&amp;rsquo;ll probably do a bit better, with some getting used to. I&amp;rsquo;m an&#xA;org-addict. ;)).  With org-mode it&amp;rsquo;s so intuitive!  It&amp;rsquo;s so easy&#xA;to find out, with just one quick look!  I don&amp;rsquo;t think any other&#xA;markup has this coolness! Org-mode FTW!&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
