<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>llimllib's notes</title>
  <id>http://notes.billmill.org/</id>
  <link href="https://notes.billmill.org/atom.xml" rel="self" />
  <updated>2024-02-21T19:34:09.28562Z</updated>
  <generator uri="https://github.com/llimllib/obsidian_notes/" version="1.0">
    Obsidian Notes
  </generator>
  <author><name>Bill Mill</name></author>
  <entry>
    <id>https://notes.billmill.org/computer_usage/vim/otter.nvim.html</id>
    <link type="text/html" href="https://notes.billmill.org/computer_usage/vim/otter.nvim.html" />
    <title>otter.nvim</title>
    <published>2024-02-21T19:33:23Z</published>
    <updated>2024-02-21T19:33:23Z</updated>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/jmbuhr/otter.nvim/&quot;&gt;https://github.com/jmbuhr/otter.nvim/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://github.com/jmbuhr/otter.nvim/blob/main/doc/otter.nvim.txt&quot;&gt;https://github.com/jmbuhr/otter.nvim/blob/main/doc/otter.nvim.txt&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Otter.nvim provides lsp features and a code completion source for code embedded in other documents&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When messing around with &lt;a href=&quot;/link_blog/2024/02/Observable_Framework.html&quot;&gt;Observable Framework&lt;/a&gt; I really missed having code completion available in the markdown docs you end up writing.&lt;/p&gt;
