<?xml version='1.0' encoding='utf-8' ?>

<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>The Mandelbear&apos;s Musings</title>
  <link>https://mdlbear.dreamwidth.org/</link>
  <description>The Mandelbear&apos;s Musings - Dreamwidth Studios</description>
  <lastBuildDate>Thu, 01 Feb 2024 05:42:11 GMT</lastBuildDate>
  <generator>LiveJournal / Dreamwidth Studios</generator>
  <lj:journal>mdlbear</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>https://v2.dreamwidth.org/15740388/505737</url>
    <title>The Mandelbear&apos;s Musings</title>
    <link>https://mdlbear.dreamwidth.org/</link>
    <width>96</width>
    <height>96</height>
  </image>

<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1888379.html</guid>
  <pubDate>Thu, 01 Feb 2024 05:42:11 GMT</pubDate>
  <title>Rant: Patient Portal as a (dis)Service</title>
  <link>https://mdlbear.dreamwidth.org/1888379.html</link>
  <description>&lt;p&gt; \begin{rant}
&lt;p&gt; If you look at &lt;a href=&quot;https://mdlbear.dreamwidth.org/1888223.html&quot;&gt;Done
    Since 2024-01-21&lt;/a&gt; and scroll down to Friday (or search for &quot;0126Fr&quot;),
    you&apos;ll find an uncharacteristically-long log item that starts out &quot;contact
    liberatormedical.com Customer Service&quot;... followed by a series of
    &apos;&lt;code&gt;-&amp;gt;&lt;/code&gt;&apos; items.  When you see this sort of thing, it&apos;s often a
    sign that &lt;a href=&quot;https://xkcd.com/386/&quot;&gt;Someone (or more likely some
    &lt;em&gt;company&lt;/em&gt;) is &lt;u&gt;WRONG&lt;/u&gt; on the Internet&lt;/a&gt;.

&lt;p&gt; This has gotten long, so I&apos;m putting it under a &lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://mdlbear.dreamwidth.org/1888379.html#cutid1&quot;&gt;cut tag.&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;
&lt;p&gt; \end{rant}&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1888379&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1888379.html</comments>
  <category>x-as-a-service</category>
  <category>health-care</category>
  <category>web</category>
  <category>software</category>
  <category>web-services</category>
  <lj:mood>annoyed but not surprised</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1858611.html</guid>
  <pubDate>Fri, 07 Apr 2023 16:54:08 GMT</pubDate>
  <title>Happy Birthday to Git, and a signal boost</title>
  <link>https://mdlbear.dreamwidth.org/1858611.html</link>
  <description>&lt;p&gt; The &lt;a href=&quot;https://en.wikipedia.org/wiki/Git&quot;&gt;Git&lt;/a&gt; version-control
    system was released 18 years ago today, so it&apos;s old enough to vote in the
    US.  (The most recent version, 2.40.0, was released this year on
    &lt;em&gt;my&lt;/em&gt; birthday.  But I digress.)

&lt;p&gt; In related news, I&apos;d like to join &lt;a href=&quot;https://elf.dreamwidth.org/862272.html&quot;&gt;elf&lt;/a&gt; and &lt;a href=&quot;https://ysabetwordsmith.dreamwidth.org/13925560.html&quot;&gt;ysabetwordsmith&lt;/a&gt; in boosting the signal for &lt;a href=&quot;https://www.kickstarter.com/projects/essential-randomness/the-fujoshi-guide-to-web-development&quot;&gt;&lt;cite&gt;The Fujoshi Guide to Web Development&lt;/cite&gt; by Essential Randomness,
    on Kickstarter&lt;/a&gt;.

&lt;blockquote&gt;
&lt;p&gt; The Fujoshi Guide to Web Development is a series of zines/books featuring
    anthropomorphized versions of programming languages and concepts (aka
    gijinka), each one engineered from the ground up to cater to
    transformational fandom&apos;s sensibilities and interests.
&lt;/p&gt;&lt;/blockquote&gt;

&lt;span style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;https://elf.dreamwidth.org/profile&apos;&gt;&lt;img src=&apos;https://www.dreamwidth.org/img/silk/identity/user.png&apos; alt=&apos;[personal profile] &apos; width=&apos;17&apos; height=&apos;17&apos; style=&apos;vertical-align: text-bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;https://elf.dreamwidth.org/&apos;&gt;&lt;b&gt;elf&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; &lt;a href=&quot;https://elf.dreamwidth.org/862272.html&quot;&gt;summarizes
    it&lt;/a&gt; as:

&lt;blockquote&gt;
&lt;p&gt; &lt;strong&gt;Problem:&lt;/strong&gt; The corporate webosphere is all based on public feeds of
    identical-looking scrolling content. Fandom has mostly lost the habit of
    creating their own webspaces for purposes other than constant
    interaction. But most of the tutorials are horribly hostile to beginners,
    or to fandom purposes, or both. 
&lt;p&gt; &lt;strong&gt;Solution:&lt;/strong&gt; Learn web development from hot anime guys in a
    dating sim. Well, not actually a dating sim. But it looks like a dating
    sim.
&lt;/p&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt; ... and appropriately enough the &lt;a href=&quot;https://experimental.essentialrandomness.com/fujoweb/Git_Zine.pdf&quot;&gt;first demo&lt;/a&gt; is about Git (personified as a hawt catboy).  (My guess is
    that Git&apos;s persona was chosen so that they could personify GitHub as an
    octocat-boy.) I&apos;m not in the target demographic, obviously, but I&apos;m all
    for anything that promises to get fans and other outsiders hooked on web
    development and version control.&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1858611&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1858611.html</comments>
  <category>software</category>
  <category>tutorials</category>
  <category>signal-boost</category>
  <category>git</category>
  <category>web</category>
  <lj:mood>amused</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1787951.html</guid>
  <pubDate>Wed, 29 Sep 2021 23:34:59 GMT</pubDate>
  <title>Public Service Announcement: Things to watch out for</title>
  <link>https://mdlbear.dreamwidth.org/1787951.html</link>
  <description>&lt;p&gt; A rather mixed bag of things that, arguably, I should have written about a
    week ago.

&lt;p&gt; &lt;strong&gt;1: the Let&apos;s Encrypt root certificate&lt;/strong&gt;.

&lt;p&gt; Hopefully this won&apos;t affect you, but if your browser starts complaining
    about websites suddenly being untrusted, you need to upgrade.  The problem
    is that &lt;a href=&quot;https://scotthelme.co.uk/lets-encrypt-old-root-expiration/&quot;&gt;Let&apos;s Encrypt&apos;s root certificate is expiring&lt;/a&gt;,  and will be replaced
    by a new one (see the link above for details).  Starting October
    1&lt;sup&gt;st&lt;/sup&gt;, browsers and other programs that rely on the old cert will
    have problems if they haven&apos;t been upgraded in the last year.

&lt;p&gt; You keep your OS and your browser up to date, right?  There are some old
    apps and operating systems that are no longer receiving upgrades, and so
    won&apos;t know about the new root cert.  Specifically, if you&apos;re using one of
    these products: 

&lt;blockquote&gt;
&lt;p&gt; OpenSSL &amp;lt;= 1.0.2, Windows &amp;lt; XP SP3, macOS &amp;lt; 10.12.1, iOS &amp;lt; 10 (iPhone 5 is
    the lowest model that can get to iOS 10), Android &amp;lt; 7.1.1 (but &amp;gt;= 2.3.6
    will still mostly work), Mozilla Firefox &amp;lt; 50, Ubuntu &amp;lt; 16.04, Debian &amp;lt; 8,
    Java 8 &amp;lt; 8u141, Java 7 &amp;lt; 7u151, NSS &amp;lt; 3.26, Amazon FireOS (Silk Browser).
&lt;p&gt; Possibly, Cyanogen &amp;gt; v10, Jolla Sailfish OS &amp;gt; v1.1.2.16, Kindle &amp;gt; v3.4.1,
    Blackberry &amp;gt;= 10.3.3, PS4 game console with firmware &amp;gt;= 5.00, IIS
&lt;/p&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt; (You can probably uptrade to the newest Firefox or switch to a recent
    version of Chrome, which will restore your ability to browse the web, but
    a few other things might still fail.  (For example, Firefox will keep
    working on my ancient Mac Mini, but Safari probably won&apos;t.)

&lt;p&gt; The following articles go into a lot more detail; you can get a good
    overview from the first two:

&lt;blockquote style=&quot;white-space: pre-wrap;&quot;&gt;
    &lt;a href=&quot;https://www.tomsguide.com/news/smart-home-cert-disaster&quot;&gt;Smart TVs, fridges and light bulbs may stop working next year: Here&apos;s why&lt;/a&gt;
    &lt;a href=&quot;https://www.theregister.com/2020/06/10/iot_trouble_root_certificates_expire/&quot;&gt;An Internet of Trouble lies ahead as root certificates begin to expire en masse,
    warns security researcher • The Register&lt;/a&gt;
    &lt;a href=&quot;https://scotthelme.co.uk/impending-doom-root-ca-expiring-legacy-clients/&quot;&gt;The Impending Doom of Expiring Root CAs and Legacy Clients&lt;/a&gt;
    &lt;a href=&quot;https://scotthelme.co.uk/lets-encrypt-old-root-expiration/&quot;&gt;Let&apos;s Encrypt&apos;s Root Certificate is expiring!&lt;/a&gt;
    &lt;a href=&quot;https://letsencrypt.org/docs/certificate-compatibility/&quot;&gt;Certificate Compatibility - Let&apos;s Encrypt&lt;/a&gt;
&lt;/blockquote&gt;


&lt;p&gt; &lt;strong&gt;2. Phillips Respironics CPAP recall:&lt;/strong&gt;

&lt;p&gt; If you&apos;re using a CPAP made by Phillips Respironics, hopefully you&apos;ve
    already seen the &lt;a href=&quot;https://www.usa.philips.com/healthcare/e/sleep/communications/src-update?gclid=82212d7d0dc01f190af24c31a4f960a2&amp;amp;gclsrc=3p.ds#cpap_devices&quot;&gt;Recall Notification&lt;/a&gt; &lt;a href=&quot;https://www.philips.com/c-dam/b2bhc/master/landing-pages/src/update/documents/philips-recall-letter-2021-05-a-2021-06-a.pdf&quot;&gt;[PDF]&lt;/a&gt;.  I missed it, through my habit of ignoring notifications in
     the Dreamstation app and website.  The email I got from Medicare says:

&lt;blockquote&gt;
&lt;p&gt; If you own or rent one of the Philips products that was recalled, talk to
      your doctor as soon as possible about whether to continue using your
      recalled equipment.  If you would like to replace or repair your
      equipment, the supplier you bought the equipment from is responsible for
      replacing or repairing rental equipment at no cost to you when the
      equipment is less than 5 years old.
&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt; If, like me, you insist on continuing to use your facehugger, install an
    antibacterial filter, which will keep little bits of soundproofing foam
    out of your lungs.  This is probably only necessary if you&apos;ve been using
    ozone to clean your device, but I decided not to take chances.

&lt;p&gt; &lt;strong&gt;3. Chevrolet Bolt EV recall:&lt;/strong&gt;

&lt;p&gt; If you own a Bolt, you should have received &lt;a href=&quot;https://www.chevrolet.com/electric/bolt-recall&quot;&gt;several letters
    about this recall&lt;/a&gt;.  Hopefully you haven&apos;t been throwing them away
    unread, but if you have, you&apos;ll want to enable &quot;hilltop reserve&quot; to limit
    your charging to 90%, don&apos;t run your battery down below about 70 miles,
    park outside immediately after charging, and don&apos;t leave your Bolt
    charging indoors overnight.  &quot;Experts from GM and LG have identified the
    simultaneous presence of two rare manufacturing defects in the same
    battery cell as the root cause of battery fires in certain Chevrolet Bolt
    EVs.&quot;  You don&apos;t want to take chances with battery fires.  They&apos;re
    &lt;em&gt;nasty&lt;/em&gt;; lithium is perfectly capable of burning under water.

&lt;p&gt; &lt;strong&gt;Be safe out there.&lt;/strong&gt;

&lt;p&gt; On a more hopeful(?  helpful, at least) note, &lt;a href=&quot;https://dialecticdreamer.dreamwidth.org/&quot;&gt;dialecticdreamer&lt;/a&gt; has
    posted &lt;a href=&quot;https://dialecticdreamer.dreamwidth.org/937100.html&quot;&gt;Demifiction:  Breaking Omaha!&lt;/a&gt;, which despite being set in a fictional
    universe contains a lot of practical advice for disaster preparedness.&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1787951&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1787951.html</comments>
  <category>psa</category>
  <category>software</category>
  <category>signal boost</category>
  <category>computers</category>
  <category>recalls</category>
  <lj:mood>informative</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1720554.html</guid>
  <pubDate>Sat, 09 May 2020 20:14:00 GMT</pubDate>
  <title>Songs for Saturday:  Singing in the time of COVID19</title>
  <link>https://mdlbear.dreamwidth.org/1720554.html</link>
  <description>&lt;p&gt; You may remember that, somewhat over a month ago, I asked whether there
    were any &lt;a href=&quot;https://mdlbear.dreamwidth.org/1713190.html&quot;&gt;tools for
    voice teaching online&lt;/a&gt;.  I didn&apos;t get any useful suggestions.  (Discord
    was suggested, but with &lt;a href=&quot;https://support.discord.com/hc/en-us/articles/211376518-Voice-Input-Modes-101-Push-to-Talk-Voice-Activated-&quot;&gt;an inherent 200ms delay&lt;/a&gt; it would be pretty useless for teaching or
    band practice.)

&lt;p&gt; Since then, a couple of things -- not necessarily answers -- have turned
    up.  From the &lt;a href=&quot;https://www.nats.org/&quot;&gt;National Association of
    Teachers of Singing&lt;/a&gt;, we have a &lt;a href=&quot;https://www.nats.org/cgi/page.cgi/_article.html/Featured_Stories_/NATS_COVID_Resources_Page&quot;&gt;COVID Resources Page&lt;/a&gt; and two video panel discussions: &lt;a href=&quot;https://www.youtube.com/watch?v=Uw8U5ULL40o&quot;&gt;Emergency NATS Chat
    Calming the Coronavirus Crisis and Taking Your Teaching Online
    #natschats&lt;/a&gt;, and &lt;a href=&quot;https://www.youtube.com/watch?v=DFl3GsVzj6Q&quot;&gt;A Conversation: What Do Science and Data Say About the Near Term Future
    of Singing&lt;/a&gt;.  The description of the latter is:

&lt;blockquote&gt;
  &lt;p&gt; The National Association of Teachers of Singing, the American Choral
      Directors Association (ACDA), Chorus America, Barbershop Harmony Society, and
      Performing Arts Medical Association (PAMA) present an important webinar about the
      near term future of singing as we seek fact based solutions in protecting our
      singers, teachers, and conductors during this time. 
&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt; There are more specialized services specifically for jamming that were
    mentioned in some of the related discussions -- &lt;a href=&quot;https://www.jamkazam.com/&quot;&gt;JamKazam&lt;/a&gt;, &lt;a href=&quot;http://llcon.sourceforge.net/&quot;&gt;Jamulus&lt;/a&gt;, and &lt;a href=&quot;https://www.cockos.com/ninjam/&quot;&gt;NINJAM&lt;/a&gt;, and a couple of others.
    With the possible exception of JamKazam they all work by delaying sound by
    an integral number of beats or bars, which may work for improvisation but
    probably not for teaching.  It&apos;s difficult to find good comparisons.
    There&apos;s a conversation going on in &lt;a href=&quot;https://www.gearslutz.com/board/music-computers/1076615-best-online-remote-band-rehearsal-software.html&quot;&gt;this forum&lt;/a&gt;; the 2020 part starts on &lt;a href=&quot;https://www.gearslutz.com/board/music-computers/1076615-best-online-remote-band-rehearsal-software-3.html&quot;&gt;Page 3&lt;/a&gt;.  Jitsi might work, too, perhaps with a lightly-loaded private
    server.

&lt;p&gt; (added 5/12) &lt;a href=&quot;https://www.voicelessons.com/teachers&quot;&gt;VoiceLessons.com&lt;/a&gt; was recommended in one of the NATS videos; didn&apos;t
    make it onto the list in the previous paragraph because it wouldn&apos;t be
    useful to most of my readership, but definitely worth a look if you&apos;re
    teaching. 

&lt;p&gt; Disclaimer:  I have not (yet) worked through all -- or even most -- of the
    stuff linked from NATS, and I have not tried any of the remote jam
    software. 

&lt;p&gt; &amp;nbsp;

&lt;p&gt; For performers who want to stream concerts, there are lots more options.
    Here is a blog post on the &lt;a href=&quot;https://joannecooper.co.za/blogs/latest-news/posts/pros-and-cons-of-6-live-streaming-sites-for-musicians&quot;&gt;Pros and Cons of 6 live streaming sites for musicians&lt;/a&gt; (from 2016, so
    a bit dated), and &lt;a href=&quot;https://sites.google.com/view/crosscurrents-music&quot;&gt;Lynn Noel&apos;s&lt;/a&gt;
    &lt;a href=&quot;https://crosscurrentsmusic.blogspot.com/&quot;&gt;Crosscurrents
    Blog&lt;/a&gt;.  Lynn has been hosting virtual &quot;house concerts&quot; recently, and
    has written a great blog series about how to do it.

