<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/assets/feed.xslt"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/">
<channel>
<title>Web logs of McSinyx</title>
<link>https://lumvok.store</link>
<atom:link href="https://lumvok.store/feed.xml" rel="self" type="application/rss+xml"/>
<description>Random write-ups packed with pop culture references</description>
<copyright><![CDATA[🄯 2019–2024 Nguyễn Gia Phong under CC BY-SA 4.0]]></copyright>
<language>en</language>
<generator>Franklin</generator>
<item>
  <title>The 2020 Experience</title>
  <link>https://lumvok.store/blog/2020/index.html</link>
  <guid>https://lumvok.store/blog/2020/index.html</guid>
  <description>My life in 2020</description>
  <category>lyf</category><category>exp</category>
  <pubDate>Sat, 07 Jan 2023 00:00:00 +0000</pubDate>
  <content:encoded><![CDATA[
<h1 id="the_2020_experience">The 2020 Experience</h1>
<div class="admonition note"><p class="admonition-title">Not to be confused with <em>The 20/20 Experience</em></p></div>
<div class="franklin-toc"><ol><li>The Germination</li><li>The Fruition</li><li>The Disease</li><li>The Profit</li><li>The Migrations</li><li>The Moral</li></ol></div>
<h2 id="the_germination">The Germination</h2>
<p>To understand my 2020, we have to travel back a few months, when it all started.  No, not <em>that thing</em> beginning at the end of &#39;19. I am talking about <em>my</em> 2020 experience, remember?</p>
<p>The story started in October 1810 in the not-so-little city of Munich, Germany. Alright, it sounds like I lied about the 2019 and my story part, but bear with me, it&#39;s all connected.  Anyhow, some Bavarian couple got married and threw a big party.  People like parties, so naturally they celebrated the anniversaries, year after year until it became a tradition known to in English as the <a href="https://en.wikipedia.org/wiki/Oktoberfest">Oktoberfest</a>.</p>
<p>Over two centuries years later, on the wedding day of another Bavarian couple,<sup id="fnref:wedding">[1]</sup> DigitalOcean began to an annual PR campaign on the same month called Hacktoberfest.  I know, to many of you maintaining projects on GitHub &#40;and more recently GitLab.com&#41;, the name might not remind you of something festive, but it really opened a new chapter in my life.</p>
<p><a href="https://www.whoismrrobot.com">Back to the future</a> in 2019, it was my first year taking part in the event. The premise was that one would receive a t-shirt after having filed at least four GitHub Pull Requests™.<sup id="fnref:pr">[2]</sup>  Unlike <em>plethora</em>, this does not sound like it was a lot, yet more than I ever had done.  Getting out of my comfort zone was the first baby step, opening various opportunities in the upcoming months and perhaps, years.</p><figure>
  <img src=https://lumvok.store/assets/codersrank.png
       alt='Graph showing steeper growth from October 2019'>
  <figcaption>My activities on GitHub over the years</figcaption>
</figure><h2 id="the_fruition">The Fruition</h2>
<p>Probably what I benefited the most from participating in Hacktoberfest was learning to not be afraid of communicating with complete strangers maintaining the software I use.  Stepping into 2020, I started to do a larger variety of stuff in Python, which made installing libraries happen on a regular basis.  The international Internet connection from home at the time was unstable and usually downloads from the package warehouse was a few kBps and that definitely did not help.  A few moments later, I found myself on <a href="https://pypa.io">PyPA</a>&#39;s IRC channel discussing strategies to speed up pip downloading.</p>
<p>After several days of on-off conversations &#40;mostly I was asking questions to fill in the blanks&#41;, a proposal was under draft: I was an undergrad sophomore and had been eyeing on Google Summer of Code &#40;GSoC&#41; for quite a while. Applying for pip wasn&#39;t the plan, but rather <a href="https://octave.org">Octave</a>, the first big project I have contributed code to.<sup id="fnref:1st">[3]</sup>  Now thinking about it, it was a better choice since I was more comfortable with pip&#39;s tech stack. The <a href="https://lumvok.store/blog/2020/gsoc">rest of the story</a> was already noted down so I won&#39;t be retelling it here.</p>
<h2 id="the_disease">The Disease</h2>
<p>When the world had been battling SARS-CoV-2 for a few months, Việt Nam was barely affected.  By refusing inbound travelers and temporary switching to work/study-from-home, the number of cases and deaths was neglible and by the end of summer we were virtually back to normal.  I hated that most organizations, my university included, straight up offered big techs our data without a second thought, and was thankful online learning did not last.</p>
<p>Like many others, I spent that summer rarely leaving the house.  I was grateful of GSoC for keeping me busy and giving me the opportunity to socialize with new cool people.  It was impossible for me to catch <em>the</em> virus, I thought. I was not wrong though, but I got something else: <a href="https://en.wikipedia.org/wiki/Dengue_fever">dengue fever</a>.  The fever wasn&#39;t too bad, I was high as a kite for half a week, but never critical. The aftermath, however, was much less pleasant.</p>
<p>For the next week, I was in a living hell because of a throat infection. I&#39;d had sore throats before, quite regularly in fact, often at least once every few months, but they had been a mere inconvenience.  Usually, all I&#39;d gotta do had been to <a href="https://en.wiktionary.org/wiki/person_up">person up</a>, swallow a few times and get on with my day.  This was different.  Everything hurt like a bitch.  The slightest texture or flavor could cause minutes of pain.  For the first time, I experience throat lozenges being the opposite of soothing.</p>
<p>For the entire week, I survived on undercooked scrambled eggs and mushy porridge.  I had to take α-chymotrypsin<sup id="fnref:choay">[4]</sup> before every meal and was practically microdosing it throughout the day to be able to drink water.  You can&#39;t imagine how happy I was when I could finally eat rice again.  While the infection was not directly caused by dengue &#40;it only weakened my immune system&#41;, the trauma was enough to make me finally care about home mosquito eradication.  Guess who learnt it the hard way&#33;</p>
<h2 id="the_profit">The Profit</h2>
<p>GSoC gave me in stipend 3000 USD, minus Payoneer fees and shitty currency exchange &quot;tax&quot;.  That was the largest sum I&#39;d ever had in my hands. Because of the low cost of living in Việt Nam,<sup id="fnref:cost">[5]</sup> I no longer completely financially dependent on my parents.  I could pay my own school fees &#40;scholarship would give back the money <em>months</em> after paying&#41;, hang out more with friends &#40;we had zero-COVID for a while, remember?&#41;, tip free software projects and services I had &#40;and have&#41; been using for years.</p>
<p>More importantly, I could buy myself <em>future</em> e-waste.  I got a <a href="https://www.pckeyboard.com">Model M</a> so that I no longer need to change keyboard every year, a <a href="https://video.hardlimit.com/w/uucN1eWVurTSzY325PLS2s">lefty</a> <a href="https://ploopy.co">Ploopy</a> to ease my traffic-accident-injured right wrist that&#39;s prolly never gonna fully heal, a <a href="https://nixnet.social/notice/AI9eETauDunmiiIfHE">new DAP to replace my dead walk man</a>, my <a href="https://lumvok.store/blog/2020/gsoc/article/4/#snap_back_to_reality">first phone</a> and perhaps some other things.  <a href="https://www.youtube.com/watch?v&#61;5z25pGEGBM4">No worries</a>, I&#39;m still daily driving them today, they ain&#39;t ended up in the landfill &#40;yet&#41;.</p>
<h2 id="the_migrations">The Migrations</h2>
<p>Admittedly, the first <em><a href="https://freedesktop.org">freedesktop.org</a> smartphone</em> caught my eye was actually the Librem 5, which I could afford neither the time nor the money for. I know, the terminology sounds ridiculous, but <em>Linux</em> would include Android and <em>GNU</em>&#39;d exclude <a href="https://postmarketos.org">postmarketOS</a>.  Anyway, <a href="https://puri.sm">Purism</a>, the company behind the Librems, has seriously invested in adaptive GUI and federated services. My first <a href="https://activitypub.rocks">ActivityPub</a> account was provided by <a href="https://librem.one">Librem One</a>.</p>
<p>It was not the first time I use a federated service.  I&#39;ve used email for as long as I can remember and begun to use <a href="https://matrix.org">Matrix</a> intensively since I entered university.  So what &#40;were there to be&#41; changed? At the time, my online presence<sup id="fnref:jargon">[6]</sup> was primarily inside <a href="https://github.com/McSinyx/mcsinyx.github.io/commit/af8e02ec3989.patch">surveillance capitalist walled gardens</a>.  I was mostly active&#40;ly posting&#41; on bird site socializing with people I acquainted during my GSoC and publishing my development/shitpost<sup id="fnref:log">[7]</sup> videos to YouTube.</p>
<p>Nothing on fedi really caught my eyes, until I got &#40;hyped up for getting&#41; my PinePhone.  Its software landscape was incredibly fast moving back then. Most peripherals were barely working.  Desktop programs were being ported for narrower screens using brand new convergent libraries.  Many developers were contracted by Purism or sponsored by Pine64, a large fraction of whom are free software purists, rejecting spyware disguised as social media. Never before, hanging out in chat rooms<sup id="fnref:bridge">[8]</sup> and the Fediverse were the absolutely best ways to keep up with life-quality-changing updates.</p>
<p>Like with desktop-handheld convergence, I was impressed with Fediverse&#39;s interoperability between multiple media formats, from &#40;micro&#41;blogs to picture albums to videos.  Imagine being able to share and comment on a YouTube directly from Twitter&#33;  Shortly, I registered for a <a href="https://joinpeertube.org">PeerTube</a> account and migrate all my videos there.  The longer I stayed on fedi, the more cool stuff I found and the more satisfied I was.  Fast forward over two years, I have deleted or permanently logged out of most; only quiddit<sup id="fnref:reddit">[9]</sup> is left.</p>
<p>One thing led to another, <a href="https://blog.brixit.nl/apps">Martijn Braam&#39;s apps</a> introduced me to <a href="https://sourcehut.org">SourceHut</a>, which embraces email for federation and focuses on useful stuff like <a href="https://man.sr.ht/builds.sr.ht/build-ssh.md">SSH for CI</a>, instead of trying to be a <a href="https://arxiv.org/abs/2006.02371">social media</a> or <a href="https://githubcopilotlitigation.com">relicense the projects it hosts</a>. I have moved most of the software I maintain <a href="https://GiveUpGitHub.org">from GitHub</a> to sr.ht, but the network effect is too strong: I still have to stick around with the former to contribute to software I regularly use.</p>
<p>However, it&#39;s unlikely that most of those growing up with GitHub, especially inexperienced contributors, will be <a href="https://adol.pw/2022/05/09/maintaining-first-project-part-iv-end">willing to adapt to a workflow revolving around mailing lists</a> for such kind of forge to become mainstream again.  On the bright side, I start to seeing more larger projects hosting their development platform, and I am watching <a href="https://forgefriends.org/blog/2022/06/30/2022-06-state-forge-federation">forge federation</a> with great interest.</p>
<h2 id="the_moral">The Moral</h2>
<p>At this point, you probably wonder, what I am trying to tell from all these random rambling.  Welp, nothing.  My life is <a href="https://www.youtube.com/watch?v&#61;9ewTkrfaWtA">not like the movies</a>, there ain&#39;t no plot, no meaning.  The whole point of this log is to bridge the gap between <a href="https://lumvok.store/blog">/blog</a> and <a href="https://lumvok.store/blog/2020/gsoc">/blog/2020/gsoc</a>.  2020 was indeed positively life-changing for me, tho/so I can&#39;t expect most of y&#39;all&#39;ll be able to relate.  2023 is already underway, and I hope we will all have a year we can look back to the same way I did in this post.  <a href="https://fe.disroot.org/@mcsinyx/posts/ALaW77HgCSPq4pLxpo">Perchance.</a></p>
<table class="fndef" id="fndef:wedding">
    <tr>
        <td class="fndef-backref">[1]</td>
        <td class="fndef-content">There must be at least one wedding everyday in Bavaria, I think.</td>
    </tr>
</table><table class="fndef" id="fndef:pr">
    <tr>
        <td class="fndef-backref">[2]</td>
        <td class="fndef-content">It is a vendor locked-in version of <a href="https://git-scm.com/docs/git-request-pull">git-request-pull</a>.</td>
    </tr>
</table><table class="fndef" id="fndef:1st">
    <tr>
        <td class="fndef-backref">[3]</td>
        <td class="fndef-content">Not counting Vim because it was a <a href="https://lumvok.store/works/#simplified_vietnamese_keymaps">keymap</a> contribution.</td>
    </tr>
</table><table class="fndef" id="fndef:choay">
    <tr>
        <td class="fndef-backref">[4]</td>
        <td class="fndef-content">Proteolytic enzyme; taken orally for inflammation.  Shit&#39;s magic.</td>
    </tr>
</table><table class="fndef" id="fndef:cost">
    <tr>
        <td class="fndef-backref">[5]</td>
        <td class="fndef-content">A meal at a diner costed around 1 USD at the time.</td>
    </tr>
</table><table class="fndef" id="fndef:jargon">
    <tr>
        <td class="fndef-backref">[6]</td>
        <td class="fndef-content">Gah, I hate this term&#33;</td>
    </tr>
</table><table class="fndef" id="fndef:log">
    <tr>
        <td class="fndef-backref">[7]</td>
        <td class="fndef-content">I don&#39;t like keeping too serious logs.</td>
    </tr>
</table><table class="fndef" id="fndef:bridge">
    <tr>
        <td class="fndef-backref">[8]</td>
        <td class="fndef-content">A room was bridged between 5 protocols, fun but also an eye sore.</td>
    </tr>
</table><table class="fndef" id="fndef:reddit">
    <tr>
        <td class="fndef-backref">[9]</td>
        <td class="fndef-content">Hey, the site name was a pun on <em>read it</em> in the first place&#33;</td>
    </tr>
</table>    <a href="mailto:cnx.site@loa.loang.net?In-Reply-To=%3Cblog/2020@cnx%3E&Subject=Re: The 2020 Experience">Reply via email</a>]]></content:encoded>
  <comments><![CDATA[https://lists.sr.ht/~cnx/site?search=In-Reply-To:%3Cblog/2020@cnx%3E]]></comments>
  <wfw:commentRss>https://lumvok.store/blog/2020/comments.xml</wfw:commentRss>
</item>
<item>
  <title>Advent of Programming Languages</title>
  <link>https://lumvok.store/blog/advent/index.html</link>
  <guid>https://lumvok.store/blog/advent/index.html</guid>
  <description>Doing Advent of Code in a new programming language each day</description>
  <category>fun</category><category>exp</category>
  <pubDate>Mon, 26 Dec 2022 00:00:00 +0000</pubDate>
  <content:encoded><![CDATA[
<h1 id="advent_of_programming_languages">Advent of Programming Languages</h1>
<p>Earlier this year I enrolled in a master&#39;s programme<sup id="fnref:master">[1]</sup> at <a href="https://unist.ac.kr">UNIST</a> and joined the Programming Languages and Software Engineering lab &#40;PLaSE&#41; as a student researcher.  The stipend covers the school fees and living expenses, and I&#39;m given <em>an</em> academic freedom to choose what to work on and take risks. I will review the life here in detail in another post, but &#40;SPOILER ALERT&#33;&#41; overall I&#39;m quite content with it.</p>
<p>That being said, PLaSE is new and small, we only do research on software engineering and don&#39;t do its name justice.  Because of that, in the first year here I decided to do each day of <a href="https://adventofcode.com">Advent of Code</a><sup id="fnref:2021">[2]</sup> in a language I&#39;d never used in competitive programming &#40;CP&#41; before.</p>
<p><img src="https://lumvok.store/assets/mr-worldwide.jpg" alt="Pitbull holding the globe, captioned: Mr. Worldwide" /></p>
<p>Here was my blacklist going in, chronologically: Pascal, Python, Scheme, C, C&#43;&#43;, Common Lisp, Lua, Raku, Go, Rust and Zig.  I am only proficient in over half of the listed languages, but dura lex, sed lex, I&#39;d already had my CP first time with the rest.</p>
<p>To try any new language, all I have to do is dropping into an ephemeral shell with its implementation using <code>nix-shell</code> or <code>guix shell</code> without the fear of bloating up my systems.  I&#39;m running <a href="https://lumvok.store/blog/butter">NixOS on my laptop</a> with <a href="https://search.nixos.org/packages">nixpkgs</a> being one of the largest downstream repositories, including everything but the kitchen sink.  On the work desktop, I installed Guix System which has a decent <a href="https://packages.guix.gnu.org">set of packages</a> and <a href="https://trong.loang.net/~cnx/dotfiles/tree/guix/system.scm?id&#61;b53f96565b8c#n51">nix service</a> in case something is missing.  Every update, I run <a href="https://nixos.org/manual/nix/stable/command-ref/nix-collect-garbage.html">garbage</a> <a href="https://guix.gnu.org/manual/en/html_node/Invoking-guix-gc.html">collection</a> and get rid of all unnecessary software, i.e. those not <a href="https://trong.loang.net/~cnx/dotfiles/tree/guix">declared</a> <a href="https://trong.loang.net/~cnx/dotfiles/tree/nix">in my config</a>.</p>
<h2 id="day_one">Day One</h2>
<p>The first day should have been the warm up so I challenged myself with using POSIX utilities.  This is a bit irony though as the majority of my time spent outside of <a href="https://www.vim.org"><em>the</em> editor</a> or a web browser is inside a &#40;<a href="https://www.youtube.com/watch?v&#61;k5E6CExu204">Bourn-again</a>&#41; shell.</p>
<p>The <a href="https://adventofcode.com/2022/day/1">problem</a> was indeed simple, involving only <a href="https://trong.loang.net/~cnx/cp/commit?id&#61;ff0bb53c15dd">finding the maxima among the sums of newline-separated numbers</a>.  I used <a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html">sed</a>&#40;1p&#41; to turn the input into <a href="https://linux.die.net/man/1/dc">dc</a>&#40;1&#41; eypressions, and <a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html">sort</a>&#40;1p&#41; and <a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/tail.html">tail</a>&#40;1p&#41; for picking the largest sum.  Probably the most interesting part was that the summation was reusable to <a href="https://larkspur.one/notice/AQALVP69wAiotsVmgC">grade an assignment</a> for a course I was a teaching assistant for.</p>
<h2 id="day_two">Day Two</h2>
<p>The <a href="https://adventofcode.com/2022/day/2">second problem</a> didn&#39;t ramp up much in difficulty. It only called for some rather <a href="https://trong.loang.net/~cnx/cp/commit?id&#61;ada3a69b15ff">simple arithmetic</a>, and the input format&#39;s regularity convinced me to finally give <a href="https://harelang.org">Hare</a> a try.</p>
<p>For just a taste, Hare is boring in a good way.  I was excited for the tagged union of <a href="https://harelang.org/tutorials/introduction/#defining-new-error-types">error which can include and propagate any debugging information</a>, but unfortunately it wasn&#39;t needed for programs of such complexity &#40;nor that errors are ever handled in CP&#41;. I&#39;m looking forward to a chance to write more Hare in the future.</p>
<h2 id="day_three">Day Three</h2>
<p>The <a href="https://adventofcode.com/2022/day/3">task for day 3</a> was literally day \(1 + 2\) in scope. I went for another <em>better C</em> that is <a href="https://nim-lang.org">Nim</a>.  My first impression with it wasn&#39;t positive: Nim insists on considering each source file as a module and does not allow hyphens in identifier name, so <a href="https://forum.nim-lang.org/t/5024">filenames mustn&#39;t have any hyphen</a> either.  This had led me to piping the source code to <code>nim c -</code> and executing <code>~/.cache/nim/stdinfile_d/stdinfile</code> to keep my solution naming convention. <code>nim r -</code> wouldn&#39;t have worked either since the convention also consists of reading the input from stdin.</p>
<p>On the bright side, <a href="https://en.wikipedia.org/wiki/Uniform_Function_Call_Syntax">uniform function call syntax</a>, identifier case-&#40;and underscore-&#41;insensitivity and optional parentheses allowed me to <a href="https://trong.loang.net/~cnx/cp/commit?id&#61;eeb9a45346a8">dodge parentheses in calls and camelCasing altogether</a>. Although I <em>love</em> Lisp and don&#39;t have any problem with brackets, I think their placement in ALGOL style hurts the readability of nested calls and <a href="https://www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf">camelCase is just objectively bad</a>, pun<sup id="fnref:obj">[3]</sup> unintended.</p>
<h2 id="day_four">Day Four</h2>
<p>The <a href="https://adventofcode.com/2022/day/4">forth problem</a> wasn&#39;t any harder, only requiring <a href="https://trong.loang.net/~cnx/cp/commit?id&#61;8941f621840f">simple logic operations and summation</a>.  To save time, I opted for <a href="https://julialang.org">Julia</a>, which I was kinda sorta familiar with in building this site &#40;at the time this is published at least&#41;. Like Nim, it has higher-order functions and a &#40;reference&#41; compiler capable of producing fast binaries.</p>
<h2 id="day_five">Day Five</h2>
<p>The <a href="https://adventofcode.com/2022/day/5">next day&#39;s task</a> was finally a breath of fresh air with <a href="https://trong.loang.net/~cnx/cp/commit?id&#61;aa7616140a8b">matrix parsing and LIFO &#40;literal&#41; stacks</a>.  It begged for a regular expression parser,<sup id="fnref:re">[4]</sup> hence I mined a tiny bit of Ruby for the task.  Ruby had been designed to be an object-oriented Perl, and expectedly it feels very similar to Raku.  To an extend, I was also able to avoid ALGOL-style call do quite a <a href="https://www.codesections.com/blog/raku-lisp-impression">Lisp impression</a>.</p>
<p>When I was looking for a second language to learn after the peak of my CP <em>career</em> in middle school, I was choosing between those with garbage-collection that are most popularly used in <a href="https://www.gnu.org/philosophy/free-sw.html">free software</a> at the time, namely Perl, Python and Ruby.  Perl was ruled out due to my fear of <a href="https://raku-advent.blog/2022/12/20/sigils">sigils</a> and I picked up Python as I didn&#39;t want to be a <a href="https://en.wikipedia.org/wiki/Japanophilia#21st_century">weeaboo</a>. Sometimes I wonder how my side projects would have turned out to be had I chosen differently.</p>
<h2 id="day_six">Day Six</h2>
<p>The <a href="https://adventofcode.com/2022/day/6">sixth problem</a> essentially asked for maintaining a finite queue of English letters until it is distinct.  The most efficient way to do this is employing bit shifting for the FIFO and a bit set for the letters. <a href="https://trong.loang.net/~cnx/cp/commit?id&#61;f82f0b1a08f1">I implemented that</a> literally in the <a href="https://dlang.org/spec/betterc.html">Better C</a> subset of <a href="https://dlang.org">D</a>.</p>
<p>Although the language is around my age and influenced the big names like modern C&#43;&#43;, Swift and Zig,<sup id="fnref:cmp">[5]</sup> its documentation is pretty underwhelming and inconsistent.  For instance, the 128-bit integer type <code>cent</code> is documented as a <a href="https://dlang.org/spec/type.html#basic-data-types">basic data type</a>, however it only exists in the <a href="https://dlang.org/phobos/core_int128.html">core.int128</a> library with more cumbersome usage &#40;and doesn&#39;t work with <code>dmd -betterC</code>&#41;.</p>
<p>Like with Nim, D compilers also don&#39;t allow hyphens in source filenames, so I had to pipe the code to <code>dmd -of&#61;a.out -</code> &#40;the executable name would be randomized otherwise&#41;.</p>
<h2 id="day_seven">Day Seven</h2>
<p>On the first <a href="https://vine.co/v/iM0HnpBebd0">Wednesday</a> of the month of celebration, the <a href="https://adventofcode.com/2022/day/7">problem</a> was parsing <code>cd</code> and <code>ls</code>-like invocation and output to reconstruct a directory tree and do, uh, tree stuff.  <a href="https://janet-lang.org">Janet</a>&#39;s <a href="https://janet-lang.org/docs/peg.html">PEG module</a> was much more <a href="https://trong.loang.net/~cnx/cp/commit?id&#61;38d8920c7d7c">delightful</a> for parsing than regular expression on steroids like Raku&#39;s <a href="https://docs.raku.org/language/grammars">grammar</a>.</p>
<p>Writing imperative S-expressions felt dirty, though it&#39;s IMHO a quite better take than Lua, understandably as it was originally a redesign of <a href="https://fennel-lang.org">Fennel</a>.</p>
<h2 id="day_eight">Day Eight</h2>
<p>The <a href="https://adventofcode.com/2022/day/8">eighth problem</a> could be efficiently solved via dynamic programming on multidimensional arrays so I <a href="https://trong.loang.net/~cnx/cp/commit?id&#61;f8b0528d933f">used</a> Fortran for array programming. There&#39;s not much to say other than that it werkt and, ah yea, dynamic allocation didn&#39;t seem worth the effort so I ended up hardcoding the sizes.</p>
<h2 id="day_nine">Day Nine</h2>
<p>The <a href="https://adventofcode.com/2022/day/9">ninth task</a> was about sparse matrix transformation. Naturally I used hash table in Tcl for this purpose and the <a href="https://trong.loang.net/~cnx/cp/commit?id&#61;cde44cdda55d">solution</a> was straightforward enough. I am planning on extending a video game&#39;s level configuration to be programmable and the top contenders are now Lua/Fennel, Janet and Tcl.  No idea when I&#39;ll get to it, but I&#39;mma keep ya posted.</p>
<h2 id="day_ten">Day Ten</h2>
<p>On <a href="https://adventofcode.com/2022/day/10">day 10</a>, I needed to build a less-than-basic<sup id="fnref:egg">[6]</sup> calculator. I thought using AWK would spice things up a bit, but it actually simplified the <a href="https://trong.loang.net/~cnx/cp/commit?id&#61;5e4395eab495">solution</a>.  Instead of having to read and parse each operation, the script is executed for each input line, even allowing interleaving matching.  Therefore, the behavior specification could be followed closely without any significant effort on adapting the logic for the language.</p>
<p>I used to think of AWK as just a more verbose sed&#40;1&#41;. I was wrong and am glad that I was.  I guess AWK can come in pretty handy for similar real-world usages, such as log processing or moderately complex transformation of textual data.</p>
<h2 id="may_day">May Day</h2>
<p><a href="https://en.wikipedia.org/wiki/Oops&#33;..._I_Did_It_Again_&#40;album&#41;">Oops&#33;… I did it again.</a><sup id="fnref:2021">[2]</sup>  If you thought because I published this right after Christmas it must be a complete advent journal, I have played you for absolute fools&#33;  The later problems were increasingly parsing heavy, and while I still had languages I wanted to try, none left was designed for text processing.  I was also busy in meatspace at the time thus I couldn&#39;t find the time to write byte-level parsers in languages I didn&#39;t know.</p>
<p>I didn&#39;t try really hard nor got really far, but <a href="https://www.youtube.com/watch?v&#61;eVTXPUF4Oz4">in the end</a> maybe the <a href="https://www.youtube.com/watch?v&#61;l7r-R61W1DQ">real treasure</a> was the experiences I had along the way. I suppose the <a href="https://en.wikipedia.org/wiki/Contact_hypothesis">contact hypothesis</a> <em>might</em> be true, at least in this context<a href="https://www.youtube.com/watch?v&#61;M94ii6MVilw">;</a> my prejudice against many languages had been cleared away even after surface-level interactions.  You should probably also give it a try, who knows, it could be much <a href="https://en.wiktionary.org/wiki/gay#Middle_English">gay</a>er than you&#39;d expect&#33;</p>
<table class="fndef" id="fndef:master">
    <tr>
        <td class="fndef-backref">[1]</td>
        <td class="fndef-content">No, I have not been given any slave.</td>
    </tr>
</table><table class="fndef" id="fndef:2021">
    <tr>
        <td class="fndef-backref">[2]</td>
        <td class="fndef-content">I know, last year I already quit citing how janky later problems were.</td>
    </tr>
</table><table class="fndef" id="fndef:obj">
    <tr>
        <td class="fndef-backref">[3]</td>
        <td class="fndef-content">camelCase was popularized by mainstream object oriented languages.</td>
    </tr>
</table><table class="fndef" id="fndef:re">
    <tr>
        <td class="fndef-backref">[4]</td>
        <td class="fndef-content">Not really, reading byte-by-byte would also work, just less cool.</td>
    </tr>
</table><table class="fndef" id="fndef:cmp">
    <tr>
        <td class="fndef-backref">[5]</td>
        <td class="fndef-content">I feel underachieved now.</td>
    </tr>
</table><table class="fndef" id="fndef:egg">
    <tr>
        <td class="fndef-backref">[6]</td>
        <td class="fndef-content">No eggs were harmed in the making of the solution.</td>
    </tr>
</table>    <a href="mailto:cnx.site@loa.loang.net?In-Reply-To=%3Cblog/advent@cnx%3E&Subject=Re: Advent of Programming Languages">Reply via email</a>]]></content:encoded>
  <comments><![CDATA[https://lists.sr.ht/~cnx/site?search=In-Reply-To:%3Cblog/advent@cnx%3E]]></comments>
  <wfw:commentRss>https://lumvok.store/blog/advent/comments.xml</wfw:commentRss>
</item>
<item>
  <title>To Poo or Not to Poo</title>
  <link>https://lumvok.store/blog/nopoo/index.html</link>
  <guid>https://lumvok.store/blog/nopoo/index.html</guid>
  <description>Me experimenting with #nopoo</description>
  <category>lyf</category><category>exp</category>
  <pubDate>Sun, 23 May 2021 00:00:00 +0000</pubDate>
  <content:encoded><![CDATA[
<h1 id="to_poo_or_not_to_poo">To Poo or Not to Poo</h1>
<p>Late April 2021, Việt Nam witnessed the beginning of the fourth wave of SARS-CoV-2 after a few months without any community case.  Soon enough, students are told to not come to their schools&#39; campus.  This happens when I was an intern at <a href="https://usth.edu.vn">USTH</a> <a href="https://ictlab.usth.edu.vn">ICTLab</a>, so I was advised to work remotely as well.  I asked for this at the start of the internship but my supervisor was rather reluctant, since there was multiple interns working together and communication in person might be most effective.  Working from home was beneficial to me in a few important ways:</p>
<ol>
<li><p>I had a three-monitor setup at home and a more comfortable space.</p>
</li>
<li><p>I could have be more flexible working hours at home.</p>
</li>
<li><p>I did not have to bike back and forth to the lab &#40;which is 4 km away&#41; twice a day<sup id="fnref:1">[1]</sup>, which could be exhausting in the hot summer.</p>
</li>
</ol>
<p>Thanks to the last point, I also sweat a lot less and as I no longer had to maintain a public appearance, I decided to give <code>#nopoo</code> a try. I had been aware of such practice for quite a few years, but had never thought of actually implementing it until I saw <a href="https://www.youtube.com/watch?v&#61;T-_HKFjxVl0">Johnny Harris&#39; vlog</a>, which I can only describe as <em>intriguing</em>.  TL;DW the journalist maintained that generally shampoos washed away <em>his</em> scalp&#39;s natural oil, and in combination with other hair products made the scalp itchy and unhealthy. <em>His</em> solution was to drop the use of all products completely and so far it had been working <em>for him</em>.<sup id="fnref:2">[2]</sup></p>
<p>Well, my head was itchy sometimes &#40;still itchy at the time of writing&#41;, alors, <a href="https://polytechnique.edu">pour la patrie, les sciences et la gloire</a>, let&#39;s do it&#33;</p>
<h2 id="day_one">Day One</h2>
<p>I was going full no poo, no soap, no baking soda, no vinegar, <em>just water, raw water</em>.  Everything was going as expected, my hair was not as fluffy as usual after washing, but it was easier to get in shape.  I didn&#39;t really style my hair.  Not as a fashion statement, I was &#40;still am&#33;&#41; just rather lazy. Usually this wasn&#39;t an issue, unless when my hair was long, it tent to cover my forehead, ears and eyes, which was arguably an uncomfortable experience. Having the hair stay in place was indeed a blessing&#33;</p>
<h2 id="day_two">Day Two</h2>
<p>My hair started to feel thicker and running hands through it no longer felt simulating.  On the bright side it looked fabulous and did not itch.</p>
<h2 id="day_four">Day Four</h2>
<p>My hair and scalp began to feel greasy.  I guess it was because I did not wash it thoroughly that day.  With just water one would need to take more effort scrubbing the hair and especially the scalps to return them to a comfortable state.  Plus my mentality got worse so my perceived experience could be exaggeratedly negative.</p>
<h2 id="day_five">Day Five</h2>
<p>I worked out and paid more attention to the hair washing process. It felt noticeably better.</p>
<h2 id="day_six">Day Six</h2>
<p>The brief revival of my mental health did not last very long:<sup id="fnref:3">[3]</sup> later that day I was completely autopiloting and accidentally poo&#39;ed myself. It felt fluffy again but I was disappointed that things did not go as planned.</p>
<h2 id="day_seven">Day Seven</h2>
<p>I decided to cut my hair.  I had been doing so for a decade when I wrote this, but I got neither better nor faster at it, so it only happens twice or thrice a year.  Of course I had to poo myself after to get rid of all the tiny pieces.</p>
<h2 id="day_eleven">Day Eleven</h2>
<p>Fast forward a few days it started to feel greasy again, but this time the hair was shorter so it was less of an issue.  I began to apply <a href="https://en.wikipedia.org/wiki/Saline_&#40;medicine&#41;">saline</a> to the hair after washing and somehow it helped a lot in improving the situation.  Saline was also my solution for face acne in my teenage year &#40;along with finger nails and pillowcase hygiene&#41;.</p>
<h2 id="day_fifteen">Day Fifteen</h2>
<p>At this point the experience had become more stable.  My scalp still itched occasionally but seemly less often than when I was poo&#39;ing more regularly.  The hair stayed in shape with merely any effort &#40;I didn&#39;t even use a comb&#41;.</p>
<p>Overall, the difference is barely noticeable otherwise but I think I will be  continuing holding my poo for another while, probably in long term. Do not let my experience speak for you, however, try it yourself if you are interested, but keep observing the effect objectively.</p>
<table class="fndef" id="fndef:1">
    <tr>
        <td class="fndef-backref">[1]</td>
        <td class="fndef-content">I usually had lunch at home with my parents.</td>
    </tr>
</table><table class="fndef" id="fndef:2">
    <tr>
        <td class="fndef-backref">[2]</td>
        <td class="fndef-content">Emphases <em>his</em>.<sup id="fnref:4">[4]</sup></td>
    </tr>
</table><table class="fndef" id="fndef:3">
    <tr>
        <td class="fndef-backref">[3]</td>
        <td class="fndef-content">I later discovered that this was due to the lack of <a href="https://www.sunlightdish.com">sunlight</a>.</td>
    </tr>
</table><table class="fndef" id="fndef:4">
    <tr>
        <td class="fndef-backref">[4]</td>
        <td class="fndef-content">He stressed that this might not be the case for everyone.<sup id="fnref:5">[5]</sup></td>
    </tr>
</table><table class="fndef" id="fndef:5">
    <tr>
        <td class="fndef-backref">[5]</td>
        <td class="fndef-content">OK, I get it, footnotes are distracting.</td>
    </tr>
</table>    <a href="mailto:cnx.site@loa.loang.net?In-Reply-To=%3Cblog/nopoo@cnx%3E&Subject=Re: To Poo or Not to Poo">Reply via email</a>]]></content:encoded>
  <comments><![CDATA[https://lists.sr.ht/~cnx/site?search=In-Reply-To:%3Cblog/nopoo@cnx%3E]]></comments>
  <wfw:commentRss>https://lumvok.store/blog/nopoo/comments.xml</wfw:commentRss>
</item>
<item>
  <title>Google Summer of Code 2020</title>
  <link>https://lumvok.store/blog/2020/gsoc/index.html</link>
  <guid>https://lumvok.store/blog/2020/gsoc/index.html</guid>
  <description>GSoC 2020 final report</description>
  <category>fun</category><category>exp</category><category>gsoc</category><category>pkg</category><category>pip</category>
  <pubDate>Mon, 31 Aug 2020 00:00:00 +0000</pubDate>
  <content:encoded><![CDATA[
<h1 id="google_summer_of_code_2020">Google Summer of Code 2020</h1>
<p>In the summer of 2020, I worked with the contributors of <code>pip</code>, trying to improve the networking performance of the package manager. Admittedly, at the end of <a href="https://summerofcode.withgoogle.com/archive/2020/projects/6238594655584256">the internship</a> period, <a href="https://lumvok.store/blog/2020/gsoc/article/7/#the_benchmark">the benchmark said otherwise</a>; though I really hope the clean-up and minor fixes I happened to be doing to the codebase over the summer, in addition to the implementation of parallel utils and lazy wheel, might actually help the project.</p>
<p>Personally, I learned a lot: not just about Python packaging and networking stuff, but also on how to work with others.  I am really grateful to <a href=https://github.com/pradyunsg>@pradyunsg</a> &#40;my mentor&#41;, <a href=https://github.com/chrahunt>@chrahunt</a>, <a href=https://github.com/uranusjr>@uranusjr</a>, <a href=https://github.com/pfmoore>@pfmoore</a>, <a href=https://github.com/brainwane>@brainwane</a>, <a href=https://github.com/sbidoul>@sbidoul</a>, <a href=https://github.com/xavfernandez>@xavfernandez</a>, <a href=https://github.com/webknjaz>@webknjaz</a>, <a href=https://github.com/jaraco>@jaraco</a>, <a href=https://github.com/deveshks>@deveshks</a>, <a href=https://github.com/gutsytechster>@gutsytechster</a>, <a href=https://github.com/dholth>@dholth</a>, <a href=https://github.com/dstufft>@dstufft</a>, <a href=https://github.com/cosmicexplorer>@cosmicexplorer</a> and <a href=https://github.com/ofek>@ofek</a>.  While this feels like a long shout-out list, it really isn&#39;t.  These people are the maintainers, the contributors of <code>pip</code> and/or other Python packaging projects, and more importantly, they have been more than helpful, encouraging and patient to me throughout my every activities, showing me the way when I was lost, fixing me when I was wrong, putting up with my carelessness and showing me support across different social media.</p>
<p>To best serve the community, below I have tried my best to document what I have done, how I&#39;ve done it and why I&#39;ve done it for over the last three months.  At the time of writing, some work is still in progress, so these also serve as a reference point for myself and others to reason about decisions in relevant topics.</p>
<div class="franklin-toc"><ol><li>The Main Story<ol><li>Act One: Parallelization Utilities</li><li>Act Two: Lazy Wheels</li><li>Act Three: Late Downloading</li><li>Act Four: Batch Downloading in Parallel</li></ol></li><li>The Plot Summary</li></ol></div>
<h2 id="the_main_story">The Main Story</h2>
<p>The storyline can be divided into the following four main acts.</p>
<h3 id="act_one_parallelization_utilities">Act One: Parallelization Utilities</h3>
<p>In this first act, I ensured the portibility of parallelization measures for later use in the final act.  Multithreading and multiprocessing <code>map</code> were properly fellback on platforms without full support.</p>
<ul>
<li><p><a href=https://github.com/pypa/pip/pull/8320>GH-8320</a>: Add utilities for parallelization &#40;close <a href=https://github.com/pypa/pip/pull/8169>GH-8169</a>&#41;</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8538>GH-8538</a>: Make <code>utils.parallel</code> tests tear down properly</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8504>GH-8504</a>: Parallelize <code>pip list --outdated</code> and <code>--uptodate</code> &#40;using <a href=https://github.com/pypa/pip/pull/8320>GH-8320</a>&#41;</p>
</li>
</ul>
<h3 id="act_two_lazy_wheels">Act Two: Lazy Wheels</h3>
<p>As proposed by <a href=https://github.com/cosmicexplorer>@cosmicexplorer</a> in <a href=https://github.com/pypa/pip/pull/7819>GH-7819</a>, it is possible to only download a portion of a wheel to obtain metadata during dependency resolution. Not only that this would reduce the total amount of data to be transmitted over the network in case the resolver needs to perform heavy backtracking, but also it would create a synchronization point at the end of the resolution progress where parallel downloading can be applied to the needed wheels &#40;some wheels solely serve their metadata during dependency backtracking and are not needed by the users&#41;.</p>
<ul>
<li><p><a href=https://github.com/pypa/pip/pull/8467>GH-8467</a>: Add utitlity to lazily acquire wheel metadata over HTTP</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8584>GH-8584</a>: Revise lazy wheel and its tests</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8681>GH-8681</a>: Make range requests closer to chunk size &#40;help <a href=https://github.com/pypa/pip/pull/8670>GH-8670</a>&#41;</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8716>GH-8716</a> and <a href=https://github.com/pypa/pip/pull/8730>GH-8730</a>: Disable caching for range requests</p>
</li>
</ul>
<h3 id="act_three_late_downloading">Act Three: Late Downloading</h3>
<p>During this act, the main works were refactoring to integrate the <em>lazy wheel</em> into <code>pip</code>&#39;s codebase and clean up the way for download parallelization.</p>
<ul>
<li><p><a href=https://github.com/pypa/pip/pull/8411>GH-8411</a>: Refactor <code>operations.prepare.prepare_linked_requirement</code></p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8629>GH-8629</a>: Abstract away <code>AbstractDistribution</code> in higher-level resolver code</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8442>GH-8442</a>, <a href=https://github.com/pypa/pip/pull/8532>GH-8532</a> and <a href=https://github.com/pypa/pip/pull/8588>GH-8588</a> &#40;later reworked by <a href=https://github.com/chrahunt>@chrahunt</a> in <a href=https://github.com/pypa/pip/pull/8685>GH-8685</a>&#41;: Use lazy wheel to obtain dependency information for the new resolver</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8743>GH-8743</a>: Test hash checking for <code>fast-deps</code></p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8804>GH-8804</a>: Check download directory before making range requests</p>
</li>
</ul>
<h3 id="act_four_batch_downloading_in_parallel">Act Four: Batch Downloading in Parallel</h3>
<p>The final act is mostly about the UI of the parallel download. My work involved around how the progress should be displayed and how other relevant information should be reported to the users.</p>
<ul>
<li><p><a href=https://github.com/pypa/pip/pull/8710>GH-8710</a>: Revise method fetching metadata using lazy wheels</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8722>GH-8722</a>: Dedent late download logs &#40;fix <a href=https://github.com/pypa/pip/pull/8721>GH-8721</a>&#41;</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8737>GH-8737</a>: Add a hook for batch downloading</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8771>GH-8771</a>: Parallelize wheel download</p>
</li>
</ul>
<h2>The Side Quests</h2>
<p>In order to keep the wheel turning &#40;no pun intended&#41; and avoid wasting time waiting for the pull requests above to be reviewed, I decided to create even more PRs &#40;as I am typing this, many of the patches listed below are nowhere near being merged&#41;.</p>
<ul>
<li><p><a href=https://github.com/pypa/pip/pull/7878>GH-7878</a>: Fail early when install path is not writable</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/7928>GH-7928</a>: Fix rst syntax in Getting Started guide</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/7988>GH-7988</a>: Fix tabulate col size in case of empty cell</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8137>GH-8137</a>: Add subcommand alias mechanism</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8143>GH-8143</a>: Make mypy happy with beta release automation</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8248>GH-8248</a>: Fix typo and simplify ireq call</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8332>GH-8332</a>: Add license requirement to <code>_vendor/README.rst</code></p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8423>GH-8423</a>: Nitpick logging calls</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8435>GH-8435</a>: Use str.format style in logging calls</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8456>GH-8456</a>: Lint <code>src/pip/_vendor/README.rst</code></p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8568>GH-8568</a>: Declare constants in configuration.py as such</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8571>GH-8571</a>: Clean up <code>Configuration.unset_value</code> and nit <code>__init__</code></p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8578>GH-8578</a>: Allow verbose/quiet level to be specified via config files and environment variables</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8599>GH-8599</a>: Replace tabs by spaces for consistency</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8614>GH-8614</a>: Use <code>monkeypatch.setenv</code> to mock environment variables</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8674>GH-8674</a>: Fix <code>tests/functional/test_install_check.py</code>, when run with new resolver</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8692>GH-8692</a>: Make assertion failure give better message</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8709>GH-8709</a>: List downloaded distributions before exiting &#40;fix <a href=https://github.com/pypa/pip/pull/8696>GH-8696</a>&#41;</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8759>GH-8759</a>: Allow py2 deprecation warning from setuptools</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8766>GH-8766</a>: Use the new resolver for test requirements</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8790>GH-8790</a>: Mark tests using remote svn and hg as xfail</p>
</li>
<li><p><a href=https://github.com/pypa/pip/pull/8795>GH-8795</a>: Reformat a few spots in user guide</p>
</li>
</ul>
<h2 id="the_plot_summary">The Plot Summary</h2>
<p>Every Monday throughout the Summer of Code, I summarized what I had done in the week before in the form of either a short blog or an &#40;even shorter&#41; check-in.  These write-ups often contain handfuls of popular culture references and was originally hosted on <a href="https://blogs.python-gsoc.org/en/mcsinyxs-blog">Python GSoC</a>.</p>
<ul>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/checkin/1>First Check-In</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/article/1>Unexpected Things When You&#39;re Expecting</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/checkin/2>Second Check-In</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/article/2>The Wonderful Wizard of O&#39;zip</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/checkin/3>Third Check-In</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/article/3>I&#39;m Not Drowning On My Own</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/checkin/4>Fourth Check-In</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/article/4>I&#39;ve Walked 500 Miles…</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/checkin/5>Fifth Check-In</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/article/5>Sorting Things Out</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/checkin/6>Sixth Check-In</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/article/6>Parallelizing Wheel Downloads</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/checkin/7>Final Check-In</a></p>
</li>
<li><p><a href=https://lumvok.store/blog/2020/gsoc/article/7>Outro</a></p>
</li>
</ul>    <a href="mailto:cnx.site@loa.loang.net?In-Reply-To=%3Cblog/2020/gsoc@cnx%3E&Subject=Re: Google Summer of Code 2020">Reply via email</a>]]></content:encoded>
  <comments><![CDATA[https://lists.sr.ht/~cnx/site?search=In-Reply-To:%3Cblog/2020/gsoc@cnx%3E]]></comments>
  <wfw:commentRss>https://lumvok.store/blog/2020/gsoc/comments.xml</wfw:commentRss>
</item>
</channel></rss>