&lt;p&gt;Setting up otter.nvim lets me do autocompletion inside fenced code blocks in markdown documents.&lt;/p&gt;
&lt;p&gt;It&#x27;s not perfect, because often you are writing javascript inside HTML inside the markdown block, and that doesn&#x27;t work, but it&#x27;s a pretty big improvement with a reasonably low cost.&lt;/p&gt;
&lt;p&gt;Here&#x27;s what it looks like, editing a plot inside a javascript code block in a markdown document:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/images/Pasted image 20240221143205.png&quot;&gt;&lt;img src=&quot;/images/Pasted image 20240221143205.png&quot; style=&quot;max-width: 800px&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It was reasonably easy to add it to my vim config: &lt;a href=&quot;https://github.com/llimllib/personal_code/commit/51e4e177&quot;&gt;commit 1&lt;/a&gt; &lt;a href=&quot;https://github.com/llimllib/personal_code/commit/36192827&quot;&gt;commit 2&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/visualization/interactive_explainers/Okay__color_spaces.html</id>
    <link type="text/html" href="https://notes.billmill.org/visualization/interactive_explainers/Okay__color_spaces.html" />
    <title>Okay, color spaces</title>
    <published>2024-02-21T15:43:40Z</published>
    <updated>2024-02-21T15:43:40Z</updated>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://ericportis.com/posts/2024/okay-color-spaces/&quot;&gt;https://ericportis.com/posts/2024/okay-color-spaces/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lovely 3d interactive visualizations of color spaces, in this case with a responsive 2d slice of the color space displayed beside it&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/images/Pasted image 20240221103330.png&quot;&gt;&lt;img src=&quot;/images/Pasted image 20240221103330.png&quot; style=&quot;max-width: 800px&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;The first attempt at “it” (a perceptually-uniform color space) was made by &lt;a href=&quot;https://en.wikipedia.org/wiki/Albert_Henry_Munsell&quot;&gt;Albert Munsell&lt;/a&gt;, who &lt;a href=&quot;https://www.gutenberg.org/files/26054/26054-h/26054-h.htm#tag5&quot;&gt;described his space in 1905&lt;/a&gt; (charmingly, as a “COLOR TREE”) and &lt;a href=&quot;https://library.si.edu/digital-library/book/atlasmunsellcol00muns&quot;&gt;published an “Atlas” to it in 1913&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The central “trunk” of Munsell’s TREE goes from black at the bottom, through grey in the middle, to white at the top. The middle expands outwards into a rainbow of “branches”, with each angle around the trunk representing a particular hue. Each branch starts off desaturated near the middle, and gets more and more saturated the further out it goes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/images/Pasted image 20240221103724.png&quot;&gt;&lt;img src=&quot;/images/Pasted image 20240221103724.png&quot; style=&quot;max-width: 800px&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;But – tragically! – &lt;a href=&quot;https://www.w3.org/Graphics/Color/Workshop/slides/talk/lilley#limit&quot;&gt;CIELAB isn’t exactly perceptually uniform&lt;/a&gt;. Worse, the more experiments people did, the clearer it became that &lt;em&gt;no&lt;/em&gt; three-dimensional space &lt;em&gt;could ever&lt;/em&gt; be perceptually uniform; three dimensions just cannot capture all of the weird and wonderful ways that our eyes and brains process color comparisons.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;Thankfully – turns out! – Oklab was explicitly designed so that movement up/down, in/out, and around the L axis works exactly like navigating Munsell’s COLOR TREE. Each type of movement changes &lt;em&gt;just one, psychologically-independent thing&lt;/em&gt;: the lightness, chroma, or hue of the color. In order to navigate Oklab like this, we need to use a polar coordinate system, instead of a rectangular one. When we do, we refer to the space by another name: &lt;code&gt;OKLCH&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a href=&quot;/images/Pasted image 20240221104210.png&quot;&gt;&lt;img src=&quot;/images/Pasted image 20240221104210.png&quot; style=&quot;max-width: 800px&quot;&gt;&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/visualization/colors/OKLCH_color_picker.html</id>
    <link type="text/html" href="https://notes.billmill.org/visualization/colors/OKLCH_color_picker.html" />
    <title>OKLCH color picker</title>
    <published>2024-02-21T15:43:40Z</published>
    <updated>2024-02-21T15:43:40Z</updated>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://oklch.com/#70,0.1,307,100&quot;&gt;https://oklch.com/#70,0.1,307,100&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;via a link from &lt;a href=&quot;/visualization/interactive_explainers/Okay__color_spaces.html&quot;&gt;Okay, color spaces&lt;/a&gt;, which explains what the OKLCH color scheme is and how it came to be, as well as why you might want to use it.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/book_notes/book_log/2024/02/Babel_-_RF_Kuang.html</id>
    <link type="text/html" href="https://notes.billmill.org/book_notes/book_log/2024/02/Babel_-_RF_Kuang.html" />
    <title>Babel - RF Kuang</title>
    <published>2024-02-21T15:43:40Z</published>
    <updated>2024-02-21T15:43:40Z</updated>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Robbery, butchery, and theft – they call these things empire, and where they create a desert, they call it peace.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/link_blog/2024/02/Pike_on_dependencies__Knuth_on_software.html</id>
    <link type="text/html" href="https://notes.billmill.org/link_blog/2024/02/Pike_on_dependencies__Knuth_on_software.html" />
    <title>Pike on dependencies, Knuth on software</title>
    <published>2024-02-21T14:52:28Z</published>
    <updated>2024-02-21T14:52:28Z</updated>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;if you look at almost any significant open source project you will see hundreds, even thousands of dependencies in the fully realized import tree, dependencies that are never checked, updates that are never verified as safe. Essentially no one maintains their dependency tree as they should, because it is infeasible to do so. We have built a machine that cannot be fixed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://phanpy.social/#/hachyderm.io/s/111960728489364881&quot;&gt;Rob Pike&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Somebody below that toot links to &lt;a href=&quot;https://www.informit.com/articles/article.aspx?p=1193856&quot;&gt;this 2008 interview with Knuth&lt;/a&gt;. Some excerpts:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;the idea of immediate compilation and &amp;quot;unit tests&amp;quot; appeals to me only rarely, when I’m feeling my way in a totally unknown environment and need feedback about what works and what doesn’t. Otherwise, lots of time is wasted on activities that I simply never need to perform or even think about. Nothing needs to be &amp;quot;mocked up.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let me put it this way: During the past 50 years, I’ve written well over a thousand programs, many of which have substantial size. I can’t think of even &lt;em&gt;five&lt;/em&gt; of those programs that would have been enhanced noticeably by parallelism or multithreading. Surely, for example, multiple processors are no help to TeX.[&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;literate programming is certainly the most important thing that came out of the TeX project. Not only has it enabled me to write and maintain programs faster and more reliably than ever before, and been one of my greatest sources of joy since the 1980s—it has actually been &lt;em&gt;indispensable&lt;/em&gt; at times. Some of my major programs, such as the MMIX meta-simulator, could not have been written with any other methodology that I’ve ever heard of. The complexity was simply too daunting for my limited brain to handle; without literate programming, the whole enterprise would have flopped miserably.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I also must confess to a strong bias against the fashion for reusable code. To me, &amp;quot;re-editable code&amp;quot; is much, much better than an untouchable black box or toolkit. I could go on and on about this. If you’re totally convinced that reusable code is wonderful, I probably won’t be able to sway you anyway, but &lt;strong&gt;you’ll never convince me that reusable code isn’t mostly a menace.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(emphasis mine)&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/link_blog/2024/02/How_I_write_HTTP_services_in_Go_after_13_years.html</id>
    <link type="text/html" href="https://notes.billmill.org/link_blog/2024/02/How_I_write_HTTP_services_in_Go_after_13_years.html" />
    <title>How I write HTTP services in Go after 13 years</title>
    <published>2024-02-20T17:34:53Z</published>
    <updated>2024-02-20T17:34:53Z</updated>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://grafana.com/blog/2024/02/09/how-i-write-http-services-in-go-after-13-years/&quot;&gt;https://grafana.com/blog/2024/02/09/how-i-write-http-services-in-go-after-13-years/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lots of useful production experience with golang services distilled into a blog post.&lt;/p&gt;