&lt;ul&gt;
  &lt;li&gt; &lt;a href=&quot;https://crosscurrentsmusic.blogspot.com/2020/03/live-from-mermaids-tavern-part-i.html&quot;&gt;Live From the Mermaid&apos;s Tavern Part I: Digital Houseconcerts in the Age of COVID-19&lt;/a&gt;
  &lt;li&gt; &lt;a href=&quot;https://crosscurrentsmusic.blogspot.com/2020/03/live-from-mermaids-tavern-part-ii-set.html&quot;&gt;Live from the Mermaid&apos;s Tavern Part II: Set Up, Schedule, and Announce a Livestream&lt;/a&gt;
  &lt;li&gt; &lt;a href=&quot;https://crosscurrentsmusic.blogspot.com/2020/03/live-from-mermaids-tavern-part-iii.html&quot;&gt;Live from the Mermaid&apos;s Tavern Part III: Going Live on Facebook&lt;/a&gt;
  &lt;li&gt; &lt;a href=&quot;https://crosscurrentsmusic.blogspot.com/2020/03/q-for-online-sessions-i-is-it-app-or-my.html&quot;&gt;Q&amp;A for Online Sessions I: Is It The App, Or My Internet?&lt;/a&gt;
  &lt;li&gt; &lt;a href=&quot;https://crosscurrentsmusic.blogspot.com/2020/04/q-for-online-sessions-ii-livestreaming.html&quot;&gt;Q&amp;A for Online Sessions II: Livestreaming Setup Checklist&lt;/a&gt;
  &lt;li&gt; &lt;a href=&quot;https://crosscurrentsmusic.blogspot.com/2020/04/q-for-online-sessions-iii-managing.html&quot;&gt;Q&amp;A For Online Sessions III: Managing Performers, Singers, and Listeners&lt;/a&gt;
  &lt;li&gt; &lt;a href=&quot;https://crosscurrentsmusic.blogspot.com/2020/04/live-from-mermaids-tavern-participant.html&quot;&gt;Live From the Mermaid&apos;s Tavern Participant FAQ&lt;/a&gt;
  &lt;li&gt; &lt;a href=&quot;https://crosscurrentsmusic.blogspot.com/2020/05/live-from-mermaids-tavern-houseconcert.html&quot;&gt;Live From the Mermaid&apos;s Tavern Houseconcert FAQ&lt;/a&gt;
  &lt;li&gt; &lt;a href=&quot;https://crosscurrentsmusic.blogspot.com/2020/04/live-from-mermaids-tavern-reflections.html&quot;&gt;Live From the Mermaid&apos;s Tavern: Reflections on Our First Six Weeks&lt;/a&gt;
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;


&lt;p&gt; I&apos;ll close with a quote from the  last section, titled &quot;Crisis and Transformation&quot; of &lt;a href=&quot;https://crosscurrentsmusic.blogspot.com/2020/04/live-from-mermaids-tavern-reflections.html&quot;&gt;Reflections on Our First Six Weeks&lt;/a&gt;.  (I&apos;d link to it directly, but
    the sections don&apos;t have IDs.) Then double back and read the rest.

    (taken out of sequence because it makes a good closer)
&lt;blockquote&gt;
  &lt;p&gt; Crisis builds community from within. Six weeks ago, my mom had just
      died, I was laid off, my knee replacement had just been postponed as an
      elective surgery, and the Mermaid&apos;s Tavern was a pile of old Macs and
      cables in my basement. I needed motivation to face a pandemic day to
      day. I found it in a community that urgently needed to sing
      together. Thank you all for making me believe I too could be essential.

  &lt;p&gt; We WILL make harmony again in real time. Harmony is like bread:
      staple soul food, powered by a living community organism. There&apos;s
      nothing like it hot and fresh. Still, once you&apos;ve sung with dear
      friends across five time zones, there&apos;s no going back. Online
      community is here to stay. Come on down to the Mermaid&apos;s Tavern.
&lt;/p&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt; Feel free to point me at other resources in the comments.&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1720554&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1720554.html</comments>
  <category>singing</category>
  <category>streaming</category>
  <category>s4s</category>
  <category>meta</category>
  <category>links</category>
  <category>covid-19</category>
  <category>music</category>
  <category>software</category>
  <lj:music>online?</lj:music>
  <lj:mood>down</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1713190.html</guid>
  <pubDate>Tue, 24 Mar 2020 04:35:55 GMT</pubDate>
  <title>Query: Tools for voice teaching online?</title>
  <link>https://mdlbear.dreamwidth.org/1713190.html</link>
  <description>&lt;p&gt; If you&apos;ve been reading this journal for a while, you probably know that
    I&apos;ve been taking singing lessons.  (Comparatively few of you have heard me
    sing recently; those who have say that the improvement has been
    noticable.)

&lt;p&gt; And even if you&apos;ve only been reading for the last week, you&apos;ll know that
    I&apos;ve been &quot;socially distancing&quot; myself -- I&apos;m in a high-risk category due
    to my age, and not going out of the house for anything but medical
    appointments and food.  Singing lessons aren&apos;t &quot;essential&quot;, so I&apos;ve
    stopped going -- and Nancy, my singing teacher, has a huge problem.  

&lt;p&gt; So I&apos;m asking the lazy web for help finding a videoconferencing system
    that can be used for singing lessons.  I want Nancy to be able to play
    something on a MIDI keyboard and hear me singing along with it.  That
    would require suppressing the normal simultaneous monitoring on the
    teacher&apos;s end -- the MIDI should play only on my end, and get mixed with
    my voice at that point.  But when Nancy is using her microphone, the
    return channel has to be muted.  And if she wants to sing along with
    something she&apos;s playing, she needs to hear the keyboard at &lt;em&gt;her&lt;/em&gt;
    end, without the round-trip delay.

&lt;p&gt; I&apos;m beginning to suspect that the only way to get all of this is to write
    it myself, but I&apos;d love to be proved wrong.  Meanwhile, I&apos;d settle for
    something with extremely low transmission delay; that would mean
    point-to-point rather than going through a server.

&lt;p&gt; And if any of you are giving lessons remotely, I&apos;d love to hear what works
    for you.&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1713190&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1713190.html</comments>
  <category>covid-19</category>
  <category>query</category>
  <category>music</category>
  <category>software</category>
  <category>tech</category>
  <lj:music>online</lj:music>
  <lj:mood>curious</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1701810.html</guid>
  <pubDate>Sun, 29 Dec 2019 03:18:20 GMT</pubDate>
  <title>test4</title>
  <link>https://mdlbear.dreamwidth.org/1701810.html</link>
  <description>test headers
(crossposted from $BLOGIN)&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1701810&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1701810.html</comments>
  <category>test</category>
  <category>software</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1692062.html</guid>
  <pubDate>Wed, 06 Nov 2019 06:05:00 GMT</pubDate>
  <title>How to MakeStuff (blogging)</title>
  <link>https://mdlbear.dreamwidth.org/1692062.html</link>
  <description>&lt;p&gt; Today the computer curmudgeon talks about how he blogs.

&lt;p&gt; I think it&apos;s widely known that I update this journal (and by that I mean
    both my Dreamwidth journal, which you are probably reading now,
    &lt;em&gt;and&lt;/em&gt; my &lt;a href=&quot;https://computer-curmudgeon.com/&quot;&gt;Computer
    Curmudgeon&lt;/a&gt; website), using a rickety combination of shell scripts and
    makefiles called &lt;a href=&quot;https://github.com/ssavitzky/MakeStuff&quot;&gt;MakeStuff&lt;/a&gt;.  There are several good reasons for that.  (Whether
    &quot;because I can&quot; is a good reason or not is debatable.  There are others.)

&lt;p&gt; A little over a year ago I made a &lt;a href=&quot;https://mdlbear.dreamwidth.org/1631514.html&quot;&gt;planning post&lt;/a&gt;, and
    the &quot;Where I am now&quot; section remains a pretty good, albeit sketchy,
    description of the process.  There&apos;s also an even sketchier one in the &lt;a href=&quot;https://github.com/ssavitzky/MakeStuff/tree/master/blogging&quot;&gt;README
    file for MakeStuff/blogging&lt;/a&gt;.  It had a list of what I wanted to do
    next, but essentially the only thing I&apos;ve actually done is posting in
    either HTML or Markdown.

&lt;p&gt; I have, however, reorganized things a bit, so that all of the relevant
    scripts are in MakeStuff/blogging -- the last part was moving in the
    script, now called &lt;code&gt;charm-wrapper&lt;/code&gt;, that takes the post&apos;s
    metadata out of its email-like header and turns it into a command line for
    &lt;a href=&quot;https://github.com/ssavitzky/charm&quot;&gt;charm&lt;/a&gt;, a
    livejournal/dreamwidth posting client written in Python.  It isn&apos;t a very
    good solution, but it works.

&lt;p&gt; And since I&apos;m running out of time to make a post today, I&apos;m going to start
    this series with the other utilities in MakeStuff/blogging.  And then go
    add this list to the README.