&lt;p&gt;Especially interesting to me that they have changed their own pattern to not making server structs; my own pattern does do so.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/music/music_blog/2024/02/Money_-_Barrett_Strong.html</id>
    <link type="text/html" href="https://notes.billmill.org/music/music_blog/2024/02/Money_-_Barrett_Strong.html" />
    <title>Money - Barrett Strong</title>
    <published>2024-02-20T15:09:03Z</published>
    <updated>2024-02-20T15:09:03Z</updated>
    <content type="html">&lt;p&gt;Woke up this morning with this song stuck in my head.&lt;/p&gt;
&lt;iframe style=&quot;border-radius:12px&quot; src=&quot;https://open.spotify.com/embed/track/0QMFMQF3HoSk5WvMyx8aMT?utm_source=generator&quot; width=&quot;100%&quot; height=&quot;352&quot; frameBorder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;The first single from Barry Gordy&#x27;s first record label (Tamla) in 1959, you&#x27;re probably more familiar with the Liverpool version released a few years later in 1963:&lt;/p&gt;
&lt;iframe style=&quot;border-radius:12px&quot; src=&quot;https://open.spotify.com/embed/track/3zw4FTrVNfy2teEkV9FOvh?utm_source=generator&quot; width=&quot;100%&quot; height=&quot;352&quot; frameBorder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Money_(That%27s_What_I_Want)&quot;&gt;Wikipedia&lt;/a&gt; linked me to this pretty hilarious new wave version from 1979 by The Flying Lizards:&lt;/p&gt;
&lt;iframe style=&quot;border-radius:12px&quot; src=&quot;https://open.spotify.com/embed/track/5rgY6vN5CaEL3boucCi3CT?utm_source=generator&quot; width=&quot;100%&quot; height=&quot;352&quot; frameBorder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/link_blog/2024/02/In_defense_of_simple_architectures.html</id>
    <link type="text/html" href="https://notes.billmill.org/link_blog/2024/02/In_defense_of_simple_architectures.html" />
    <title>In defense of simple architectures</title>
    <published>2024-02-20T15:00:51Z</published>
    <updated>2024-02-20T15:00:51Z</updated>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://danluu.com/simple-architectures/&quot;&gt;https://danluu.com/simple-architectures/&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;for most kinds of applications, even at top-100 site levels of traffic, computers are fast enough that high-traffic apps can be served with simple architectures, which can generally be created more cheaply and easily than complex architectures.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&#x27;s interesting that he argues that a Kubernetes-backed app running graphql is a &amp;quot;simple architecture&amp;quot;; I&#x27;m not disagreeing but it reinforces to me that what &amp;quot;simple&amp;quot; means is extremely context-dependent.&lt;/p&gt;