&lt;ul&gt;
  &lt;li&gt; &lt;code&gt;&lt;a href=&quot;https://github.com/ssavitzky/MakeStuff/blob/master/blogging/check-html&quot;&gt;check-html&lt;/a&gt;&lt;/code&gt; is a simple wrapper for &lt;code&gt;&lt;a href=&quot;http://www.html-tidy.org/&quot;&gt;html-tidy&lt;/a&gt;&lt;/code&gt;, a popular HTML
       syntax checker.  Since it&apos;s not actually being used to &lt;em&gt;fix&lt;/em&gt;
       syntax, it can play fast-and-loose with things like the header (it&apos;s
       just text) and blog-specific tags like &amp;lt;cut&amp;gt; and &amp;lt;user&amp;gt;.
       It handles those by putting a space after the &quot;&amp;lt;&quot; character.  It
       would be trivial to add this to the make recipe for post.
  &lt;li&gt; &lt;code&gt;&lt;a href=&quot;https://github.com/ssavitzky/MakeStuff/blob/master/blogging/last-post&quot;&gt;last-post&lt;/a&gt;&lt;/code&gt; is a site-scraper that returns the URL of your
       most recent post.  It&apos;s useful, because &lt;code&gt;charm&lt;/code&gt; doesn&apos;t
       return it.  (I eventually put that functionality into
       &lt;code&gt;charm-wrapper&lt;/code&gt;, but it&apos;s still useful.  Eventually it wants
       to take a date on the command line.
  &lt;li&gt; &lt;code&gt;&lt;a href=&quot;https://github.com/ssavitzky/MakeStuff/blob/master/blogging/word-count&quot;&gt;word-count&lt;/a&gt;&lt;/code&gt; is what I use to generate the NaBloPoMo
       statistics at the bottom of posts in November.  (In other months, you
       just get a straight list; you can also get a listing for a whole year.)
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;pre&gt;NaBloPoMo stats:
     43 2019/11/01--rabbit-rabbit-rabbit.html
   1731 2019/11/02--s4s-memorials.html
   1465 2019/11/03--done-since-1027.html
    145 2019/11/04--i-ought-to-post-something.html
    430 2019/11/05--how-to-makestuff.html
-------
   3814 words in 5 posts this month (average 762/post)
    430 words in 1 post today
&lt;/pre&gt;

&lt;p class=&quot;colophon&quot;&gt; &lt;em&gt;Another fine post from
    &lt;a href=&quot;https://mdlbear.dreamwidth.org/tag/curmudgeon&quot;&gt;The Computer
       Curmudgeon&lt;/a&gt; (also at
    &lt;a href=&quot;https://computer-curmudgeon.com/&quot;&gt;computer-curmudgeon.com&lt;/a&gt;).&lt;br&gt;
    Donation buttons in &lt;a href=&quot;https://mdlbear.dreamwidth.org/&quot;&gt;profile&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1692062&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1692062.html</comments>
  <category>curmudgeon</category>
  <category>scripting</category>
  <category>computers</category>
  <category>blogging</category>
  <category>software</category>
  <lj:music>Bill Sutton: Do It Yourself (notionally)</lj:music>
  <lj:mood>geeky and didactic</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1672381.html</guid>
  <pubDate>Sat, 04 May 2019 15:34:35 GMT</pubDate>
  <title>Armagadd-on 2.0</title>
  <link>https://mdlbear.dreamwidth.org/1672381.html</link>
  <description>&lt;p&gt; If you were using Firefox any time after midnight UTC on Star Wars Day
    (May the 4th), you probably noticed that all your add-ons were disabled,
    with the unhelpful message: &quot;... could not be verified for use in Firefox
    and has been disabled&quot;.  If you&apos;re reading this before 9am or so Pacific
    time on the 4th they may still be.

&lt;p&gt; This happened because a certificate in the code-signing certificate chain
    expired at midnight UTC.  The same thing happened &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1267318&quot;&gt;three years
    ago&lt;/a&gt;, causing today&apos;s version to be dubbed &quot;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1548973&quot;&gt;Armagadd-On-2.0&lt;/a&gt;&quot;.

&lt;ul&gt;
  &lt;li&gt; wait for the fix to roll onto your browser (you can look for it by
       browsing to &lt;a&gt;about:studies&lt;/a&gt; and looking for
       hotfix-update-xpi-signing-intermediate-bug-1548973) (make sure that
       &quot;Firefox Options/Preferences -&amp;gt; Privacy &amp; Security -&amp;gt; Allow Firefox to
       install and run studies&quot; is checked) (it landed in my browser at 8:18
       or so Pacific time)
  &lt;li&gt; download and run either the Firefox nightly build, LTS, or developer
       edition and set &lt;code&gt;xpinstall.signatures.required&lt;/code&gt; to
       &lt;code&gt;false&lt;/code&gt; in &lt;a&gt;about:config&lt;/a&gt;
  &lt;li&gt; temporarily switch to Chrome.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt; This outage highlights a weakness in any security technique that involves
    code-signing, or indeed anything else that involves the &lt;a href=&quot;https://en.wikipedia.org/wiki/Public_key_infrastructure&quot;&gt;Public Key
    Infrastructure&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/X.509&quot;&gt;X.509 certificates&lt;/a&gt; (which is just about everything except SSH and
    PGP/GnuPG):  an expired or revoked certificate can wreak wide-spread
    havoc.  X-509 certs are used not only for code signing but for TLS/SSL (the
    protocol behind HTTPS).  At this point there doesn&apos;t seem to be much that
    can be done about it in the near term.

&lt;h3&gt;Resources&lt;/h3&gt;
&lt;ul class=&quot;resource-list&quot;&gt;
  &lt;li&gt; &lt;a href=&quot;https://www.engadget.com/2019/05/03/firefox-extension-add-on-cert/&quot;&gt;Firefox disabled all add-ons because a certificate expired&lt;/a&gt;
  &lt;li&gt; &lt;a href=&quot;https://www.zdnet.com/article/firefox-add-ons-disabled-en-masse-after-mozilla-certificate-issue/&quot;&gt;Firefox add-ons disabled en masse after Mozilla certificate issue&lt;/a&gt;
  &lt;li&gt; &lt;a href=&quot;https://blog.mozilla.org/addons/2019/05/04/update-regarding-add-ons-in-firefox/&quot;&gt;Update Regarding Add-ons in Firefox | Mozilla Add-ons Blog&lt;/a&gt;
  &lt;li&gt; &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1548973&quot;&gt;bug
       report&lt;/a&gt;
  &lt;li&gt; &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1267318&quot;&gt;1267318
       - (armagadd-on) Moving date forward to May 2nd is causing add-on
       signature &quot;unrecognized issuer&quot; errors&lt;/a&gt; 
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p class=&quot;colophon&quot;&gt; &lt;em&gt;Another fine post from
    &lt;a href=&quot;https://mdlbear.dreamwidth.org/tag/curmudgeon&quot;&gt;The Computer Curmudgeon&lt;/a&gt; (also at
    &lt;a href=&quot;https://computer-curmudgeon.com/&quot;&gt;computer-curmudgeon.com&lt;/a&gt;).&lt;br&gt;
    Donation buttons in &lt;a href=&quot;https://mdlbear.dreamwidth.org/&quot;&gt;profile&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1672381&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1672381.html</comments>
  <category>pki</category>
  <category>curmudgeon</category>
  <category>software</category>
  <category>firefox</category>
  <category>mozilla</category>
  <lj:mood>didactic</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1662041.html</guid>
  <pubDate>Fri, 22 Feb 2019 06:25:57 GMT</pubDate>
  <title>Git: The other blockchain</title>
  <link>https://mdlbear.dreamwidth.org/1662041.html</link>
  <description>&lt;h3&gt;Part 1: Blockchain&lt;/h3&gt;
&lt;p&gt; Blockchain is the technology behind Bitcoin and other cybercurrencies.
    That&apos;s about all anyone outside the software industry knows about it; that
    and the fact that lots of people are claiming that it&apos;s going to transform
    everything.  (The financial industry, the Web, manufacturing supply chains,
    identity, the music industry, ... the list goes on.)  If you happen to be
    &lt;em&gt;in&lt;/em&gt; the software industry and have a moderately good idea of what
    blockchain is, how it works, and what it can &lt;em&gt;and can&apos;t&lt;/em&gt; do, you
    may want to skip to &lt;a href=&quot;#part-2&quot;&gt;Part 2&lt;/a&gt;.

&lt;p&gt; Still with me?  Here&apos;s the fifty-cent summary of blockchain.  Blockchain
    is a distributed, immutable ledger.  Buzzword is a buzzword buzzword
    buzzword?  Blockchain is a chain of blocks?  That&apos;s closer.

&lt;p&gt; The purpose of a blockchain is to keep track of financial transactions
    (that&apos;s the &quot;ledger&quot; part) and other data by making them public (that&apos;s
    half of the &quot;distributed&quot; part), keeping them in blocks of data (that&apos;s
    the &quot;block&quot; part) that can&apos;t be changed (that&apos;s the &quot;immutable&quot; part, and
    it&apos;s a really good property for a ledger to have), are linked together by
    hashes (that&apos;s the &quot;chain&quot; part, and we&apos;ll get to what hashes are in a
    moment), with the integrity of that chain guaranteed by a large group of
    people (that&apos;s the other half of the &quot;distributed&quot; part) called &quot;miners&quot;
    (WTF?).

&lt;p&gt; Let&apos;s start in the middle:  how can we link blocks of data together so
    that they can&apos;t be changed?  Let&apos;s start by making it so that any change
    to a block, or to the order of those blocks, can be detected.  Then, the
    fact that everything is public makes the data impossible to change without
    that change being glaringly obvious.  We do that with hashes.

&lt;p&gt; A hash function is something that takes a large block of data and turns it
    into a very long sequence of bits (which we will sometimes refer to as a
    &quot;number&quot;, because any whole number can be represented by a sequence of
    binary digits, and sometimes as a &quot;hash&quot;, because the data has been
    chopped up and mashed together like the corned beef hash you had for
    breakfast).  A good hash function has two important properties:

&lt;ol&gt;
  &lt;li&gt; It&apos;s irreversible.  Starting with a hash, it is effectively impossible to
       construct a block of data that will produce that hash.  (It is
       significantly easier to construct two blocks with the same hash, which
       is why the security-conscious world moves to larger hashes from time to
       time.) 
  &lt;li&gt; It&apos;s unpredictable.  If two blocks of data differ anywhere, even by a
       single bit, their hashes will be &lt;em&gt;completely&lt;/em&gt; different.
&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt; Those two together mean that if two blocks have the same hash, they
    contain the same data.  If somebody sends you a block and a
    hash, you can compare the hash of the block and if it matches, you can be
    certain that the block hasn&apos;t been damaged or tampered with before it got
    to you.  And if they also cryptographically &lt;em&gt;sign&lt;/em&gt; that hash, you
    can be certain that they used the key that created that signature.

&lt;p&gt; Now let&apos;s guarantee the integrity of the &lt;em&gt;sequence&lt;/em&gt; of blocks by
    chaining them together.  Every block in the chain contains the hash of the
    previous block.  If block B follows block A in the chain, B&apos;s hash depends
    in part on the hash of block A.  If a villain tries to insert a forged
    transaction into block A, its hash won&apos;t match the one in block B.

&lt;p&gt; Now we get to the part that makes blockchain interesting:  getting
    everyone to agree on which transactions go into the next block.  This is
    done by &lt;em&gt;publishing&lt;/em&gt; transactions where all of the miners can see
    them.  The miners then get to work with &lt;del&gt;shovels and pickaxes&lt;/del&gt;
    &lt;ins&gt;big fast computers&lt;/ins&gt;, validating the transaction, putting it into
    a block, and then running a contest to see which of them gets to add their
    block to the chain and collect the associated reward.  Winning the contest
    requires doing a &lt;em&gt;lot&lt;/em&gt; of computation.  It&apos;s been estimated that
    miners&apos; computers collectively consume roughly the same amount of
    electricity as Ireland.

&lt;p&gt; There&apos;s more to it, but that&apos;s blockchain in a nutshell.  I am
    &lt;em&gt;not&lt;/em&gt; going to say anything about what blockchain might be good for
    besides keeping track of virtual money -- that&apos;s a whole other rabbit hole
    that I&apos;ll save for another time.  For now, the important thing is that
    blockchain is a system for keeping track of financial transactions by
    using a chain of blocks connected by hashes.

&lt;p&gt; The need for miners to do work is what makes the virtual money they&apos;re mining
    valuable, and makes it possible for everyone to agree on who owns how much
    of it without anyone having to trust anyone else.  It&apos;s all that work that
    makes it possible to detect cheating.  It also makes it expensive and
    slow.  The Ethereum blockchain can handle about ten transactions per
    second.  Visa handles about 10,000.


&lt;h3&gt;Part 2: The &lt;em&gt;other&lt;/em&gt; blockchain&lt;/h3&gt;

&lt;p&gt; Meanwhile, in another part of cyberspace, software developers are using
    another system based on hash chains to keep track of their software -- a
    distributed version control system called &lt;code&gt;git&lt;/code&gt;.  It&apos;s almost
    completely different, except for the way it uses hashes.  How different?
    Well, for starters it&apos;s both free and fast, and you can use it at home.
    And it has nothing to do with money -- it&apos;s a version control system.

&lt;blockquote&gt;
&lt;p&gt; If you&apos;ve been with me for a while, you&apos;ve probably figured out that I&apos;m
    extremely fond of git.  This post is &lt;em&gt;not&lt;/em&gt; an introduction to git
    for non-programmers -- I&apos;m working on that.  However, if you managed to
    get this far it does contain enough information to stand on its own,
&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt; Git doesn&apos;t use transactions and blocks; instead it uses &quot;objects&quot;, but
    just like blocks each object is identified by its hash.  Instead of
    keeping track of virtual money, it keeps track of files and their
    histories.  And just as blockchain keeps a complete history of everyone&apos;s
    coins, git records the complete history of everyone&apos;s data.

&lt;p&gt; Git uses several types of object, but the most fundamental one is called a
    &quot;blob&quot;, and consists of a file, its size, and the word &quot;blob&quot;.  For
    example, here&apos;s how git idenifies one of my Songs for Saturday posts:

&lt;pre&gt;git hash-object 2019/01/05--s4s-welcome-to-acousticville.html
957259dd1e41936104f72f9a8c451df50b045c57&lt;/pre&gt;

&lt;blockquote&gt;
&lt;p&gt; Everything you do with git starts with the &lt;code&gt;git&lt;/code&gt; command.  In
    this case we&apos;re using &lt;code&gt;git&amp;nbsp;hash-object&lt;/code&gt; and giving it the
    pathname of the file we want to hash.  Hardly anyone needs to use the
    &lt;code&gt;hash-object&lt;/code&gt; subcommand; it&apos;s used mainly for testing and the
    occasional demonstration.
&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt; Git handles a &lt;em&gt;directory&lt;/em&gt; (you may know directories as &quot;folders&quot; if
    you aren&apos;t a programmer) by combining the names, metadata, and hashes of
    all of its contents into a type of object called a &quot;tree&quot;, and taking the
    hash of the whole thing.

&lt;p&gt; Here, by the way, is another place where git really differs from blockchain.
    In a blockchain, all the effort of mining goes into making sure that every
    block points to its one guaranteed-unique correct predecessor.  In other
    words, the blocks form a chain.  Files and directories form a tree, with
    the ordinary files as the leaves, and directories as branches.  The
    directory at the top is called the root.  &lt;em&gt;Top?&lt;/em&gt; Top.  For some
    reason software trees grow from the root down.  After a while you get used
    to it.

&lt;p&gt; Actually, that&apos;s not quite accurate, because git stores each object in
    exactly one place, and it&apos;s perfectly possible for the same file to be in
    two different directories.  This can be &lt;em&gt;very&lt;/em&gt; useful -- if you
    make a hundred copies of a file, git only has to store one of them.  It&apos;s
    also inaccurate because trees, called &lt;a href=&quot;https://en.wikipedia.org/wiki/Merkle_tree&quot;&gt;Merkle Trees&lt;/a&gt; are
    used &lt;em&gt;inside&lt;/em&gt; of blocks in a blockchain.  But I digress.

&lt;blockquote&gt;
&lt;p&gt; Technically the hash links in both blockchains and git form a &lt;a href=&quot;https://en.wikipedia.org/wiki/Directed_acyclic_graph&quot;&gt;directed
    acyclic graph&lt;/a&gt; -- that means that the links all point in one direction,
    and there aren&apos;t any loops.  In order to make a loop you&apos;d have to predict
    the hash of some later block, and you just can&apos;t do that.  I have &lt;a href=&quot;https://computer-curmudgeon.com/Blog/2018/09/19/single-link/&quot;&gt;another post about why this is a good thing.&lt;/a&gt;
&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt; And that brings us to the things that make git, git:  commits.  (&quot;Commit&quot;
    is used in the same sense, more or less, as it is in the phrase &quot;commit
    something to memory&quot;, or &quot;commit to a plan of action&quot;.  It has very little
    to do with crime.  Hashes are even more unique than fingerprints, and we
    all know what criminals think about fingerprints.  In cryptography, the
    hash of a key is &lt;em&gt;called&lt;/em&gt; its fingerprint.)

&lt;p&gt; Anyway, when you&apos;re done making changes in a project, you type the command

&lt;pre&gt;git commit&lt;/pre&gt;

&lt;p&gt; ... and git will make a new commit object which contains, among other
    things, the time and date, your name and email address, maybe your
    cryptographic signature, a brief description of what you did (git puts you
    into your favorite text editor so you can enter this if you didn&apos;t put it
    on the command line), the hash of the current root, and &lt;em&gt;the hash of
    the previous commit&lt;/em&gt;.  Just like a blockchain.

&lt;p&gt; Unlike earlier version control systems, git never has to compare files;
    all it has to do is compare their hashes.  This is &lt;em&gt;fast&lt;/em&gt; -- git&apos;s
    hashes are only 20 bytes long, no matter how big the files are or how many
    are in a directory tree.  And if the hashes of two &lt;em&gt;trees&lt;/em&gt; are the
    same, git doesn&apos;t have to look at any of the blobs in those trees to know
    that they are all the same.

&lt;p&gt; 


&lt;blockquote style=&quot;white-space: pre-wrap;&quot;&gt;
  @ &lt;a href=&quot;https://hackernoon.com/blockchain-101-only-if-you-know-nothing-b883902c59f7&quot;&gt;Blockchain 101 — only if you ‘know nothing’! – Hacker Noon&lt;/a&gt; 
  @ &lt;a href=&quot;https://medium.com/@sbmeunier/when-do-you-need-blockchain-decision-models-a5c40e7c9ba1&quot;&gt;When do you need blockchain? Decision models. – Sebastien Meunier&lt;/a&gt;

  @ &lt;a href=&quot;https://git-scm.com/book/en/v2/Git-Internals-Git-Objects&quot;&gt;Git - Git Objects&lt;/a&gt;
  @ &lt;a href=&quot;http://gitready.com/beginner/2009/02/17/how-git-stores-your-data.html&quot;&gt;git ready » how git stores your data&lt;/a&gt;
  @ &lt;a href=&quot;https://en.wikibooks.org/wiki/Git/Internal_structure&quot;&gt;Git/Internal structure - Wikibooks, open books for an open world&lt;/a&gt;
  @ &lt;a href=&quot;https://computer-curmudgeon.com/Blog/2018/09/19/single-link/&quot;&gt;Why Singly-Linked Lists Win* | Stephen Savitzky&lt;/a&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;colophon&quot;&gt; &lt;em&gt;Another fine post from
    &lt;a href=&quot;https://mdlbear.dreamwidth.org/tag/curmudgeon&quot;&gt;The Computer Curmudgeon&lt;/a&gt; (also at
    &lt;a href=&quot;https://computer-curmudgeon.com/&quot;&gt;computer-curmudgeon.com&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1662041&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1662041.html</comments>
  <category>software</category>
  <category>blockchain</category>
  <category>curmudgeon</category>
  <category>hashing</category>
  <category>git</category>
  <lj:mood>didactic</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1655336.html</guid>
  <pubDate>Tue, 08 Jan 2019 04:20:05 GMT</pubDate>
  <title>Privacy Tips</title>
  <link>https://mdlbear.dreamwidth.org/1655336.html</link>
  <description>&lt;p&gt; Some day I ought to put together a comprehensive list of privacy-related
    links.  This is &lt;em&gt;not&lt;/em&gt; that list; it&apos;s just a few of the links that
    came my way recently, in no particular order.

&lt;p&gt; I&apos;d suggest starting with the ACLU&apos;s &lt;a href=&quot;https://www.aclu.org/blog/privacy-technology/internet-privacy/what-individuals-should-do-now-congress-has-obliterated&quot;&gt;What Individuals Should Do Now That Congress Has Obliterated the FCC’s
    Privacy Protections&lt;/a&gt;.  It&apos;s a good overview.

&lt;p&gt; &lt;a href=&quot;https://duckduckgo.com/&quot;&gt;DuckDuckGo&lt;/a&gt; is my current
    privacy-preserving search engine of choice.  The &lt;a href=&quot;https://spreadprivacy.com/&quot;&gt;DuckDuckGo Blog&lt;/a&gt; has been a good
    source of additional information. I especially recommend this article on
    &lt;a href=&quot;https://spreadprivacy.com/device-privacy-protection/&quot;&gt;How to Set
    Up Your Devices for Privacy Protection&lt;/a&gt; -- it has advice for iOS,
    Android, Mac, Windows 10 and 7, and Linux.  Also check out a broader range
    of tips &lt;a href=&quot;https://spreadprivacy.com/tag/device-privacy-tips/&quot;&gt;here&lt;/a&gt;.
 
&lt;p&gt; The &lt;a href=&quot;https://www.eff.org/&quot;&gt;Electronic Frontier Foundation&lt;/a&gt;, as
    you might expect, is another great source of information.  I suggest
    starting with &lt;a href=&quot;https://www.eff.org/pages/tools&quot;&gt;Tools from EFF&apos;s
    Tech Team&lt;/a&gt;.  While you&apos;re there, install &lt;a href=&quot;https://www.eff.org/privacybadger&quot;&gt;Privacy Badger&lt;/a&gt;.  It&apos;s not
    exactly an ad blocker; what it does is block &lt;em&gt;trackers.&lt;/em&gt;

&lt;p&gt; Here&apos;s an article on &lt;a href=&quot;https://lifehacker.com/which-browser-is-better-for-privacy-1525895782&quot;&gt;Which Browser Is Better for Privacy?&lt;/a&gt; (Spoiler:  it&apos;s Firefox.)  Then
    go to &lt;a href=&quot;https://restoreprivacy.com/firefox-privacy/&quot;&gt;Firefox
    Privacy - The Complete How-To Guide&lt;/a&gt;.

&lt;p&gt; For the paranoid among us, there are few things better than &lt;a href=&quot;https://www.torproject.org/projects/torbrowser.html.en&quot;&gt;Tor
    Browser&lt;/a&gt;.  If you use it, you&apos;ll probably want to &lt;em&gt;turn off
    Javascript&lt;/em&gt; as well.

&lt;p&gt; The Linux Journal&apos;s article on &lt;a href=&quot;https://www.linuxjournal.com/content/data-privacy-why-it-matters-and-how-protect-yourself&quot;&gt;Data Privacy: Why It Matters and How to Protect Yourself&lt;/a&gt; has a lot of
    good advice, most of which isn&apos;t Linux-specific at all.

&lt;p&gt; However, if you &lt;em&gt;are&lt;/em&gt; running Linux, you&apos;ll want to look at &lt;a href=&quot;https://www.makeuseof.com/tag/encrypt-home-folder-ubuntu-installation-linux/&quot;&gt;How To Encrypt Your Home Folder After Ubuntu Installation&lt;/a&gt;, &lt;a href=&quot;https://sysadminspot.com/linux/locking-down-and-secure-ssh-access/&quot;&gt;Locking down and securing SSH access to your server&lt;/a&gt;, and &lt;a href=&quot;https://www.linuxjournal.com/content/own-your-dns-data&quot;&gt;Own Your
    DNS Data&lt;/a&gt;.

&lt;p class=&quot;colophon&quot;&gt; &lt;em&gt;Another fine post from
    &lt;a href=&quot;https://mdlbear.dreamwidth.org/tag/curmudgeon&quot;&gt;The Computer Curmudgeon&lt;/a&gt; (also at
    &lt;a href=&quot;https://computer-curmudgeon.com/&quot;&gt;computer-curmudgeon.com&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1655336&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1655336.html</comments>
  <category>links</category>
  <category>curmudgeon</category>
  <category>privacy</category>
  <category>computers</category>
  <category>software</category>
  <lj:mood>didactic</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>7</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1632448.html</guid>
  <pubDate>Mon, 06 Aug 2018 00:59:06 GMT</pubDate>
  <title>Done Since 2018-07-29</title>
  <link>https://mdlbear.dreamwidth.org/1632448.html</link>
  <description>&lt;p&gt; It&apos;s been a week.  There were some good parts.  Music Under the Trees,
    yesterday at Betsy Tinney&apos;s, was one of them, even if we did have to leave
    early because Colleen was flagging.  (I didn&apos;t object, because to be
    honest I&apos;d been dreading driving home in the dark after three nights of
    not enough sleep.  But still.)

&lt;p&gt; Another was getting the rest of the bed box installation done, which
    happened last Sunday.  It&apos;s awesome.  N got to try it out Saturday night;
    it was complete enough for sleeping in at that point.

&lt;p&gt; A third good thing wa a very nice visit to the &lt;em&gt;southern&lt;/em&gt; end of
    the Rainbow Caravan, to spend a day with N and the kids.  We &lt;em&gt;will&lt;/em&gt;
    get our household back together.  It may take a while.

&lt;p&gt; And I got a very preliminary version of my &lt;a href=&quot;https://ssavitzky.github.io/&quot;&gt;&quot;Consulting business&quot; website&lt;/a&gt;
    done, as a GitHub Pages site.  Last week N and I had picked a theme:  &lt;a href=&quot;https://html5up.net/read-only,&quot;&gt;Read Only, by HTML5 Up&lt;/a&gt;.  It&apos;s
    cool - big banner across the top of the text, and a neat circular image
    (which it turned out was masked out by setting the enclosing box&apos;s
    boundary radius to 100%).  Only one problem.

&lt;p&gt; GitHub Pages are a snap to set up; you can do it in five minutes if you
    accept all the defaults.  And it uses a nice static site builder called &lt;a href=&quot;https://github.com/jekyll/jekyll&quot;&gt;Jekyll&lt;/a&gt; which has themes that
    are pretty easy to set up.  The devil&apos;s in the details, as usual.  Because
    although we found &quot;Read Only&quot; through a gallery of Jekyll themes, it
    turned out that it wasn&apos;t a theme at all, just a mock-up.   And although I
    eventually found a Jekyll version, it wasn&apos;t particularly usable.

&lt;p&gt; I now know how to roll my own &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;
    theme, and I can consider myself an advanced beginner at the &lt;a href=&quot;https://shopify.github.io/liquid/&quot;&gt;– Liquid template language&lt;/a&gt;
    and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn/CSS&quot;&gt;CSS
    stylesheets&lt;/a&gt;.  By the way, the &lt;a href=&quot;https://developer.mozilla.org/en-US/&quot;&gt;MDN Web Docs&lt;/a&gt; (MDN stands
    for Mozilla Developer Network, BTW) are awesome.  They have tutorials on
    all the important web technologies:  HTML, Javascript, and CSS, plus some
    more obscure ones.  And when you get to the edge cases, they have
    reference docs.

&lt;p&gt; It took me, basically, all week, with a huge amount of frustration along
    the way.

&lt;p&gt; We appear to be getting into the &lt;em&gt;bad&lt;/em&gt; parts of the week, don&apos;t
    we?  Right.

&lt;p&gt; I believe I mentioned that I&apos;d been dreading going home from Betsy&apos;s late
    at night (I&apos;m nowhere near as good a driver as I was at 50, and I know
    it).  My guess is that that was at the root of the anxiety attacks I had
    Saturday and Sunday.  (Panic attacks are intense, and supposedly last for
    only a few minutes to an hour or so.  Anxiety attacks can -- and in my
    case, do -- last all day.  

&lt;p&gt; And I have &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Trigger_finger&quot;&gt;Trigger finger&lt;/a&gt;&quot; in my left thumb.  It&apos;s been getting worse, not
    better, in spite of the brace I&apos;m wearing, which incidentally makes it
    almost impossible to type because my thumb keeps hitting my laptop&apos;s
    trackpad and left button.  Anyway.

&lt;p&gt; Aaaaaaand, I&apos;ve been spending almost all my time grappling with Jekyll and
    CSS, and not getting any job applications done.  Bletch.

&lt;p&gt;&lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://mdlbear.dreamwidth.org/1632448.html#cutid1&quot;&gt;Notes &amp; links, as usual&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1632448&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1632448.html</comments>
  <category>software</category>
  <category>music</category>
  <category>computers</category>
  <category>done</category>
  <category>links</category>
  <category>psych</category>
  <lj:mood>tired</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1631514.html</guid>
  <pubDate>Mon, 23 Jul 2018 04:25:15 GMT</pubDate>
  <title>Blog posting software planning</title>
  <link>https://mdlbear.dreamwidth.org/1631514.html</link>
  <description>&lt;p&gt; In &lt;a href=&quot;https://mdlbear.dreamwidth.org/1631371.html?thread=4766603#cmt4766603&quot;&gt;comments on &quot;Done Since 2018-07-15&quot;&lt;/a&gt; we started having a discussion of
    mirroring and cross-posting DW blog entries, and in particular what my
    plans are for implementing personal blog sites that mirror all or some of
    a -- &lt;em&gt;this&lt;/em&gt; -- Dreamwidth journal.

&lt;p&gt; Non-techie readers might conceivably want to skip this post.

&lt;h3&gt;Where I am now:&lt;/h3&gt;

&lt;p&gt; Right now, my blog posting process is, well, let&apos;s just say
    &lt;em&gt;idiosyncratic&lt;/em&gt;.  Up until sometime late last year, I was posting
    using an Emacs major mode called &lt;code&gt;lj-update-mode&lt;/code&gt;; it was
    pretty good.  It had only two significant problems:
&lt;ol&gt;
  &lt;li&gt; It could only create one post at a time, and there was no good way to
       save a draft and come back to it later.  I could live with that.
  &lt;li&gt; It stopped working when DW switched to all HTTPS.  It was using an
       obsolete http library, and noone was maintaining either of them.
&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt; My current system is much better.
&lt;ol&gt;
  &lt;li&gt; I run a command, either &lt;code&gt;make&amp;nbsp;draft&lt;/code&gt; or, if I&apos;m pretty
       sure I&apos;m going to post immediately, &lt;code&gt;make&amp;nbsp;entry&lt;/code&gt;.  I
       pass the filename, without the yyyy/mm/dd prefix, along with an
       optional title.  If I don&apos;t pass the title I can add it later.  The
       draft gets checked in with git; I can find out when I started by using
       &lt;code&gt;git&amp;nbsp;log&lt;/code&gt;. 
  &lt;li&gt; I edit the draft.  It can sit around for days or months; doesn&apos;t
       matter.  It&apos; an ordinary html file except that it has an email-like
       header with the metadata in it.
  &lt;li&gt; When I&apos;m done, I &lt;code&gt;make&amp;nbsp;post&lt;/code&gt;.  Done.  If I&apos;m posting a
       draft I have to pass the filename again to tell it &lt;em&gt;which&lt;/em&gt;
       draft; &lt;code&gt;make&amp;nbsp;entry&lt;/code&gt; makes a symlink to the entry, which
       is already in a file called
       &lt;code&gt;yyyy/mm/dd-&lt;em&gt;filename&lt;/em&gt;.html&lt;/code&gt;.  It gets posted,
       and committed in git with a suitable commit message.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt; You can see the code in &lt;a href=&quot;https://github.com/ssavitzky/MakeStuff/tree/master/blogging&quot;&gt;MakeStuff/blogging&lt;/a&gt; on GitHub.  It depends on a Python client called
    &lt;a href=&quot;https://github.com/ssavitzky/charm&quot;&gt;&lt;code&gt;charm&lt;/code&gt;&lt;/a&gt;,
    which I forked to add the Location: header and some sane defaults like not
    auto-formatting.  Charm is mostly useless -- it does almost everything
    using a terminal-based text editor.  Really?  But it does have a
    &quot;quick-post&quot; mode that takes metadata on the command line, and a &quot;sync&quot;
    mode that you can use to sync your journal with an archive.  Posts in the
    archive are almost, but not quite, in the same format as the MakeStuff
    archive; the main difference is that the filenames look like
    &lt;code&gt;yyyy/mm/dd_HHMM&lt;/code&gt;.  Close, but not quite there.

&lt;p&gt; There&apos;s another advantage that isn&apos;t apparent in the code: you can add
    custom make targets that set up your draft using a template.  For example,
    my &quot;Done since ...&quot; posts are started with &lt;code&gt;make&amp;nbsp;done&lt;/code&gt;,
    and my &quot;&lt;a href=&quot;https://mdlbear.dreamwidth.org/tag/curmudgeon&quot;&gt;Computer
    Curmudgeon&lt;/a&gt;&quot; posts are started with &lt;code&gt;make&amp;nbsp;curmudgeon&lt;/code&gt;.
    There are other shortcuts for River and S4S posts.  I also have multiple
    directories for drafts, separated roughly by subject, but all posting into
    the same archive.

&lt;h3&gt;Where I want to go:&lt;/h3&gt;

&lt;p&gt; Here&apos;s what I want next:

&lt;ul&gt;
  &lt;li&gt; The ability to post in either HTML or markdown -- markdown has a great
       toolchain, including the ability to syntax-color your code blocks.
  &lt;li&gt; The ability to &lt;em&gt;edit&lt;/em&gt; posts by editing the archived post and
       uploading it.  Right now it&apos;s a real pain to keep them in sync.
  &lt;li&gt; A unified archive, with &lt;em&gt;actual URLs in the metadata&lt;/em&gt; rather
       than just the date and time in the filename.
  &lt;li&gt; The ability to put all or part of my blog on &lt;em&gt;different sites.&lt;/em&gt;
       I really want the computer-related posts to go on &lt;a href=&quot;https://stephen.savitzky.net/&quot;&gt;Stephen.Savitzky.net&lt;/a&gt; (usually
       shortened to S.S.net in my notes), and a complete mirror on &lt;a href=&quot;https://steve.savitzky.net/&quot;&gt;steve.savitzky.net&lt;/a&gt; (s.s.net).
  &lt;li&gt; Cross-links in both directions between my sites and DW.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h3&gt;How to get there:&lt;/h3&gt;

&lt;p&gt; Here&apos;s a very brief sketch of what needs to be done.  It&apos;s only vaguely in
    sequence, and I&apos;ve undoubtedly left parts out.  But it&apos;s a start.

&lt;h4&gt;Posting, editing, and archiving&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt; Posting in HTML or markdown is a pretty easy one; I can do that just by
       modifying the makefiles and (probably) changing the final extension
       from &lt;code&gt;.html&lt;/code&gt; to &lt;code&gt;.posted&lt;/code&gt; so that make can apply
       its usual dependency-inference magic.
  &lt;li&gt; Editing and a unified archive will &lt;em&gt;both&lt;/em&gt; require a new
       command-line client.  There aren&apos;t any.  There &lt;em&gt;are&lt;/em&gt; libraries,
       in Ruby, Haskell, and Javascript, that I can wrap a program around.
       (The Python code in &lt;code&gt;charm&lt;/code&gt; doesn&apos;t look worth saving.)  I
       wanted to learn Ruby anyway.
  &lt;li&gt; The unified archive will also require a program that can go back in
       time and match up archived posts with the right URLs, reconcile the two
       file naming conventions, and remove the duplicates that are due to
       archiving posts both in &lt;code&gt;charm&lt;/code&gt; and &lt;code&gt;MakeStuff&lt;/code&gt;.
       Not too hard, and it only has to be done once.
  &lt;li&gt; It would be nice to be able to archive comments, too.  The old
       &lt;code&gt;ljbackup&lt;/code&gt; program can do it, so it&apos;s feasible.  It&apos;s in
       Perl, so it might be a good place to start.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;h4&gt;Mirror, mirror, on the server...&lt;/h4&gt;

&lt;p&gt; This is a separate section because it&apos;s mostly orthogonal to the posting,
    archiving, etc.  
&lt;ul&gt;
  &lt;li&gt; The only part of the posting section that really needs to be done first
       is the first one, changing the extension of archived posts to
       &lt;code&gt;.posted&lt;/code&gt;.  (That&apos;s because &lt;code&gt;make&lt;/code&gt; uses
       extensions to figure out what rules to apply to get from one to
       another.  Remind me to post about &lt;code&gt;make&lt;/code&gt; some time.)
  &lt;li&gt; The post archive may want to have its own git repository.
  &lt;li&gt; Templating and styling.  My websites are starting to show their age;
       there&apos;s nothing really wrong with a retro look, but they also aren&apos;t
       responsive (to different screen sizes -- that&apos;s important when most
       people are reading websites on their phones), or accessible
       (screen-reader friendly and navigable by keyboard; having different
       font sizes helps here, too).  Any respectable static site generator can
       do it -- you may remember &lt;a href=&quot;https://mdlbear.dreamwidth.org/1618191.html&quot;&gt;this post on The
       Joy of Static Sites&lt;/a&gt; -- but the way I&apos;m formatting my metadata will
       require some custom work.  Blosxom and nanoblogger are probably the
       closest, but they&apos;re ancient.  I probably ought to resist the
       temptation to roll my own.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt; Yeah.  Right.

&lt;p&gt; &lt;em&gt;Another fine post from
    &lt;a href=&quot;https://mdlbear.dreamwidth.org/tag/curmudgeon&quot;&gt;The Computer Curmudgeon&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1631514&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1631514.html</comments>
  <category>software</category>
  <category>blogging</category>
  <category>projects</category>
  <category>computers</category>
  <category>programming</category>
  <category>curmudgeon</category>
  <category>makestuff</category>
  <lj:mood>didactic</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1628698.html</guid>
  <pubDate>Fri, 06 Jul 2018 05:36:51 GMT</pubDate>
  <title>Languages: Imperative, Object-Oriented, and Functional</title>
  <link>https://mdlbear.dreamwidth.org/1628698.html</link>
  <description>&lt;blockquote style=&quot;white-space: pre-wrap;&quot;&gt;
Back when smalltalk was sports and the weather,
And an object was what you could see,
And we watched &quot;Captain Video&quot; in black-and-white,
Before there was color TV.
-- &lt;a href=&quot;https://steve.savitzky.net/Songs/lad/&quot;&gt;&quot;When I Was a Lad&quot;&lt;/a&gt;
&lt;/blockquote&gt;

&lt;p&gt; Even if you&apos;re not a programmer (and most of the people I expect to be
    reading this aren&apos;t) you&apos;ve probably heard one of your geek friends
    mentioning &quot;object-oriented&quot; programming.  You might even have heard them
    mention &quot;functional&quot; programming, and wondered how it differs from
    non-functional programming.  The computer curmudgeon can help you.

&lt;p&gt; If you &lt;em&gt;are&lt;/em&gt; a programmer, you probably know a lot of this.  You may
    find a few items of historical interest, and it might be useful explaining
    things to the non-programmers in your life.

&lt;h2&gt;Imperative languages&lt;/h2&gt;

&lt;p&gt; As you may recall from last month&apos;s post on &lt;a href=&quot;https://mdlbear.dreamwidth.org/1621179.html&quot;&gt;computer
    languages&lt;/a&gt;, the first programming languages were assembly languages --
    just sequences of things for the computer to do, one after another (with a
    few side-trips).  This kind of language is called &quot;imperative&quot;, because
    each statement is a command telling the computer what to do next:  &quot;load a
    into register 2!&quot; &quot;add register 2 to register 3!&quot; &quot;roll over!&quot;  &quot;sit!&quot;
    You get the idea.

&lt;p&gt; Most programmers use &quot;statement&quot; instead of &quot;command&quot; for these things
    even though the latter might be more correct from a grammatical point of
    view; a &quot;command&quot; is something one types at a terminal in order to run a
    program (which is &lt;em&gt;also&lt;/em&gt; called a &quot;command&quot;).

&lt;p&gt; Most of the earlier programming languages (with one notable exception that
    we&apos;ll get to later) were also imperative.  Fortran, Cobol, and Algol were
    the most prominent of these; most of today&apos;s languages descend
    more-or-less from Algol.  (By the way, the &lt;a href=&quot;http://www.softwarepreservation.org/projects/ALGOL/report/Algol60_report_CACM_1960_June.pdf&quot;&gt;Report on the Algorithmic Language Algol 60&lt;/a&gt; is something I always
    point to as an example of excellent technical writing.)

&lt;p&gt; Imperative languages make a distinction between statements, which
    &lt;em&gt;do&lt;/em&gt; things (like &quot;a := 2&quot;, which puts the number 2 into a variable
    called &quot;a&quot;), and &quot;expressions&quot;, which compute results.  Another way of
    saying that is that an expression has a &lt;em&gt;value&lt;/em&gt; (like 2+2, which
    has a value of 4), and a statement doesn&apos;t.  In earlier languages that
    value was always a number; later languages add things like lists of
    symbols and strings of characters enclosed in quotes.

&lt;p&gt; Algol and its descendents lend themselves to what&apos;s called &quot;Structured
    Programming&quot; -- control structures like conditionals (&quot;if this then {that}
    else {something-else}&quot;) and loops (for x in some-collection do
    {something}) let you build your program out of simple sections that nest
    together but always have a single entrance and exit.  Notice the braces
    around those sections.  Programming languages have different ways of
    grouping statements; braces and indentation are probably the most common,
    but some languages use &quot;if ... fi&quot; and &quot;do ... done&quot;.

&lt;p&gt; Languages also have ways of packaging up groups of statements so that they
    can be used in different places in the program.  These are called either
    &quot;subroutines&quot; or &quot;functions&quot;; if a language has both it means that a
    function returns a value (like &quot;sqrt(2)&quot;, which returns the square root of
    2) and a subroutine doesn&apos;t (like &quot;print(&apos;Hello world!&apos;)&quot;, which prints a
    familiar greeting.)  Subroutines are statements, and functions are
    expressions.  The expressions in parentheses are called either &quot;arguments&quot;
    or &quot;parameters&quot; -- I was bemused to find out recently that &lt;em&gt;verbs&lt;/em&gt;
    have arguments, too.  (A verb&apos;s arguments are the subject, and the direct
    and indirect objects.)

&lt;h2&gt;Object-oriented languages&lt;/h2&gt;

&lt;p&gt; As long as we&apos;re on the subject of objects, ...

&lt;p&gt; In the mid 1960s Ole-Johan Dahl and Kristen Nygaard, working at the
    University of Oslo, developed a language called &lt;a href=&quot;https://en.wikipedia.org/wiki/Simula&quot;&gt;Simula&lt;/a&gt;, designed for
    simulating objects and events in the real world.  Objects are things like
    cars, houses, people, and cats, and Simula introduced &lt;em&gt;software&lt;/em&gt;
    objects to represent them.  Objects have &quot;attributes&quot;:  my car is blue, my
    cats are both female, my wife has purple hair.  Some of these attributes
    are objects in their own right:  a car has wheels, a cat has four legs and
    a person has two legs and two arms.  Some of these are variables:
    sometimes my driveway has a car in it, sometimes it doesn&apos;t, and sometimes
    it has two or three.

&lt;p&gt; What this means is that objects have &lt;em&gt;state.&lt;/em&gt;  A car&apos;s speed and
    direction vary all the time, as does the position of a cat&apos;s tail.  An
    object is a natural way to bundle up a collection of state variables.

&lt;p&gt; An object also can &lt;em&gt;do things&lt;/em&gt;.  In a program, objects rarely do
    things on their own, some other object &lt;em&gt;tells&lt;/em&gt; them what to do.
    This is a lot like sending the object a message.  &quot;Hey, car -- turn left!&quot;
    &quot;Hey, cat!  What color are your eyes?&quot;  Software objects don&apos;t usually
    have any of their state on the outside where other parts of the program
    can see it; they have to be asked politely.  That means that the object
    might be &lt;em&gt;computing&lt;/em&gt; something that looks to the outside like a
    simple state variable -- a car computes its speed from the diameter of its
    tires and how fast its wheels are turning.  All these things are hidden
    from the rest of the program.

&lt;p&gt; An object has to have a &lt;em&gt;method&lt;/em&gt; for handling any message thrown at
    it, so the documentation of most languages refers to &quot;calling a method&quot;
    rather than &quot;sending a message&quot;.  It&apos;s the same thing in most cases.  As
    seen from the outside, calling a method is just like calling a function or
    subroutine, except that there&apos;s an extra argument that represents the
    object.  If you think of the message as a command -- an imperative
    sentence -- it has an implied subject, which is the object you&apos;re talking
    to.  &lt;em&gt;Inside&lt;/em&gt; the little program that handles the method, the
    object is represented by a name that is usually either &quot;self&quot; or &quot;this&quot;,
    depending on the language.

&lt;p&gt; One natural thing to do with objects is to classify them, so objects have
    &quot;classes&quot;, and classes tend to be arranged in hierarchies.  My cats are
    cats -- we say that Ticia and Desti are &lt;em&gt;instances&lt;/em&gt; of the class
    &quot;Cat&quot;.  All cats are animals, so Cat is a &lt;em&gt;subclass&lt;/em&gt; of Animal, as
    are Dog and Person.  (In programming languages, classes tend to have their
    names capitalized.  Variables (like &quot;x&quot; or &quot;cat&quot;) almost always start with
    a lowercase letter.  Constants (like &quot;Pi&quot;, &quot;True&quot;, and &quot;Ticia&quot;) can go
    either way.)

&lt;p&gt; An object&apos;s class contains everything the computer needs to determine the
    behavior of its instances:  a list of the state variables, a list of the
    methods it can handle, and so on.  Now we get to the fun part.

&lt;p&gt; Simula was just objects and methods tacked on to a &quot;traditional&quot;
    imperative language -- Algol in that case.  Most other &quot;object-oriented&quot;
    languages work the same way -- C++ is just objects tacked on to C; Python
    and Perl had objects from the beginning or close to it, but they still
    include a lot of things -- numbers, strings, arrays, and so on, that
    aren&apos;t objects or (like strings in Java) are pretending to be objects.  It
    doesn&apos;t have to be that complicated.

&lt;p&gt; Shortly after Simula was released, Alan Kay at Xerox PARC realized that
    you could design a programming language where &lt;em&gt;everything&lt;/em&gt; was an
    object.  The result was Smalltalk, and it&apos;s still the best example of a
    &lt;em&gt;pure&lt;/em&gt; object-oriented language.  (It inspired C++ and Java, and
    indeed almost all existing OO languages, but very few of them went all the
    way.  Ruby comes closest of the languages I&apos;m familiar with.)  Smalltalk
    is &lt;del&gt;turtles&lt;/del&gt; &lt;ins&gt;objects&lt;/ins&gt; all the way down.

&lt;p&gt; In Smalltalk numbers are objects -- you can add new methods to them, or
    redefine existing methods.  (Your program will eventually stop working if
    you redefine addition so that 2+2 is 5, but it will keep going for a
    surprisingly long time.)  So are booleans.  True and False are instances
    of different subclasses of Boolean, and they behave differently when given
    messages like &lt;code&gt;ifTrue:&lt;/code&gt; or &lt;code&gt;ifFalse:&lt;/code&gt;.  (I&apos;m not
    going to go into the details here; Smalltalk warrants an article all by
    itself).  Loops are methods, too.  The trickiest bit, though, is that
    &lt;em&gt;classes&lt;/em&gt; are objects.  A class is just an instance of Metaclass,
    and Metaclass is an instance of &lt;em&gt;itself.&lt;/em&gt;

&lt;p&gt; Someone trying to implement Smalltalk has to cheat in a couple of places
    -- the Metaclass weirdness is one of them -- but they have to hide their
    tracks and not get caught.

&lt;h2&gt;Functional languages&lt;/h2&gt;

&lt;p&gt; Smalltalk, for all its object orientation, is still an imperative language
    underneath.  A program is still a sequence of statements, even if they&apos;re
    all wrapped up in methods.  Objects have state -- lots of it; they&apos;re just
    a good way of organizing it.  Alan Kay once remarked that programming in
    Smalltalk was a lot like training a collection of animals to perform
    tricks together.  Sometimes it&apos;s more like herding cats.

&lt;p&gt; But it turns out that you don&apos;t need statements -- or even state -- at
    all!  All you need is functions.

&lt;p&gt; About the same time Alan Turing was inventing the &lt;a href=&quot;https://en.wikipedia.org/wiki/Turing_machine&quot;&gt;Turing Machine&lt;/a&gt;,
    which is basically a computer stripped-down and simplified to something
    that will just barely work, Alonzo Church was developing something he
    called the &lt;a href=&quot;https://en.wikipedia.org/wiki/Lambda_calculus&quot;&gt;Lambda
    Calculus&lt;/a&gt;, which did something similar to the mathematical concept of
    &lt;em&gt;functions&lt;/em&gt;.

&lt;p&gt; A mathematical function takes a set of inputs, and produces an output.
    The key thing about it is that a given set of inputs will always produce
    exactly the same output.  It&apos;s like a meat grinder -- put in beef, and you
    get ground beef.  Put in pork, and you get ground pork.  &lt;em&gt;A function
    has no state, and no side-effects.&lt;/em&gt;  State would be like a secret
    compartment in the meat grinder, so that you get a little chicken mixed in
    with your ground beef, and beef in your ground pork.  Ugh.  A side effect
    would be like a hole in the side that lets a little of the ground meat
    escape.

&lt;p&gt; Objects are all about state and side effects.  You can call a method like
    &quot;turn left&quot; on a car (in most languages that would look like
    &lt;code&gt;car.turn(left)&lt;/code&gt;) and as a side effect it will change the car&apos;s
    direction state to something 90 degrees counterclockwise from where it
    was.  That makes it hard to reason about what&apos;s going to happen when you
    call a particular method.  It&apos;s even harder with cats.

&lt;p&gt; Anyway, in lambda calculus, functions are things that you can pass around,
    pass to other functions, and return from functions.  They&apos;re &lt;em&gt;first
    class&lt;/em&gt; values, just like numbers, strings, and lists.  It turns out
    that you can use functions to compute anything that you can compute with a
    Turing machine.

&lt;p&gt; Lambda calculus gets its name from the way you represent functions:  To
    define a function that squares a number, for example, we say something
    like: 

&lt;blockquote&gt;&lt;pre&gt;square = &amp;lambda; x: x*x
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt; Now, this looks suspiciously like assigning a value to a variable, and
    that&apos;s exactly what it&apos;s doing.  If you like, you can even think of
    &amp;lambda; as a funny kind of function that takes a list of symbols and
    turns it into a function.  You find the value of an expression like
    &lt;code&gt;square(3)&lt;/code&gt; by plugging the value 3 into the function&apos;s
    definition in place of &lt;code&gt;x&lt;/code&gt;.  So,

&lt;blockquote&gt;&lt;pre&gt;square(3)
  &amp;rightarrow; (&amp;lambda; x: x*x)(3)
  &amp;rightarrow; 3*3
  &amp;rightarrow; 9
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;small&gt;
&lt;p&gt; Most functional languages don&apos;t allow you to redefine a name once you&apos;ve
    bound it to a value; if you have a function like &lt;code&gt;square&lt;/code&gt; it
    wouldn&apos;t make much sense to redefine it in another part of the program as
    &lt;code&gt;x*x*x&lt;/code&gt;.  This is vary different from imperative languages,
    where variables represent state and vary all over the place.  (Names that
    represent the arguments of functions are only defined inside any one call
    to the function, so &lt;code&gt;x&lt;/code&gt; can have different values in
    &lt;code&gt;square(2)&lt;/code&gt; and &lt;code&gt;square(3)&lt;/code&gt; and nobody gets
    confused.)
&lt;/p&gt;&lt;/small&gt;&lt;/blockquote&gt;

&lt;p&gt; Lambda calculus lends itself to &lt;em&gt;recursive&lt;/em&gt; functions -- functions
    that call themselves -- and recursion is particularly useful when you&apos;re
    dealing with lists.  You do something to the first thing on the list, and
    then combine that with the result of doing the same thing to the rest of
    the list.Suppose you have a list of numbers, like &lt;code&gt;(6 2 8 3)&lt;/code&gt;.
    If you want another list that contains the squares of those numbers, you
    can use a function called &lt;code&gt;map&lt;/code&gt; that takes two arguments: a
    function and a list.  It returns the result of applying the function to
    each element of the list.  So

&lt;blockquote&gt;&lt;pre&gt;map(square, (6, 2, 8, 3))
 &amp;rightarrow; (36, 4, 64, 9)
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt; It&apos;s pretty easy to define &lt;code&gt;map&lt;/code&gt;, too.  It&apos;s just
&lt;blockquote&gt;&lt;pre&gt;
map = &amp;lambda; (f, l):
	if isEmpty(l)
           then l
	   else cons(f(first(l)), map(f, rest(l)))
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;small&gt;
&lt;p&gt; The &lt;code&gt;cons&lt;/code&gt; function constructs a new list that consists of its
    first argument, which can be anything, tacked onto the front of its second
    argument, which is a list.  Using &lt;code&gt;first&lt;/code&gt; and &lt;code&gt;rest&lt;/code&gt;
    as the names of the functions that get the first item in a list, and the
    remainder of the list after the first item, is pretty common tese days.
    &lt;a href=&quot;https://en.wikipedia.org/wiki/CAR_and_CDR&quot;&gt;Historically&lt;/a&gt;, the
    function that returns the first item in a list is called &lt;code&gt;car&lt;/code&gt;,
    and the function that returns the rest of the list is called
    &lt;code&gt;cdr&lt;/code&gt; (pronounced sort of like &quot;could&apos;r&quot;).

&lt;p&gt; I know, the classic introduction to recursive functions is factorial.
    Lists are more interesting.  Besides, I couldn&apos;t resist an excuse for
    mentioning &quot;car&quot;.  We&apos;ll see &quot;cat&quot; in a future post when I discuss
    scripting languages.
&lt;/p&gt;&lt;/p&gt;&lt;/small&gt;&lt;/blockquote&gt;

&lt;p&gt; We call &lt;code&gt;map&lt;/code&gt; a &quot;higher-level&quot; function because it takes a
    function as one of its arguments.  Other useful higher-level functions
    include &lt;code&gt;filter&lt;/code&gt;, which takes a boolean function (one that
    returns true or false) and &lt;code&gt;flatmap&lt;/code&gt;, which takes a function
    that returns lists and flattens them out into into a single list.  (Some
    languages call that &lt;code&gt;concatmap&lt;/code&gt;.)  &lt;strong&gt;Higher-level
    functions are what make functional languages powerful, beautiful, and easy
    to program in.&lt;/strong&gt;

&lt;p&gt; Now, Church&apos;s lambda calculus was purely mathematical -- Church used it to
    prove things about what kinds of functions were computable, and which
    weren&apos;t, which is exactly what Alan Turing did with the Turing Machine.
    We&apos;ll save that for another post, except to point out that &lt;em&gt;Church&apos;s
    lambda calculus can compute anything that a Turing machine can compute,
    and vice versa.&lt;/em&gt;

&lt;p&gt; But in 1958 John McCarthy at MIT invented a simple way of representing
    lambda expressions as lists, so that they could be processed by a
    computer:  just represent a function and its arguments as a list with the
    function first, followed by its arguments.  Trivial?  Yes.  But
    brilliant.  His paper included a simple function called &lt;code&gt;eval&lt;/code&gt;
    that takes a list representing a function and its arguments, and returns
    the result.  Steve Russell realized that it wouldn&apos;t be hard to implement
    &lt;code&gt;eval&lt;/code&gt; in machine language (on an IBM 704).

&lt;p&gt; I&apos;ll save the details for another post, but the result was a language
    called &lt;a href=&quot;https://en.wikipedia.org/wiki/Lisp_(programming_language)&quot;&gt;Lisp&lt;/a&gt;.  It&apos;s the second oldest programming language still in use.  The
    post about LISP will explain how it works (elsewhere I&apos;ve described
    &lt;code&gt;eval&lt;/code&gt; as &lt;a href=&quot;https://www.quora.com/What-is-the-most-amazing-piece-of-software-in-the-world/answer/Stephen-M-Bear&quot;&gt;The most amazing piece of software in the world&lt;/a&gt;), and hopefully show
    you why Kanef&apos;s song &lt;a href=&quot;http://songworm.com/lyrics/songworm-parody/EternalFlame.html&quot;&gt;The
    Eternal Flame&lt;/a&gt; says that God wrote the universe in LISP.  Programmers
    may want to take a look at &lt;a href=&quot;https://stephen.savitzky.net/Doc/single-link/&quot;&gt;&quot;Sex and the Single
    Link&quot;&lt;/a&gt;.

&lt;h2&gt;And finally,&lt;/h2&gt;

&lt;p&gt; I&apos;d be particularly interested in seeing comments from the
    &lt;em&gt;non-&lt;/em&gt;programmers among my readers, if I haven&apos;t lost you all by
    now.  Was this post interesting?  Was it understandable?  Was it too long?
    Were my examples sufficiently silly?  Inquiring minds...


&lt;p&gt; &lt;em&gt;Another fine post from
    &lt;a href=&quot;https://mdlbear.dreamwidth.org/tag/curmudgeon&quot;&gt;The Computer Curmudgeon&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1628698&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1628698.html</comments>
  <category>oop</category>
  <category>structured</category>
  <category>fp</category>
  <category>programming</category>
  <category>languages</category>
  <category>curmudgeon</category>
  <category>software</category>
  <category>computers</category>
  <lj:mood>didactic</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>15</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1622746.html</guid>
  <pubDate>Tue, 05 Jun 2018 17:44:16 GMT</pubDate>
  <title>Git and GitHub, with a side of Microsoft</title>
  <link>https://mdlbear.dreamwidth.org/1622746.html</link>
  <description>&lt;p&gt; If you develop software and haven&apos;t just returned from the moon, you&apos;ve
    undoubtedly heard that &lt;a href=&quot;https://blog.github.com/2018-06-04-github-microsoft/&quot;&gt;GitHub&lt;/a&gt; is
    being acquired by &lt;a href=&quot;https://blogs.microsoft.com/blog/2018/06/04/microsoft-github-empowering-developers/&quot;&gt;Microsoft&lt;/a&gt;.  Depending on your affiliations you might be spelling
    &quot;being acquired by&quot; as &quot;selling out to&quot;.  The rest of you are probably
    wondering what on Earth a GitHub is, and why Microsoft would want one.
    Let me explain.

&lt;p&gt; Please note:  this post isn&apos;t about my opinion of today&apos;s news.  It&apos;s
    really too early to tell, though I may get into that a little toward the
    end.  Instead, I&apos;m going to explain what GitHub is, and why it matters.
    But first I have to explain &lt;a href=&quot;https://git-scm.com/&quot;&gt;Git&lt;/a&gt;.

&lt;p&gt; Git is a version-control system.  (Version-control systems are sometimes
    called &quot;source code management&quot; (SCM) systems.  If you look closely you
    might even have spotted &quot;scm&quot; in git&apos;s URL up there at the end of the last
    paragraph.)  Basically, a version-control system lets you record the
    complete history of a project, with what changes were made, who made the
    each change, when they changed it, and their notes about what they did and
    why.  It doesn&apos;t have to be a software project, either.  It can be
    recipes, photographs, books, the papers you&apos;re writing for school, or even
    blog entries.  (Yes, I do.)

&lt;p&gt; Before git, most version-control systems kept track of changes in text
    files (which of course is what all source code is) by recording which
    lines are different from the previous version.  (It&apos;s usually done by a
    program called &lt;code&gt;diff&lt;/code&gt;.)  This was very compact, but it could
    also be very slow if you had to undo all the changes between two versions
    in order to see what the older one looked like.

&lt;p&gt; Git, on the other hand, is blindingly fast in part because it works in the
    stupidest way possible (which is &lt;em&gt;why&lt;/em&gt; it&apos;s called &quot;git&quot;).  It
    simply takes the new version of each file that changed since the last
    version, zips it up, and stuffs it whole into its repository.  So it takes
    git about the same amount of time to roll a file back two versions or two
    hundred.

&lt;p&gt; The other thing that makes git fast is where it &lt;em&gt;keeps&lt;/em&gt; all of its
    version information.  Before git, most version-control systems used a
    centralized repository on a server somewhere.  (Subversion, one of the
    best of these, even lets you browse the repository with a web browser.)
    That means that all the change information is going over a network.  Git
    keeps its repository (these days everyone shortens that to &quot;repo&quot;) on your
    local disk, right next to your working copy, in a hidden subdirectory
    called &quot;&lt;code&gt;.git&lt;/code&gt;&quot;.

&lt;p&gt; Because its repo is local, and contains the entire history of your
    project, you don&apos;t need a network connection to use git.  On the beach, in
    an airplane, on a boat, &lt;del&gt;with a goat&lt;/del&gt;, it doesn&apos;t matter to git.
    It&apos;s &lt;em&gt;de&lt;/em&gt;-centralized.  It gets a little more complicated when more
    than one developer is working on a project.

&lt;p&gt; Bob&apos;s been in the office all week working on a project.  When his boss,
    Alice, comes back from the open source conference she&apos;s been at all week,
    all she has to do is tell git to fetch all the changes that Bob made while
    she was away.  Git gets them directly from Bob&apos;s repo.  If Alice didn&apos;t
    make any changes, that&apos;s called a &quot;fast-forward&quot; merge -- git just takes
    the changes that Bob made, copies those files into Alice&apos;s repo, updates
    her working tree, and it&apos;s done.

&lt;p&gt; It&apos;s a little trickier if Alice had time to make some changes, too.  Now
    Alice has to merge the two sets of changes, and then let Bob pull the
    merged files onto &lt;em&gt;his&lt;/em&gt; computer.  By the way, a &quot;pull&quot; is just a
    fetch followed by a merge, but it&apos;s so common that git has a shorthand way
    of doing it. (I&apos;m oversimplifying here, but this isn&apos;t the time to go into
    the difference between merge and rebase.  It&apos;s also not a good time to
    talk about branches -- maybe some other week.)  As you can imagine, this
    gets out of hand pretty quickly, and it&apos;s even worse if there&apos;s a whole
    team working on the project.

&lt;p&gt; The obvious thing to do is for the group to have one repo on a server
    somewhere that has what everyone agrees is the definitive set of files on
    it.  Bob pushes his changes to the server, and when Alice tries to push
    &lt;em&gt;her&lt;/em&gt; changes, git balks and gives her an error message.  Now it&apos;s
    Alice&apos;s responsibility to make any necessary fixes and push them to the
    server.  Actually, in a real team, Alice would send her proposed changes
    around by making a diff and sending email to the other team members to
    review, and not actually push her changes until someone approves them.

&lt;p&gt; In a large team, this is kind of a hub-and-spokes arrangement.  You can
    see where this is going, right? 

&lt;p&gt; &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt; is a company that provides a place
    for people and projects to put shared git repositories where other people
    can see them, clone them, and contribute to them.  GitHub has become
    wildly popular, because it&apos;s a great place to share software.  If you have
    an open-source software project, putting a public repo on GitHub is the
    most effective way to reach developers.  It&apos;s so popular that Google and
    Microsoft shut down their own code-hosting sites (Google Code and CodePlex
    respectively) and moved to GitHub.  Microsoft, it turns out, is GitHub&apos;s
    biggest contributor.

&lt;p&gt; Putting a public repository on GitHub is free.  If you want to set up
    &lt;em&gt;private&lt;/em&gt; repositories, GitHub will charge you for it, and if your
    company wants to put a clone of GitHub on its own private servers they can
    buy GitHub Enterprise, but if your software is free, so&apos;s your space on
    GitHub.

&lt;p&gt; That&apos;s a bit of a problem, because the software that runs GitHub is
    &lt;em&gt;not&lt;/em&gt; free.  That means that they need a steady stream of income to
    pay their in-house developers, because they&apos;re not going to get any help
    from the open-source developer community.  GitHub lost $66 million in
    2016, and doesn&apos;t really have a sustainable business model that would make
    them attractive to investors.  They needed to get acquired, or they had a
    real risk of going under.  And when a service based on proprietary
    software goes under, all of their customers have a big problem.  But their
    users?  Heh.

&lt;p&gt; Everybody knows the old adage, &quot;if you&apos;re getting a service for free
    you&apos;re not the customer, you&apos;re the product.&quot;  That&apos;s especially true for
    companies like Google and Facebook, which sell their users&apos; eyeballs to
    advertisers.  It&apos;s a lot less true for a company whose users can leave any
    time they want, painlessly, taking all their data &lt;em&gt;and their
    readers&lt;/em&gt; with them.  I&apos;m sure most of my readers here on Dreamwidth
    remember what happened to Livejournal when they got bought by the
    Russians.  Well, GitHub is being bought by Microsoft.  It&apos;s not entirely
    clear which is worse.

&lt;p&gt; GitHub has an even worse problem than Livejournal did, because
    &quot;cross-posting&quot; is basically the way git &lt;em&gt;works.&lt;/em&gt; There&apos;s a company
    called &lt;a href=&quot;https://gitlab.com&quot;&gt;GitLab&lt;/a&gt; that looks a lot like
    GitHub, except that their core software -- the stuff that wraps a slick
    web interface around a git repository -- is open source.  (They do sell
    extensions, but most projects aren&apos;t going to need them.)  If you want to
    set up your own private GitLab site, it&apos;s free, and you can do it in ten
    minutes with a one-line command.  If you find bugs, you can fix them
    yourself.  You&apos;ll find a couple of great quotes from their blog at the end
    of the notes, but the bottom line is that 100,000 repositories have moved
    from GitHub to GitLab &lt;em&gt;in the last 24 hours.&lt;/em&gt;

&lt;p&gt; And once you&apos;ve moved a project to GitLab, you don&apos;t have to worry about
    what happens to it, because the open-source core of it will continue to be
    maintained by its community.  That&apos;s what happened when a company called
    Netscape went belly-up:  Mozilla Firefox is still around and doing fine.
    And if the fact that GitLab is for profit is a problem for you, there&apos;s
    Apache Allura, gitolite3, gitbucket, and gitweb (to name a few).  Go for
    it! 

&lt;p&gt; &amp;nbsp;
&lt;p&gt; This &lt;em&gt;so&lt;/em&gt; wasn&apos;t what I was planning to write today.

&lt;pre&gt;&lt;strong&gt;Notes:&lt;/strong&gt;
  @ &lt;a href=&quot;https://www.linuxjournal.com/content/microsoft-reportedly-acquire-github&quot;&gt;Microsoft Reportedly Acquires GitHub | Linux Journal&lt;/a&gt;
    The article ends with a list of alternatives:
    &lt;a href=&quot;https://gitea.io/en-us/&quot;&gt;Gitea&lt;/a&gt;
    &lt;a href=&quot;https://allura.apache.org/&quot;&gt;Apache Allura&lt;/a&gt;
    &lt;a href=&quot;https://gitbucket.github.io/&quot;&gt;GitBucket: A Git platform&lt;/a&gt;
    &lt;a href=&quot;https://about.gitlab.com/&quot;&gt;GitLab&lt;/a&gt;
  @ &lt;a href=&quot;http://www.tfir.io/microsoft-acquires-github-for-7-5-billion/&quot;&gt;Microsoft acquires GitHub for $7.5 billion - TFiR&lt;/a&gt;
    &quot; According to reports, GitHub lost over $66 millions in 2016. At the same time
      GitLab, a fully open source and decentralized service is gaining momentum, giving
      users a fully open source alternative. &quot;
  @ &lt;a href=&quot;https://news.microsoft.com/2018/06/04/microsoft-to-acquire-github-for-7-5-billion/&quot;&gt;Microsoft to acquire GitHub for $7.5 billion | Stories&lt;/a&gt; official press release
  @ &lt;a href=&quot;https://blogs.microsoft.com/blog/2018/06/04/microsoft-github-empowering-developers/&quot;&gt;Microsoft + GitHub = Empowering Developers - The Official Microsoft Blog&lt;/a&gt;
  @ &lt;a href=&quot;https://blog.github.com/2018-06-04-github-microsoft/&quot;&gt;A bright future for GitHub | The GitHub Blog&lt;/a&gt;
  @ &lt;a href=&quot;https://about.gitlab.com/2018/06/03/microsoft-acquires-github/&quot;&gt;Congratulations GitHub on the acquisition by Microsoft | GitLab&lt;/a&gt;
    &quot; While we admire what&apos;s been done, our strategy differs in two key areas. First,
      instead of integrating multiple tools together, we believe a single application,
      built from the ground up to support the entire DevOps lifecycle is a better
      experience leading to a faster cycle time. Second, it’s important to us that the
      core of our product always remain open source itself as well. &quot;
  @ &lt;a href=&quot;https://about.gitlab.com/2018/06/05/gitlab-ultimate-and-gold-free-for-education-and-open-source/&quot;&gt;GitLab Ultimate and Gold now free for education and open source | GitLab&lt;/a&gt; 
    &quot; It has been a crazy 24 hours for GitLab. More than 2,000 people tweeted about
      #movingtogitlab. We imported over 100,000 repositories, and we&apos;ve seen a 7x increase
      in orders. We went live on Bloomberg TV. And on top of that, Apple announced an
      Xcode integration with GitLab. &quot;
&lt;/pre&gt;

&lt;p&gt; &lt;em&gt;Another fine post from &lt;a href=&quot;https://mdlbear.dreamwidth.org/tag/curmudgeon&quot;&gt;The Computer Curmudgeon&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1622746&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1622746.html</comments>
  <category>software</category>
  <category>curmudgeon</category>
  <category>open-source</category>
  <category>git</category>
  <category>microsoft</category>
  <category>github</category>
  <category>computers</category>
  <lj:mood>didactic</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>9</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1621179.html</guid>
  <pubDate>Sat, 26 May 2018 04:52:53 GMT</pubDate>
  <title>Computer Languages:  compiled, interpreted, and assembled.</title>
  <link>https://mdlbear.dreamwidth.org/1621179.html</link>
  <description>

&lt;p&gt; A few months ago while waiting for a ferry with my sister I mentioned a
    programming language called Elm, which I&apos;ve been particularly interested
    in because it&apos;s a functional language that compiles into Javascript.  Her
    response, predictably, was something like &quot;I have no idea what you just
    said.  What does &apos;compiles&apos; mean?&quot;  So I explained the difference between
    compilers and interpreters, and a few other things about programming
    languages, and she said that it was the first time anyone had explained
    how programming languages work in a way that made sense to her.  In the
    back of my mind, I thought it might someday make an interesting blog post.
    So here it is.

&lt;p&gt; Inside of a computer, everything is a number.  These days, these numbers
    are all represented in binary (base two -- just ones and zeroes), stored
    in a couple of billion numbered locations each of which holds eight binary
    digits.  (A binary digit is called a &quot;bit&quot;, and eight of them together
    make a &quot;byte&quot;, which is the amount of data needed to represent a number
    between 0 and 255, or a single character in a block of text.  Apart from
    the numerical coincidence, computer bits have nothing to do with the bits
    that were made by breaking apart &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Spanish_dollar&quot;&gt;pieces of
    eight&lt;/a&gt;&quot;.)

&lt;p&gt; The numbers in the computer&apos;s memory are used for three different things.
    First, some of them are used to represent the data that the computer is
    going to be working on.  Second, some of them represent the
    &lt;em&gt;location&lt;/em&gt; of those data.  And finally, some of them are
    instructions that tell the computer what to &lt;em&gt;do&lt;/em&gt; with the
    data.  Those instructions are called &quot;machine language&quot; because they&apos;re
    the only thing the machine actually understands.  Nobody writes programs
    in machine language if they can possibly avoid it.

&lt;p&gt; &lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://mdlbear.dreamwidth.org/1621179.html#cutid1&quot;&gt;the details&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;

&lt;p&gt; TL;DR: an &lt;em&gt;assembler&lt;/em&gt; turns each line in a program directly into a
    machine-language instruction.  A &lt;em&gt;compiler&lt;/em&gt; takes a program written
    in a more complicated (for the computer) but easier to write in (for
    people) and turns it into a sequence of machine-language instructions,
    that can then be read back in and run.  An &lt;em&gt;interpreter&lt;/em&gt; skips that
    last step -- instead of writing out the machine language instructions, it
    just &lt;em&gt;does them&lt;/em&gt; on the spot.

&lt;p&gt; Teaser:  Next time I&apos;ll talk about different kinds of programming
    languages:  functional, imperative, object-oriented, and scripting.  I&apos;m
    also open to suggestions -- what would &lt;em&gt;you&lt;/em&gt; like me to write about?&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1621179&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1621179.html</comments>
  <category>interpreters</category>
  <category>assemblers</category>
  <category>compilers</category>
  <category>curmudgeon</category>
  <category>software</category>
  <lj:mood>didactic</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1617265.html</guid>
  <pubDate>Sat, 21 Apr 2018 20:32:24 GMT</pubDate>
  <title>Project Planning</title>
  <link>https://mdlbear.dreamwidth.org/1617265.html</link>
  <description>

&lt;p&gt; It&apos;s time to do a little planning.  As you may remember from &lt;a href=&quot;https://mdlbear.dreamwidth.org/1616782.html&quot;&gt;the previous post in
    this series&lt;/a&gt;, there are some projects I want to work on.  (I also
    &lt;em&gt;need&lt;/em&gt; to find a job, but that&apos;s a not completely separate issue.
    If anyone needs an expert Java programmer or a git expert, let me know.)
    The ones I want to concentrate on today are the apps, specifically the
    &lt;strong&gt;checklist&lt;/strong&gt; app and the &lt;strong&gt;setlist&lt;/strong&gt; app.  The
    first major decision about each of them is which framework to base them
    on.

&lt;p&gt; I really want to learn both &lt;a href=&quot;https://reactjs.org/&quot;&gt;React&lt;/a&gt;
    (with &lt;a href=&quot;https://facebook.github.io/react-native/&quot;&gt;React Native&lt;/a&gt;
    on the back end), and &lt;a href=&quot;http://elm-lang.org/&quot;&gt;Elm&lt;/a&gt; (with &lt;a href=&quot;https://github.com/electron/electron&quot;&gt;Electron&lt;/a&gt; on the back
    end), and I think it makes the most sense to write -- or at least start --
    the checklist app first, and use React for it.

&lt;h3&gt;Here&apos;s my reasoning:&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt; &lt;strong&gt;React: &lt;/strong&gt; React is by far the more popular of the two
       frameworks, so a lot of jobs ask for React experience.  One reason it&apos;s
       more popular is that it&apos;s basically just a Javascript library --
       programs look like Javascript with a little bit of HTML and HTML-like
       tags embedded in it.  It&apos;s easy to learn (not that that&apos;s really a
       problem for me -- see below), and there are a lot of starter kits and
       tutorials around.
  &lt;li&gt; &lt;strong&gt;Checklist app:&lt;/strong&gt; It&apos;s pretty clear that the Checklist
       app will have a much wider audience, so it makes sense to do that
       first.  It will also be easier to monetize (possibly as a freemium app,
       with the free version stand-alone and the premium version tied to a
       back-end service).
  &lt;li&gt; The &lt;strong&gt;Setlist&lt;/strong&gt; app, which includes a lyrics viewer and
       playlist generator as well, is likely to start out using my rather
       unusual music toolchain, and would actually be more useful (and get
       a lot more traffic) as a front end to the &lt;a href=&quot;https://lookingglassfolk.com/&quot;&gt;lookingglassfolk.com&lt;/a&gt; and &lt;a href=&quot;https://steve.savitzky.net/&quot;&gt;steve.savitzky.net&lt;/a&gt; Song pages.
       It makes sense for it to start out as part of a website rather than as
       a stand-alone app.
  &lt;li&gt; &lt;strong&gt;Elm&lt;/strong&gt; is a pure functional language (I &lt;em&gt;love&lt;/em&gt;
       functional languages, which is why it would be easy for me) that is
       closer to Haskell than to Javascript.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;

&lt;h3&gt;Next steps:&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt; Make a place in my working tree for projects.  Try not to give in to
       the temptation to completely refactor the whole hierarchy.  
  &lt;li&gt; Pull down and install a &lt;a href=&quot;https://reactjs.org/community/starter-kits.html&quot;&gt;React starter
       kit&lt;/a&gt; and some kind of Elm starter kit.
  &lt;li&gt; Set up the projects&apos; git repos and working trees.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1617265&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1617265.html</comments>
  <category>meta</category>
  <category>projects</category>
  <category>dev</category>
  <category>web</category>
  <category>software</category>
  <category>apps</category>
  <lj:mood>stressed</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1616782.html</guid>
  <pubDate>Fri, 13 Apr 2018 13:26:02 GMT</pubDate>
  <title>Projects!</title>
  <link>https://mdlbear.dreamwidth.org/1616782.html</link>
  <description>&lt;p&gt; It&apos;s been just short of a year since I retired, and I don&apos;t have a whole
    lot to show for it in the way of programming, apart from a little work on
    &lt;a href=&quot;https://github.com/ssavitzky/MakeStuff&quot;&gt;MakeStuff&lt;/a&gt;.  OK, a
    fair amount.  And it has an actual user now.  But still.

&lt;p&gt; Somewhere around the New Year I started making a(nother) list of potential
    projects that I wanted to work on in my retirement.  As these things do,
    it got out of hand -- at last count there were 86 unfinished items in it.
    Time to start something.

&lt;p&gt; There are a few constraints.  I can&apos;t start any of the woodworking
    projects yet, because the contents of the garage are in storage waiting
    for the remodeling to get finished; that includes all of the woodworking
    tools.  So there&apos;s that.  Same for the recording projects -- my good
    microphones have either been boxed, or vanished altogether in the last
    move.

&lt;p&gt; More than half the &quot;projects&quot; on the list are ideas for articles or blog
    posts -- there are forty or so of those.  I should start picking them off,
    one or two every week, but they&apos;re not really &lt;em&gt;projects.&lt;/em&gt;

&lt;p&gt; What remains is mostly software:  programs (the young people call them
    &quot;apps&quot; these days) and work on my websites.  These are also areas where I
    have a lot to learn, and where I can develop skills that will be useful if
    I want -- or need -- to do some consulting.  And there&apos;s another factor:
    &lt;em&gt;there&apos;s really no difference between a web app and a mobile app!&lt;/em&gt;
    Not any more:  with &lt;a href=&quot;https://facebook.github.io/react-native/&quot;&gt;React Native&lt;/a&gt; and &lt;a href=&quot;https://github.com/electron/electron&quot;&gt;Electron&lt;/a&gt;, one can now build stand-alone cross-platform applications
    using web front-end frameworks -- they basically bundle a stripped-down
    browser and a trivial server with your web&quot;site&quot;, which is often just a
    &lt;em&gt;Single-Page Application&lt;/em&gt; (SPA).  And with languages like &lt;a href=&quot;http://elm-lang.org/&quot;&gt;Elm&lt;/a&gt; that compile into Javascript,...

&lt;h3&gt;I can haz apps&lt;/h3&gt;

&lt;p&gt; One app I want to write will be for managing checklists.  (There&apos;s an
    existing app called Checkmate -- my first choice for a name; grumble --
    that looks worth mining for ideas.)  Beyond being able to have multiple,
    named lists, I want timing information so that one can ask questions like
    &quot;how long ago did I last take my pain medication, and is it safe to take
    another dose?&quot;  That needs to work for both scheduled items, and
    &quot;as-needed&quot;, floating items that can start their timer going at any time.
    More like a combination checklist and reminder system.  I&apos;d also like to
    be able to track the time it takes to go through a checklist, both so that
    I know when to start if I&apos;m getting ready for something, and so that I
    know how much I&apos;m improving with practice.  Eventually it would be nice to
    link this to both a website and an Alexa skill -- the website will be
    easy, since almost the entire app will be usable as the front end.

&lt;p&gt; It would be nice to have a combined lyrics viewer and a setlist planner.
    (I used to have a setlist planner, but it was in Perl and kept its state
    in the HTTP query string - bad news for caching and sort of search-engine
    pessimization.)  There would be some overlap with the checklist app, since
    they both involve going through a list of things in sequence, with
    associated times.  It would be especially useful on a tablet for
    performances, but it would be most effective combined with a website that
    hosts lyrics and music, which brings us to...

&lt;h3&gt;What a mangled web&lt;/h3&gt;

&lt;p&gt; Another thing I&apos;ve been looking at is &quot;&lt;a href=&quot;https://responsivedesign.is/&quot;&gt;Responsive Web Design&lt;/a&gt;&quot; -- making
    websites that adjust smoothly between tiny mobile devices and large-screen
    desktops.  This has long been a design requirement of mine anyway --
    almost all my sites do this, but they do it by simply not having much of a
    layout, and they look bad both on very large screens and very small ones.
    It&apos;s time to take this to the next level by adding responsive CSS and
    mobile.

&lt;p&gt; There are several websites that need work:  &lt;a href=&quot;https://lookingglassfolk.com/&quot;&gt;lookingglassfolk.com&lt;/a&gt;, &lt;a href=&quot;https://steve.savitzky.net/&quot;&gt;steve.savitzky.net&lt;/a&gt;, &lt;a href=&quot;https://Stephen.Savitzky.net/&quot;&gt;Stephen.Savitzky.net&lt;/a&gt;, and &lt;a href=&quot;https://hyperspace-express.com/&quot;&gt;hyperspace-express.com&lt;/a&gt; at
    least.  The first one is by far the simplest; just songs, concerts,
    (proposed) albums, and a gig schedule.  &lt;a href=&quot;https://steve.savitzky.net/&quot;&gt;steve.savitzky.net&lt;/a&gt; adds writing and
    software projects, but there&apos;s still a lot of overlap.  

&lt;p&gt; It would make sense to do the others using &lt;em&gt;different&lt;/em&gt;
    responsive design frameworks, just to get experience with a few of the
    options.  &lt;a href=&quot;https://Stephen.Savitzky.net/&quot;&gt;Stephen.Savitzky.net&lt;/a&gt;, in
    particular, is my &quot;portfolio&quot; site; it&apos;s also the only one that has a
    sidebar at the moment.  It might be a good idea to turn into a GitHub
    Pages site.   &lt;a href=&quot;https://hyperspace-express.com/&quot;&gt;hyperspace-express.com&lt;/a&gt; is my
    &quot;commercial&quot; site, and it would make sense to use a CMS like Joomla or
    Drupal for it.

&lt;p&gt; (I have some other sites, e.g. &lt;a href=&quot;https://rainbows-end.net/&quot;&gt;rainbows-end.net&lt;/a&gt; and &lt;a href=&quot;https://thestarport.org/&quot;&gt;thestarport.org&lt;/a&gt;, but they&apos;re simple
    enough to simply copy the CSS from one of the others.  The &lt;a href=&quot;https://thestarport.org/places/&quot;&gt;Interesting.Places&lt;/a&gt; sub-site
    would be worth some attention.)

&lt;h3&gt;Now, here&apos;s my plan...&lt;/h3&gt;

&lt;p&gt; The underlying reason for picking this particular set of projects is to
    market myself as a blogger, consultant, and developer, in hopes of making
    a little money on the side.  That suggests that I should start with the
    checklist app, and probably start the site makeovers by moving &lt;a href=&quot;https://Stephen.Savitzky.net/&quot;&gt;Stephen.Savitzky.net&lt;/a&gt; to a GitHub
    site (which would give me an obvious home for projects like &lt;a href=&quot;https://github.com/ssavitzky/MakeStuff&quot;&gt;MakeStuff&lt;/a&gt; and my
    development-focussed blogging).  On the other hand, making over &lt;a href=&quot;https://steve.savitzky.net/&quot;&gt;steve.savitzky.net&lt;/a&gt; would probably
    teach me more about responsive design, especially if I make S.S.net into a
    GitHub site.  It might make more sense to keep S.S.net as a separate site,
    and build the GitHub site from scratch.

&lt;p&gt; In any case, my main blogging site will remain here on &lt;a href=&quot;https://mdlbear.dreamwidth.org/&quot;&gt;Dreamwidth&lt;/a&gt;; most likely I&apos;ll
    just cross-post development-related blog entries to S.S.net (and
    GitHub, if it&apos;s separate).  Or would it make more sense to keep all of the
    blogging concentrated here?

&lt;p&gt; Comments?  Ideas?  Suggestions?  Over to you folks.&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1616782&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1616782.html</comments>
  <category>meta</category>
  <category>dev</category>
  <category>projects</category>
  <category>web</category>
  <category>software</category>
  <lj:mood>motivated?</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>19</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1607885.html</guid>
  <pubDate>Mon, 04 Dec 2017 01:00:23 GMT</pubDate>
  <title>Done last month (20171126Su - 1202Sa)</title>
  <link>https://mdlbear.dreamwidth.org/1607885.html</link>
  <description>&lt;p&gt; Got a few things done; a little guitar (in 5-minute noodles, but still --
    I need to get my fingers back in shape) and a little hacking (kludged
    together a script for posting to DW from Emacs, using a bash front end to
    &lt;code&gt;charm&lt;/code&gt;, which seems to be the only available command-line
    client.  I can do better, but this was good enough for last week&apos;s post,
    and this week&apos;s).  I also figured out why &lt;code&gt;ljupdate.el&lt;/code&gt; is
    still broken: it&apos;s using an HTTP GET macro that doesn&apos;t handle https.  :P 

&lt;p&gt; I&apos;ve brought up over half of our CDs, and gotten most of them onto
    shelves.  The new organzation, subject to minor revisions, is:

&lt;blockquote&gt;&lt;small&gt;
&lt;ul&gt;
  &lt;li&gt; Filk/folk/rock/pop/etc. alphabetical by performer.  Last name for people.
  &lt;li&gt; Filk/folk/rock/pop/etc. collections, alphabetical by title.
  &lt;li&gt; Classical alphabetical by composer.  Special exception for Gilbert
       &amp;amp; Sullivan, filed under G.
  &lt;li&gt; Classical collections, alphabetical by performer or title, whichever
       makes more sense.
  &lt;li&gt; Jazz, alphabetical by performer.
  &lt;li&gt; Show tunes and operas, alphabetical by title.
  &lt;li&gt; Natural sounds, relaxation, ambient, etc.  alphabetical by title.
  &lt;li&gt; Christmas music, alphabetical by performer.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/small&gt;&lt;/blockquote&gt;
&lt;p&gt; The household coined two new words:  &quot;rambronxious&quot; (portmanteau, me) and
    &quot;rambrooxious&quot; (portmanteau, N).  These join &quot;rambunct&quot; (back-formation)
    as a verb.  We (finally) have our fridge&apos;s icemaker working.  The thing
    was apparently wrecked by having been left to freeze, sometime before 2015
    when the house was installed.  (What&apos;s the right verb for a manufactured
    home?  Not &quot;built&quot;, certainly.  &quot;Manufactured&quot;, maybe.)

&lt;p&gt; Not nearly as productive on the psych front -- the LCSW I contacted last
    week isn&apos;t taking new clients.  And there are only a handful of therapists
    on the island who take Medicare.  (No surprise, especially to those
    following &lt;a href=&quot;https://siderea.dreamwidth.org/1279873.html&quot;&gt;siderea&lt;/a&gt;.)  So I got stuck, as I usually do.

&lt;p&gt; I did, however have an Insight(TM), which is that I&apos;m still nowhere near
    recovered from two years of burnout at Amazon.  (Below you will find a few
    links for burnout recovery.  Helpful, but not excessively so.)  I also
    started using my happy light.  (Yeah; it&apos;s a SAD light -- &quot;happy light&quot; is
    the brand.)  And Ticia has been exceptionally cuddly, which is nice.

&lt;p&gt; And one more insight:  I figured out why I don&apos;t like writing in Markdown
    or other text formats, and prefer LaTeX or HTML:  they&apos;re basically
    &lt;em&gt;physical&lt;/em&gt; markup, not semantic markup.  In HTML I can, for
    example, distinguish between a &lt;cite&gt;citation&lt;/cite&gt; and
    &lt;em&gt;emphasis&lt;/em&gt;, even though they both get shown as italics.  Given my
    current set of emacs bindings, HTML is easier for most things; songs and
    poems are easier in LaTeX with my &lt;a href=&quot;https://github.com/ssavitzky/MakeStuff/tree/master/TeX&quot;&gt;FlkTeX&lt;/a&gt;
    macros. 

&lt;p&gt;&lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://mdlbear.dreamwidth.org/1607885.html#cutid1&quot;&gt;Notes &amp; links, as usual&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1607885&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1607885.html</comments>
  <category>neighbors</category>
  <category>unpacking</category>
  <category>software</category>
  <category>cats</category>
  <category>done</category>
  <category>household</category>
  <category>psych</category>
  <lj:mood>okay?</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>9</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1605637.html</guid>
  <pubDate>Sun, 26 Nov 2017 20:07:36 GMT</pubDate>
  <title>third time&apos;s the charm</title>
  <link>https://mdlbear.dreamwidth.org/1605637.html</link>
  <description>test headers&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1605637&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1605637.html</comments>
  <category>software</category>
  <category>test</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1597193.html</guid>
  <pubDate>Mon, 26 Jun 2017 01:46:17 GMT</pubDate>
  <title>Done last week (20170618Su - 24Sa)</title>
  <link>https://mdlbear.dreamwidth.org/1597193.html</link>
  <description>&lt;p&gt; I spent pretty much the whole week, during &quot;working hours&quot; anyway, working
    on a project that&apos;s been on my queue for years:  getting my lyrics to
    print two-sided and ensuring that if songs occupy two pages that they span
    an even-odd two page spread.  It&apos;s working, as of this afternoon.

&lt;p&gt; There are a couple of subtleties.  Notably, if you&apos;re just printing a
    whole bound songbook, you don&apos;t care which side of the page a one-page song goes
    on.  If you&apos;re printing individual songs to go into a looseleaf binder, on
    the other hand, you need a cover sheet on the first (right-hand) page to
    force both pages of a two-page song onto the correct page.  And of course
    if you&apos;re printing lyrics to go on a song&apos;s web page, you &lt;em&gt;don&apos;t&lt;/em&gt;
    want the cover page.  But I have it working.

&lt;p&gt; I also got Father&apos;s Day calls from both of my kids, got the keys to the new
    house (in a little party Monday afternoon), scheduled our move out of the
    apartment (for Wednesday July 12th, which will give us a little time to
    pack), got in contact with the various utility companies, and, ... I&apos;m not
    sure there was much else.  That&apos;s probably enough.

&lt;p&gt; I still have the persistent feeling of not getting much done, and I&apos;m
    constantly appalled at how much has to be done before we can move into the
    new place, and how little time we have.  I&apos;m still scared about how little
    money we have, and worried about the amount of stuff we still have to do
    to the new house to make it work for our family.

&lt;p&gt; Not to mention whether we&apos;ll have anything at all left after Trump and his
    goons get through destroying our social safety net, not to mention the
    planet.

&lt;p&gt; And speaking of global warming, it&apos;s in the 90s this week.  For Seattle,
    that&apos;s scorching.

&lt;p&gt;&lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://mdlbear.dreamwidth.org/1597193.html#cutid1&quot;&gt;Notes &amp; links, as usual&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1597193&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1597193.html</comments>
  <category>software</category>
  <category>music</category>
  <category>done</category>
  <category>house</category>
  <category>links</category>
  <lj:mood>accomplished</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1595282.html</guid>
  <pubDate>Sun, 14 May 2017 21:35:19 GMT</pubDate>
  <title>Done last week (20170507Su - 13Sa)</title>
  <link>https://mdlbear.dreamwidth.org/1595282.html</link>
  <description>&lt;p&gt; It&apos;s been another rough week.  This week it&apos;s been mostly health care -- I
    found out Tuesday that Amazon hadn&apos;t continued my health care as they said
    they were going to, so I was unable to order Colleen&apos;s humira.  (Which, at
    $1800 for two doses, isn&apos;t something one wants to pay for out of pocket.)
    My HR contact is looking into it, but it took several days to get through;
    meanwhile I went online and signed up for Medicare Part D and identified a
    Medigap provider (ExpressScripts and Premera Blue Cross; both for
    continuity and because they seem to get top reviews.  Who knows how long
    that will last under Trump(Doesn&apos;t)Care.)

&lt;p&gt; I know there&apos;s something called compassion fatigue.  Is despair fatigue a
    thing?  Or is that just another phase of despair?  I find myself incapable
    of being surprised at &lt;a href=&quot;https://solarbird.dreamwidth.org/tag/fascism+watch&quot;&gt;whatever
    outrageous thing Trump and the &quot;Republicans&quot; have done each day&lt;/a&gt;.  (I put
    &quot;Republicans&quot; in quotes because they are rapidly turning this country into
    a right-wing dictatorship.  I feel powerless to stop them.)  

&lt;p&gt; Onward.  Had a really good trip with Colleen up to Whidbey Island; we went
    up the whole length of it and came back by way of Deception Pass.  It&apos;s
    been a very long time since Colleen and I went out for a drive that long
    that was just a drive -- our occasional loop drives along the California
    coast were probably the last ones.  It was a little too long, but it went
    ok.

&lt;p&gt; I&apos;ve been spending much of my spare time catching up on my reading.  For
    some reason I&apos;d stopped reading &lt;a href=&quot;https://lwn.net/&quot;&gt;LWN (Linux
    Weekly News)&lt;/a&gt; sometime around the first of the year; in the last two
    weeks I&apos;ve completely caught up.  You can see the results in the links,
    most of which came from LWN, or indirectly by way of &lt;a href=&quot;http://sachachua.com/blog/about/&quot;&gt;Sacha Chua&lt;/a&gt;&apos;s awesome &lt;a href=&quot;http://sachachua.com/blog/category/geek/emacs/emacs-news/&quot;&gt;Emacs
    News&lt;/a&gt;.  I&apos;ve also been finding Whidbey-related links.  At some point I
    need to go back through my to.do archives, extract all the links, and
    aggregate them.  They&apos;re kind of useless scattered across blog entries the
    way they are.

&lt;p&gt; I&apos;ve even done a little walking (not quite every day, and not much because
    I seem to be walking at about half my old 3mph pace), a little music, and
    a little hacking (almost entirely cleanup tasks).  On the whole, I appear
    to have been keeping myself busy in a relaxed kind of way, though I
    haven&apos;t yet fallen into any kind of routine.  Later, hopefully.

&lt;p&gt; But.

&lt;p&gt; My last few trips down to the house we used to call Rainbow&apos;s End (should
    we call it &quot;Rainbow&apos;s Ended&quot; now?) have been increasingly sad and
    discouraging.  We put a lot of ourselves into that house; it was a large
    part of what we were as a family.  Now we&apos;re scattered.  We&apos;ll come back
    together, mostly, on Whidbey Island in a little over two months; it may
    very well be wonderful -- I hope it will -- but it won&apos;t be the same.  I
    can&apos;t keep from thinking of what I might have done differently, over the
    last few decades(!), that might have made it possible to stay there.  Hell,
    we all made decisions that seemed like the right thing at the time.  Can&apos;t
    be fixed.

&lt;p&gt; &quot;I can&apos;t fix it!&quot; is probably what I say most often when things are going
    badly.  It always feels like my fault.  I don&apos;t think I can fix
    &lt;em&gt;that&lt;/em&gt;, either.  I should shut up and go for a walk with Colleen.

&lt;p&gt;&lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://mdlbear.dreamwidth.org/1595282.html#cutid1&quot;&gt;Notes &amp; links, as usual&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1595282&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1595282.html</comments>
  <category>links</category>
  <category>software</category>
  <category>linux</category>
  <category>emacs</category>
  <category>emotions</category>
  <category>done</category>
  <category>moving</category>
  <category>psych</category>
  <lj:mood>unknown</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>9</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1582715.html</guid>
  <pubDate>Sun, 27 Nov 2016 17:57:17 GMT</pubDate>
  <title>Done this week (20161121Mo - 26Sa)</title>
  <link>https://mdlbear.dreamwidth.org/1582715.html</link>
  <description>&lt;p&gt; So I took the week off from work.  I&apos;d originally planned to return from
    Orycon Sunday afternoon, and go in to work Monday and possibly Wednesday.
    The best-laid plans...  Monday was occupied by the drive back from
    Portland, Tuesday by medical stuff (including a urology appointment on
    short notice for Colleen), and Wednesday by waiting for the tech from
    Acorn to show up and do the proper inspection that the tech who had
    arrived early on Monday had failed to do.  So.

&lt;p&gt; Spent much of the week on personal software projects.  Wednesday and
    Thursday I was mostly hacking in my .emacs file, fixing some long-standing
    annoyances with html-helper-mode (and incidentally lj-update-mode, which
    is partially derived from it).  Friday and Saturday I worked on the build
    software for my website Songs pages -- you can see the results (so far --
    there&apos;s still quite a bit of prettying-up to do) on &lt;a href=&quot;http://lookingglassfolk.com/Songs/&quot;&gt;LookingGlass Folk&amp;apos;s
    Songs&lt;/a&gt;.  The LgF page was the main motivation -- it&apos;s been a broken
    link on the site for &lt;em&gt;years.&lt;/em&gt; The secondary motivation was putting
    my songbook on GitHub.

&lt;p&gt; In the course of doing this, I finally got around to writing &lt;a href=&quot;https://github.com/ssavitzky/MakeStuff/tree/master/test&quot;&gt;tests&lt;/a&gt;
    for the makefiles -- predictably, they turned up lots of bugs.  By no
    means complete, but I now also have an easily-extensible test framework
    that I can use for the rest of &lt;a href=&quot;https://github.com/ssavitzky/MakeStuff&quot;&gt;MakeStuff&lt;/a&gt; and my other
    make-based projects like &lt;a href=&quot;https://github.com/ssavitzky/Honu&quot;&gt;Honu&lt;/a&gt;.

&lt;p&gt; Thursday we had a Thanksgiving dinner that couldn&apos;t be beat.  Glenn &lt;a href=&quot;https://en.wikipedia.org/wiki/Spatchcock&quot;&gt;spatchcocked&lt;/a&gt; the bird
    -- this was my introduction to the technique, which lets a 16-pound turkey
    cook in two hours with a beautifully crisp skin.  Recommended.  There
    were just Colleen and I, Glenn and Naomi, and N&apos;s kids.  The YD had dinner
    with her boyfriend&apos;s family, and Chaos spent the day working on term
    papers.  The tenants ate at C&quot;&apos;s parents&apos;.  (I may have to go to
    subscripts.) 

&lt;p&gt; Fair amount of political stuff in the links; not going to re-hash most of
    it because apparently &lt;a href=&quot;http://www.alternet.org/personal-health/new-ptsd-post-trump-stress-disorder&quot;&gt;Post-Trump Stress Disorder&lt;/a&gt; is a thing, and I haz it.  I can, however,
    recommend &lt;a href=&quot;http://moem.dreamwidth.org/tag/cybersecurity&quot;&gt;moem&apos;s
    Cybersecurity for the Trumped&lt;/a&gt; series, and &lt;a href=&quot;https://www.torproject.org/projects/torbrowser.html.en&quot;&gt;Tor
    Browser&lt;/a&gt;. 

&lt;p&gt;&lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://mdlbear.dreamwidth.org/1582715.html#cutid1&quot;&gt;Notes &amp; links, as usual&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1582715&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1582715.html</comments>
  <category>done</category>
  <category>thanksgiving</category>
  <category>web</category>
  <category>software</category>
  <category>vacation</category>
  <category>music</category>
  <category>2016</category>
  <lj:music>-related software</lj:music>
  <lj:mood>calm</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1578651.html</guid>
  <pubDate>Sun, 11 Sep 2016 18:24:19 GMT</pubDate>
  <title>Done last week (20160904Su - 10Sa)</title>
  <link>https://mdlbear.dreamwidth.org/1578651.html</link>
  <description>&lt;p&gt; This post covers most of my week-long vacation, so while it&apos;s not quite
    time for a wrap-up of my goals, I can say that I met about half of them.
    Which was about what I expected.

&lt;p&gt; The big accomplishment for the week, without a doubt, was posting my &lt;a href=&quot;http://steve.savitzky.net/Honu/&quot;&gt;one-line Linux setup/configuration
    package&lt;/a&gt; up on &lt;a href=&quot;https://github.com/ssavitzky/&quot;&gt;GitHub&lt;/a&gt;.  (I
    then spent much of the rest of the week debugging and tweaking, but that&apos;s
    also to be expected.) It&apos;s called &lt;a href=&quot;https://github.com/ssavitzky/Honu&quot;&gt;Honu&lt;/a&gt;, after the Hawaiian
    name for the &lt;a href=&quot;https://en.wikipedia.org/wiki/Green_sea_turtle&quot;&gt;green sea turtle&lt;/a&gt;, because a turtle carries its home around with
    it.  The README starts off with this quote from my song, &lt;a href=&quot;http://steve.savitzky.net/Songs/windward/&quot;&gt;Windward&lt;/a&gt;, because I
    just couldn&apos;t resist:

&lt;blockquote&gt;
    Where the wind takes us next year no turtle can tell&lt;br&gt;
    But we&apos;ll still be at home, come high water or hell,&lt;br&gt;
    Because home is wherever you carry your shell.
&lt;/blockquote&gt;

&lt;p&gt; The implied puns on $HOME and &lt;a href=&quot;https://www.freebsd.org/cgi/man.cgi?query=sh&amp;amp;sektion=&amp;amp;n=1&quot;&gt;sh(1)&lt;/a&gt; are, of course, entirely intentional.

&lt;p&gt; Honu is meant to be fairly general; it&apos;s expected that any user --
    including me! -- is going to want to customize the heck out of it.  To
    that end, there&apos;s a sample customization package, also on GitHub, called
    &lt;a href=&quot;https://github.com/ssavitzky/Myrtle&quot;&gt;Myrtle.&lt;/a&gt;  Of course.  (My
    &lt;em&gt;own&lt;/em&gt; customization package, which you will &lt;em&gt;not&lt;/em&gt; find on
    GitHub, is called Mathilda, after LookingGlass Folk&apos;s name for the narrator of
    &quot;Windward&quot;.) 

&lt;p&gt; It hasn&apos;t been all roses and rainbows, however.  I&apos;ve spent an inordinate
    amount of time coping with the bindweed (morning glory&apos;s evil twin) that
    has overgrown the walkway along the south side of the house, sorting a
    year or two&apos;s worth of mail, and recovering from last week&apos;s disk crash on
    the server.  I&apos;ve been doing quite a lot of writing, though a lot of that
    has been on Quora, so I&apos;m not sure whether that counts &lt;em&gt;toward&lt;/em&gt; my
    daily writing goal, or &lt;em&gt;away&lt;/em&gt; from it.