&lt;p&gt;&amp;quot;Simple&amp;quot; often means &amp;quot;things that are reasonably common knowledge on our team&amp;quot;.&lt;/p&gt;
&lt;p&gt;A corollary of that is that, by education and practice, you can &lt;em&gt;change&lt;/em&gt; what it means for something to be simple! Simple is what you do, and what you do is what&#x27;s simple &lt;strong&gt;as long as it&#x27;s well understood&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If it&#x27;s not well understood, by which I mean that deep understanding of the system is either not present at all, or not well-distributed among your team, then that&#x27;s what complexity is.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/programming/bash/brace_expansion.html</id>
    <link type="text/html" href="https://notes.billmill.org/programming/bash/brace_expansion.html" />
    <title>brace expansion</title>
    <published>2024-02-20T14:21:00Z</published>
    <updated>2024-02-20T14:21:00Z</updated>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://matttproud.com/blog/posts/tip-shell-brace-expansion.html&quot;&gt;https://matttproud.com/blog/posts/tip-shell-brace-expansion.html&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html&quot;&gt;https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;brace expansion&lt;/code&gt; is the name for the bash syntax often used for something like listing what files to prettify:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;prettier *.{js,jsx,ts}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;the article above gives some neat usages of it, I especially hadn&#x27;t considered that you can use it to make a cartesian product of expansions:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;highlight&quot;&gt;$ echo {a,b,c}{1,2,3}{α,β,γ}
a1α a1β a1γ a2α a2β a2γ a3α a3β a3γ b1α b1β b1γ b2α b2β b2γ b3α b3β b3γ c1α c1β c1γ c2α c2β c2γ c3α c3β c3γ
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can use a variable in a brace expansion:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;highlight&quot;&gt;$ ext=md; ls *.{$ext,js}
CHANGELOG.md       README.md          babel.config.js    jest.config.js     migrate.js*        postcss.config.js  tracing.js
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;as far as I know, however, you can&#x27;t do brace expansion on an array, which is unfortunate. I&#x27;d love to be able to say:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;highlight&quot;&gt;extensions=(js jsx md ts tsx)
prettier *.{${extensions[@]}}
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;but that doesn&#x27;t work: &lt;code&gt;*.{js: No such file or directory&lt;/code&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/programming/json/jql.html</id>
    <link type="text/html" href="https://notes.billmill.org/programming/json/jql.html" />
    <title>jql</title>
    <published>2024-02-18T19:19:33Z</published>
    <updated>2024-02-18T19:19:33Z</updated>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/yamafaktory/jql&quot;&gt;https://github.com/yamafaktory/jql&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another &lt;a href=&quot;/programming/json/jq.html&quot;&gt;jq&lt;/a&gt; or &lt;a href=&quot;/programming/json/jp.html&quot;&gt;jp&lt;/a&gt;-like json query tool, with another new syntax.&lt;/p&gt;
&lt;p&gt;Seems to be going for faster and simpler than either jq or jp.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/link_blog/2024/02/Paying_people_to_work_on_open_source_is_good_actually.html</id>
    <link type="text/html" href="https://notes.billmill.org/link_blog/2024/02/Paying_people_to_work_on_open_source_is_good_actually.html" />
    <title>Paying people to work on open source is good actually</title>
    <published>2024-02-16T22:05:45Z</published>
    <updated>2024-02-16T22:06:26Z</updated>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://jacobian.org/2024/feb/16/paying-maintainers-is-good/&quot;&gt;https://jacobian.org/2024/feb/16/paying-maintainers-is-good/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I have some minor quibbles, but I largely agree. Unfortunately because of the phrasing of the post I don&#x27;t feel comfortable sharing my quibbles, the author (whom I respect and have talked to, for what it&#x27;s worth) hasn&#x27;t left any room with their tone for productive disagreement.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/music/music_blog/2024/02/Lime_Garden_-_One_More_Thing.html</id>
    <link type="text/html" href="https://notes.billmill.org/music/music_blog/2024/02/Lime_Garden_-_One_More_Thing.html" />
    <title>Lime Garden - One More Thing</title>
    <published>2024-02-16T19:19:46Z</published>
    <updated>2024-02-16T19:19:46Z</updated>
    <content type="html">&lt;p&gt;fun pop-rock album:&lt;/p&gt;
&lt;iframe style=&quot;border-radius:12px&quot; src=&quot;https://open.spotify.com/embed/album/6jU18Jwl900BeZDrnyXkDB?utm_source=generator&quot; width=&quot;100%&quot; height=&quot;352&quot; frameBorder=&quot;0&quot; allowfullscreen=&quot;&quot; allow=&quot;autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/programming/json/jq.html</id>
    <link type="text/html" href="https://notes.billmill.org/programming/json/jq.html" />
    <title>jq</title>
    <published>2023-10-20T13:54:09Z</published>
    <updated>2024-02-16T14:22:20Z</updated>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://stedolan.github.io/jq/&quot;&gt;https://stedolan.github.io/jq/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Great tool for filtering, formatting, and outputting json.&lt;/p&gt;