&lt;p&gt; I&apos;ll say one thing for Quora, though -- it makes me appreciate my own
    knowledge and social skills.  Being able to answer questions is a real
    boost to my self-confidence in both those areas.  Who knew?

&lt;p&gt; Psychologically, well, ... mixed.  I&apos;ve definitely been less stressed out
    the last two days of the week than the first two -- I was able to handle a
    trip downtown that turned out to be a total write-off, due to things being
    closed/not where I expected, quite calmly and even with a little wry
    humor.  The check from last week&apos;s stock sale arrived on Tuesday, which
    helped.  On the other hand, it still apparently doesn&apos;t take much
    frustration to put me back over the edge.

&lt;p&gt; I was a total wreck on Sunday.  I seem to handle stress a &lt;em&gt;lot&lt;/em&gt;
    better when I&apos;m by myself.  With Colleen around, especially, I get into a
    horrible feedback loop.  By the time I got home I could probably have used
    an Ativan, but my prescription on those has long since expired.  I settled
    for reading and gin.  Low blood sugar may have contributed; I&apos;m not sure I
    can tell the difference between anxiety and hunger.  Alexithymia in action.

&lt;p&gt; I am &lt;em&gt;not&lt;/em&gt; ready to go back to work tomorrow.  I may never be
    ready.  I&apos;ll do it, but it won&apos;t be pretty.

&lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://mdlbear.dreamwidth.org/1578651.html#cutid1&quot;&gt;Notes &amp; links, as usual&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1578651&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1578651.html</comments>
  <category>honu</category>
  <category>done</category>
  <category>psych</category>
  <category>writing</category>
  <category>vacation</category>
  <category>software</category>
  <category>github</category>
  <category>computers</category>
  <category>links</category>
  <lj:mood>relaxed</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1578100.html</guid>
  <pubDate>Sun, 04 Sep 2016 15:47:21 GMT</pubDate>
  <title>Done last week/month (20160828Su - 0903Sa)</title>
  <link>https://mdlbear.dreamwidth.org/1578100.html</link>
  <description>&lt;p&gt; If yesterday is going to be typical of this vacation (I&apos;m taking all of
    the coming week off), I&apos;m going to need a month or two of work to recover
    from it.  Not fun.

&lt;p&gt; Friday Nova, my main server, developed a corrupted root partition.  I&apos;ve
    been keeping an eye on that drive for a while, and had a replacement on
    hand, so I set up a transfer of the home and data partitions and went to
    bed.  So far, so good.

&lt;p&gt; Yesterday was another matter entirely.  Installing a new copy of Debian
    should only have taken an hour or so.  Hah!  Instead, I was plagued by a
    long series of problems, which took me pretty much the entire day to
    finally analyze.  These included:
&lt;ol&gt;
  &lt;li&gt; A corrupted download of the Debian installer.  It appeared to work ok,
       but the keys on the right-hand side of the keyboard kept generating the
       wrong characters!  WTF?
  &lt;li&gt; Apparently the idiot Intel motherboard I used for my server won&apos;t let
       you change the boot order of your hard disks (despite having a BIOS
       option that claims to do exactly that), and it considers a USB key to
       be a hard disk.  So if you have a hard drive that doesn&apos;t already have
       a bootable OS on it, it will keep the damned thing from booting.
  &lt;li&gt; Snowflake, the box I&apos;ve been using for a desktop  apparently has a
       similar problem.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt; I eventually ended up using the only other working spare system, Trantor,
    to install Ubuntu.  I then swapped the disk into the former Snowflake,
    which is significantly faster and quieter than either Trantor or the Atom
    board I&apos;d been using for Nova, so that&apos;s a win.  I also decided, since I
    now had Ubuntu on Nova, and it was the fastest machine I had, that I would
    use it as my desktop as well as my fileserver.  There are some potential
    problems with that, but I have to admit that it&apos;s convenient.

&lt;p&gt; It will probably take me a while to get everything on (Novo) Nova
    configured -- I still need to start doing backups, for example, and don&apos;t
    have a web server up yet -- but at least I have DNS and my main file store
    up and running.  But there was a lot of frustration involved.

&lt;p&gt; The frustration made me more susceptible to other sources of stress, so
    sure enough, that happened too.  Kat and Rabbit are in the process of
    moving out into their own apartment (finally!), so they brought movers
    in to handle the bed, the futon, and some other large furniture.  Which
    meant taking the seats off the stairlifts.

&lt;p&gt; And, of course, Colleen woke up and &lt;em&gt;walked down the first flight of
    stairs&lt;/em&gt; before calling for help.  I hastily put the seat back on the
    lower lift, and told Colleen (not exactly calmly -- I was pretty stressed
    at that point) that she should have gone back to the room, &lt;em&gt;sat
    down&lt;/em&gt;, and called for help.

&lt;p&gt; Then the lower lift wouldn&apos;t go back up to its charging position.  It was
    already pretty badly damaged from previous moving attempts; it turned out
    that the limit switch that detects whether the seat is turned properly had
    finally broken to the point of unusability.  Its little cam follower had
    been crumpled up from previous clumsy seat replacements.  There ensued a
    frantic search for my multimeter (and a hasty battery replacement) so that
    I could identify the normally-closed contacts on the switch and move the
    connectors to them.

&lt;p&gt; At that point I went back to my struggles with the computers.  Just as I
    was getting things pretty stable there, Colleen went up to bed.  Or tried
    to:  the bottom lift didn&apos;t want to go up.  Again.  More swearing.  More
    switches to reconnect.  A quick trip to Google to look up error code E6,
    which turned out to be the &lt;em&gt;bottom&lt;/em&gt; limit switch.  Which hadn&apos;t
    given us any trouble up to that point.

&lt;p&gt; ... by that time I was a complete wreck.  My stress level was not helped
    by being worried sick -- literally, by that point -- about the fact that
    the check from my stock sale still hasn&apos;t showed up.  And berating myself
    about not being persistent enough to figure out from Morgan Stanley&apos;s
    miserable website how to do a direct transfer.

&lt;p&gt; The one &lt;em&gt;good&lt;/em&gt; thing about all this is that I tend to wake up
    around 4:30 when I&apos;m stressed.  When I feel as though I don&apos;t have enough
    time to get everything done, it helps.

&lt;p&gt; It&apos;s been a long month.  September is &lt;em&gt;fired.&lt;/em&gt;

&lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://mdlbear.dreamwidth.org/1578100.html#cutid1&quot;&gt;Notes &amp; links, as usual&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1578100&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1578100.html</comments>
  <category>software</category>
  <category>stress</category>
  <category>psych</category>
  <category>done</category>
  <category>github</category>
  <lj:music>only a little</lj:music>
  <lj:mood>recovering</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>8</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://mdlbear.dreamwidth.org/1577522.html</guid>
  <pubDate>Sun, 28 Aug 2016 17:30:56 GMT</pubDate>
  <title>Done last week (20160821Su - 27Sa)</title>
  <link>https://mdlbear.dreamwidth.org/1577522.html</link>
  <description>&lt;p&gt; Moderately productive.  Two &quot;publishing events&quot;.
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt; &lt;a href=&quot;http://stephen.savitzky.net/Doc/single-link/&quot;&gt;Sex and the Single Link&lt;/a&gt; is up on my &quot;formal&quot; website, &lt;a href=&quot;http://stephen.savitzky.net/&quot;&gt;Stephen.Savitzky.net&lt;/a&gt;.  This
       is, despite the clickbait title, an article about the joy of
       singly-linked lists.
  &lt;/li&gt;
  &lt;li&gt; &lt;a href=&quot;https://github.com/ssavitzky/MakeStuff&quot;&gt;MakeStuff&lt;/a&gt; is up
       on &lt;a href=&quot;https://github.com/ssavitzky/&quot;&gt;GitHub&lt;/a&gt;.  This the first
       of several projects I intend to put up there; it&apos;s the collection of
       makefiles and scripts that powers all my websites.  You can see it in
       action &lt;a href=&quot;http://steve.savitzky.net/Tools/&quot;&gt;here&lt;/a&gt;. 
  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt; Apart from that, and a bunch of Quora answers, not a whole lot going on.
   &lt;a href=&quot;https://www.quora.com/Is-it-possible-to-combine-coding-writing-singing-and-curating-public-speaking-events-in-one-ordinary-adult-life&quot;&gt;One my Quora answers&lt;/a&gt; led to a good discussion on the comment thread.
    Fairly prodctive at work, though as usual not quite as much as I wanted to
    be.
&lt;/p&gt;
&lt;p&gt; One particularly interesting article for the programmers in the audience, &lt;a href=&quot;http://corgibytes.com/blog/makers/menders/software/2015/08/14/makers-vs-menders/&quot;&gt;Developer Differences: Makers vs Menders&lt;/a&gt;, which seems to describe me
    fairly well.
&lt;/p&gt;
&lt;p&gt; Also of note, the first episode of the &lt;a href=&quot;http://thelesbiantalkshow.podbean.com/e/lhmp-ordinary-women/&quot;&gt;Lesbian Historic Motif Project Podcast: Ordinary Women&lt;/a&gt; by Heather
    Rose Jones (&lt;span style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://hrj.livejournal.com/profile&apos;&gt;&lt;img src=&apos;https://www.dreamwidth.org/img/external/lj-userinfo.gif&apos; alt=&apos;[livejournal.com profile] &apos; style=&apos;vertical-align: text-bottom; border: 0; padding-right: 1px;&apos; width=&apos;17&apos; height=&apos;17&apos;/&gt;&lt;/a&gt;&lt;a href=&apos;http://hrj.livejournal.com/&apos;&gt;&lt;b&gt;hrj&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; on LJ) is up.
&lt;/p&gt;
&lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://mdlbear.dreamwidth.org/1577522.html#cutid1&quot;&gt;Notes &amp; links, as usual&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=mdlbear&amp;ditemid=1577522&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://mdlbear.dreamwidth.org/1577522.html</comments>
  <category>signal-boost</category>
  <category>writing</category>
  <category>software</category>
  <category>links</category>
  <category>done</category>
  <category>github</category>
  <lj:music>only a little noodling</lj:music>
  <lj:mood>ok</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
</channel>
</rss>