&lt;p&gt;A bit cryptic though.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The manual is complete but not very thorough: &lt;a href=&quot;https://stedolan.github.io/jq/manual/&quot;&gt;https://stedolan.github.io/jq/manual/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;There&#x27;s a lot more information on the wiki: &lt;a href=&quot;https://github.com/stedolan/jq/wiki/jq-Language-Description&quot;&gt;https://github.com/stedolan/jq/wiki/jq-Language-Description&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Good intro article: &lt;a href=&quot;https://earthly.dev/blog/jq-select/&quot;&gt;https://earthly.dev/blog/jq-select/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I like that article better than the bit I wrote for work: &lt;a href=&quot;https://gist.github.com/llimllib/84a4345e87c5bc0758597c2052cbc680&quot;&gt;https://gist.github.com/llimllib/84a4345e87c5bc0758597c2052cbc680&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;jq&lt;/code&gt; appears to be largely unmaintained at this point, which is sad&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;update: &lt;a href=&quot;/link_blog/2023/09/jq_is_alive_again.html&quot;&gt;jq is alive again&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;convert json to csv, something I modified from stack overflow:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;div class=&quot;highlight&quot;&gt;cat some.json | jq -r &amp;#x27;(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv&amp;#x27;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/fadado/JBOL#-jbol-&quot;&gt;JBOL&lt;/a&gt; is a collection of jq modules you can install. &lt;a href=&quot;https://github.com/fadado/JBOL/blob/master/fadado.github.io/array/array.jq&quot;&gt;this is an example&lt;/a&gt; of some of the powerful stuff you can do with jq, I understand very little of it&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Find every package.json file in a monorepo (using &lt;a href=&quot;/computer_usage/cli_tips_and_tools/fd.html&quot;&gt;fd&lt;/a&gt;), and update the react version in dependencies or in peerDependencies, if it exists:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# update react in all package.json files&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# To install dependencies on a mac:&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# brew install fd jq sponge&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;dep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;if .dependencies.react != null then .dependencies.react = &amp;quot;^18.2.0&amp;quot; else . end&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;depDom&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;if .dependencies.&amp;quot;react-dom&amp;quot; != null then .dependencies.&amp;quot;react-dom&amp;quot; = &amp;quot;^18.2.0&amp;quot; else . end&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;peerDep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;if .peerDependencies.react != null then .peerDependencies.react = &amp;quot;18.x&amp;quot; else . end&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;peerDepDom&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;if .peerDependencies.&amp;quot;react-dom&amp;quot; != null then .peerDependencies.&amp;quot;react-dom&amp;quot; = &amp;quot;18.x&amp;quot; else . end&amp;#39;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;p&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;fd&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;package.json&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--exclude&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bower_components&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;jq&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$dep&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$p&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;jq&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$depDom&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;jq&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$peerDep&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;jq&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$peerDepDom&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;sponge&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$p&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/link_blog/2024/02/EffVer.html</id>
    <link type="text/html" href="https://notes.billmill.org/link_blog/2024/02/EffVer.html" />
    <title>EffVer</title>
    <published>2024-02-16T14:01:14Z</published>
    <updated>2024-02-16T14:01:14Z</updated>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://jacobtomlinson.dev/effver/&quot;&gt;https://jacobtomlinson.dev/effver/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/images/Pasted image 20240216085956.png&quot;&gt;&lt;img src=&quot;/images/Pasted image 20240216085956.png&quot; style=&quot;max-width: 800px&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;EffVer follows the same pattern of incrementing numbers to communicate with users that SemVer does, and is forward and backward compatible with SemVer (you don’t need to use something like a &lt;a href=&quot;https://packaging.python.org/en/latest/specifications/version-specifiers/#version-epochs&quot;&gt;Python version epoch&lt;/a&gt; to switch between the two schemes). The difference is that instead of quantifying the orthogonality of a change EffVer tries to quantify the intended work required to adopt the change.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In a world where somebody relies on every observable behavior of your program, there&#x27;s no sense in trying to guess if you&#x27;ve broken backwards compatibility or not.&lt;/p&gt;
&lt;p&gt;I think this scheme captures the reality of semantic versioning pretty well, and doesn&#x27;t promise what it can&#x27;t deliver. Fun idea.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://notes.billmill.org/programming/javascript/CLI_tools/clack.html</id>
    <link type="text/html" href="https://notes.billmill.org/programming/javascript/CLI_tools/clack.html" />
    <title>clack</title>
    <published>2024-02-16T03:11:37Z</published>
    <updated>2024-02-16T13:47:29Z</updated>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/natemoo-re/clack&quot;&gt;https://github.com/natemoo-re/clack&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.clack.cc/&quot;&gt;https://www.clack.cc/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;effortlessly-build-beautiful-command-line-apps-&quot;&gt;Effortlessly build beautiful command-line apps 🪄&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/natemoo-re/clack/blob/main/packages/core#readme&quot;&gt;&lt;code&gt;@clack/core&lt;/code&gt;&lt;/a&gt;: unstyled, extensible primitives for CLIs&lt;br /&gt;
&lt;a href=&quot;https://github.com/natemoo-re/clack/blob/main/packages/prompts#readme&quot;&gt;&lt;code&gt;@clack/prompts&lt;/code&gt;&lt;/a&gt;: beautiful, ready-to-use CLI prompt components&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I just released &lt;a href=&quot;https://github.com/readmeio/rendish&quot;&gt;a render CLI tool&lt;/a&gt; today, and it uses a much simpler system for prompts. Possibly I should use this to polish that up.&lt;/p&gt;
&lt;p&gt;Found via &lt;a href=&quot;/link_blog/2024/02/Observable_Framework.html&quot;&gt;Observable Framework&lt;/a&gt;, which uses it to good effect.&lt;/p&gt;
</content>
  </entry>
</feed>