[Valid RSS] This is a valid RSS feed.


This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.


  1. <?xml version="1.0" encoding="utf-8" standalone="no"?><?xml-stylesheet type='text/xsl' href='/rssxsl.xslt' version='1.0'?>
  2. <rss version="2.0" xmlns:dc="" xmlns:atom="">
  3.  <channel>
  4.    <title></title>
  5.    <link></link>
  6.    <description> :: dot Nuts about dot Net</description>
  7.    <copyright>Copyright 2024 Leon Bambrick</copyright>
  8.    <language>en-au</language>
  9.    <managingEditor> (Leon Bambrick)</managingEditor>
  10.    <webMaster> (Leon Bambrick)</webMaster>
  11.    <atom:link href="" rel="self" type="application/rss+xml" />
  12.    <image>
  13.      <title></title>
  14.      <url></url>
  15.      <link></link>
  16.      <width>49</width>
  17.      <height>33</height>
  18.      <description>secretGeek</description>
  19.    </image>
  20.    <item>
  21.      <title>Meanwhile on the Wiki</title>
  22.      <link></link>
  23.      <description><![CDATA[<p>Hi, hope you're good!</p>
  24. <p>I just thought  &mdash; you know  &mdash; when I stop and think for a minute &mdash; i should maybe tell someone that there's always more writing occurring at <a href=''></a>  &mdash; featured articles here: <a href=''></a> and <a href=''>"Wiki's RSS feed" is here (ask grandma if you ain't sure what that would be).</a></p>
  26. <!--  You can use sites and apps like <a href=''>Feedly</a> to "subscribe to" (... "watch") RSS "feeds" (... "files").-->
  28. <p>There's also activity at the "Today I learned" site  &mdash; <a href=''></a> &mdash;  and so on.</p>
  30. <p>But the main channel for sharing significant, high value information &mdash; in so far as that is possible &mdash; is still this particular blog right here.</p>
  32. <p>It's been a time of copious occupations. All goodish.</p>
  34. <p><a href=''>RSS Feed here.</a> Long Live RSS</a>.</p>
  36. <p>News, soon. Sooooooon.</p>
  37. ]]></description>
  38.      <pubDate>Fri, 22 Mar 2024 11:07:24 GMT</pubDate>
  39.      <dc:creator>Leon Bambrick</dc:creator>
  40.      <guid></guid>
  41.    </item>
  42.    <item>
  43.      <title>CSS Variables are cool</title>
  44.      <link></link>
  45.      <description><![CDATA[<p><small>(Technically they're called <strong>properties</strong>, but everyone calls them <strong>variables</strong> because of the <code>var(--mycolor)</code> syntax -- and I'm a descriptivist not a prescriptivist, so I'm gonna call 'em <strong>variables</strong> too.)</small></p>
  46. <p>Now... CSS Variables are <strong>COOL</strong>.</p>
  47. <p>The hooded figures who lurk near the Forbidden Dog Park don't want you to know about CSS Variables. The Sherriff's Secret Police  would rather we did not discuss CSS Variables. But I Must Press On With This Blog Post.</p>
  48. <p>I started using CSS Variables when <a href="">revamping NimbleText with dark mode</a>.</p>
  49. <p>But I didn't even begin to scratch the surface then. I didn't <em>get it</em> (I didn't need to) but now the deeper I dig, the more power I find. No wonder shadowy helicopters hover outside the window of my office tower, even now.</p>
  50. <h2 id="basic-usage">Basic usage</h2>
  51. <p>First, I used Css Variables as a way to make sure I could define useful colors &quot;just once&quot;, and reuse them consistently.</p>
  52. <p>e.g. you can define a &quot;main&quot; background color like this:</p>
  53. <blockquote><pre><code>:root {
  54. --main-bg: #FFF;
  55. }
  56. </code></pre></blockquote>
  57. <p>And apply it to any selectors you want:</p>
  58. <blockquote><pre><code>body {
  59. background-color: var(--main-bg);
  60. }
  61. </code></pre></blockquote>
  62. <p>And you can override that... for example for your dark theme:</p>
  63. <blockquote><pre><code>@media (prefers-color-scheme: dark) {
  64. :root {
  65. --main-bg: #222;
  66. }
  67. }
  68. </code></pre></blockquote>
  69. <p>And that's fun. But the fun doesn't stop there!</p>
  70. <h2 id="sidebar-wait-whats-the-root">Sidebar: wait what's the <code>:root</code> ??</h2>
  71. <p>You may have noticed, above, that we applied our variable definition to a <code>:root</code> selector... <em>what is that strange thing?</em> and what other options do we have?</p>
  72. <p>The colon prefix tells us it's a &quot;pseudo-class&quot; (like <code>:hover</code> or <code>:focus</code>), in this case it's a special pseudo-class meaning the <a href="">root of the document</a>. So the variable we created applies to the whole document.</p>
  73. <p>We could also have &quot;scoped&quot; the variable to just a part of the document...</p>
  74. <blockquote><pre><code>footer {
  75. --bg: #222;
  76. background-color:var(--bg);
  77. }</code></pre></blockquote>
  78. <p>I'm not using <em>that</em> piece of knowledge yet, but I mention it because many authors gloss over it, and also, perhaps because a skeletal figure just dragged his ragged body across the floor of my office, rose to his bony feet, brandished a glistening metallic weapon with a bright logo from &quot;Cranial Extracto Matic&quot; and screamed, in a voice like a thousand metal polar bears shrieking in agony as they are fed into a terrible grinding machine, that it would perhaps be wisest if I refrained from mentioning &quot;:pseudo elements&quot; in this particular blog post. And I am a bit of a contrarian on these things.</p>
  79. <h2 id="now-for-something-cool">Now for something cool</h2>
  80. <p>The cool thing I've noticed more recently (and why I'm writing to you about this now) is this:</p>
  81. <p><strong>You can reference variables from variables.</strong></p>
  82. <p><large>🤯</large></p>
  83. <p>... and referencing variables from variables must have many uses, an infinite number of uses.</p>
  84. <p>For me, an immediate and powerful use is for doing custom themes <em>properly</em>.</p>
  85. <p>In a real world theme, on a real world site, you don't end up with just 2 or 3 colors. You end up with many, many slightly different variations on a smaller number of <em>hues</em>. (A good recent article on the topic is <a href="">here</a>). If a button has a gradient, then it has several variations of the initial color. A panel may have a less saturated version of a background color, pushing it into the distance. Many variations, many colors -- but very few hues.</p>
  86. <p>With Css Variables we can reuse an underlying <em>hue</em> with different <code>saturation</code>, <code>lightness</code> or <code>opacity</code>.</p>
  87. <p>Instead of putting an entire <em>color</em> into a variable, start by putting your <em>hue</em> into a variable.</p>
  88. <p>For example:</p>
  89. <blockquote><pre><code>:root {
  90. --main-hue: 124; /* a green hue */
  91. }
  92. </code></pre></blockquote>
  93. <p>If we have a &quot;greenish&quot; theme, perhaps a variation on the hue of the green slime that has begun to bleed from the shadowy apparition who hovers even now abaft the cavernous black void that threatens the rusted children's play equipment in the boarded up park across the road, then we can store our &quot;hue&quot; and  make sure that every &quot;greenish&quot; color on our site is based upon that hue.</p>
  94. <p>Write your colors in <code>hsla</code> format... e.g:</p>
  95. <blockquote><pre><code>:root {
  96. --main-hue: 124; /* a green hue */
  97. --main-bg: hsla(var(--main-hue),100%, 13%, 1); /* background */
  98. --main-fg: hsla(var(--main-hue), 17%, 86%,1); /* foreground */
  99. }</code></pre></blockquote>
  100. <p>... and so on.</p>
  101. <p>Thus your whole theme can build up and having many colors based on a small number of hues.</p>
  102. <p>The dark theme might even use the same hue, but flip the saturation/lightness of the colors that build upon it. It's flexible enough to achieve anything you need. And all the while, a single fact such as the base hues of your theme are not repeated.</p>
  103. <p>It's DRY, it's separation of concerns. All those &quot;principles&quot; people used to go on about back in the Olden times of Before.</p>
  104. <p>With your underlying <em>hue</em> defined in a variable, you can change a single line of CSS and completely alter your theme.</p>
  105. <h2 id="now-make-it-dynamic">Now make it dynamic...</h2>
  106. <p>Oh but wait, it's cooler than that.</p>
  107. <p>In one line you can also change those variables with javascript.</p>
  108. <blockquote><pre><code>var root = document.documentElement;
  109.'--main-hue', 0); // now the theme color is pure red (`hue = 0`), not that slime-like green.
  110. </code></pre></blockquote>
  111. <p>Or if -- like me -- you're a fan of taking things too far, you can have a timer that randomly tries out different hues, and a stop button for when you're happy.</p>
  112. <p>Or you can have several hues all rotated by various amounts from each other, in triads, or complements etc. You can &quot;AB test&quot; different values, or survey a small group to see the best possible themes.</p>
  113. <p>This is much closer to how things should be (and it's also much more satisfying than using a pre-processor). The stylesheet encodes the underlying relationships between the properties, instead of just hard-coding the final values everywhere.</p>
  114. <p>The art of science is the science of turning art into a science and the art of turning science into an art of science. Or something.</p>
  115. <p>All of this is powerful stuff that no one is talking about. Maybe because THE MAN wants to keep us DOWN, or because BIG CSS wants us to be silent and happy with our <code>rem</code>s and our <code>em</code>s. But I'm not going to be quiet about this anymore. Variables are there: do something extraordinary with them today.</p>
  116. <p>Oh and bonus points if you also use <code>calc()</code> with them -- i'd love to hear about some interesting uses of <code>calc</code> with <code>var</code>.</p>
  117. <p>My lawyer also wishes me to make it known that certain elements of this blog post would not have been possible if I had not recently begun listening to far too much &quot;<a href="">Welcome to Night Vale</a>&quot;; a very, very, <strong>very</strong> good podcast. There are also books.</p>
  119. ]]></description>
  120.      <pubDate>Sun, 06 Dec 2020 07:29:36 GMT</pubDate>
  121.      <dc:creator>Leon Bambrick</dc:creator>
  122.      <guid></guid>
  123.    </item>
  124.    <item>
  125.      <title>Stashy is a Really simple Key Value store</title>
  126.      <link></link>
  127.      <description><![CDATA[<p>In my various websites and web applications, I often need to store some things and later retrieve them.</p>
  128. <p>Mostly for this I use a really simple key value store called &quot;Stashy&quot;, that I built, oh, decades ago.</p>
  129. <p>Imagine I have a &quot;plain old class object&quot;, and I want to save it. It might be an object called &quot;myNewBlogPost&quot;.</p>
  130. <p>I will call:</p>
  131. <blockquote><pre><code>stashy.Save&lt;BlogPost&gt;(myNewBlogPost, myNewBlogPost.Slug);
  132. </code></pre></blockquote>
  133. <p>Later, if I want to load that blog post, I will need to know the key I used, let's say it was &quot;hello-world&quot;:</p>
  135. <blockquote><pre><code>var myNewBlogPost = stashy.Load&lt;BlogPost&gt;(&quot;hello-world&quot;);
  136. </code></pre></blockquote>
  137. <p>And there's also a method for loading all objects of a given type:</p>
  138. <blockquote><pre><code>var myBlogPosts = stashy.LoadAll&lt;BlogPost&gt;();
  139. </code></pre></blockquote>
  140. <p>And for deleting a single object:</p>
  141. <blockquote><pre><code>stashy.Delete&lt;BlogPost&gt;(&quot;hello-world&quot;);
  142. </code></pre></blockquote>
  143. <p><em>And that's it!</em></p>
  144. <p>It's not distributed. It doesn't have a query language. It doesn't have built in caching semantics. It's not even async.</p>
  145. <p>I tell you what it does have: <strong>utility</strong>. It's bloody useful! I would definitely not consider it for cases with millions of records, but 1000 or under? It's <em>fine!</em> And one less thing to worry about.</p>
  146. <p>The <code>Stashy</code> class is an implementation of the <code>IStashy</code> interface. This makes it easier to test, and helps me with the dependency injection stuff. Mostly it serves to make sure I'm keeping the contract <em>small</em>.</p>
  147. <p>The <code>IStashy</code> interface is just this:</p>
  148. <blockquote><pre><code>public interface IStashy&lt;K&gt;
  149. {
  150.    void Save&lt;T&gt;(T t, K id);
  151.    T Load&lt;T&gt;(K id);
  152.    IEnumerable&lt;T&gt; LoadAll&lt;T&gt;();
  153.    void Delete&lt;T&gt;(K id);
  154.    K GetNewId&lt;T&gt;();
  155. }
  156. </code></pre></blockquote>
  157. <p>The type <code>K</code> is the type of key you want to use. I usually use strings as my key. But you can use integers or guids, or anything else, if you like.</p>
  158. <p>As I tweeted recently, <a href="">The heart and soul of my most used key-value store fits in a single tweet. Easily!</a></p>
  159. <p>I've used a couple of different implementations of this interface over the years, but currently what it does is serialize the object as <code>JSON</code> and then store it in a file named after the key, in a sub-folder named after the <code>type</code> of the object. (I also have a completely in-memory implementation, for testing etc.)</p>
  160. <p>Here's an implementation I use at the moment in one of my projects. It is <em>not</em> glorious beautiful wondrous code, but it is working code that I just... well I just never have to look at it. But I rely on it <em>all</em> the time:</p>
  161. <p><a href='' class='action' target='_blank'>see gist: FileStashy.cs</a></p>
  162. <p>It's about 100 lines of code, written <em>years</em> ago, and relies on <code>Newtonsoft.Json</code> to turn objects into Json and vice-versa.</p>
  163. <p>(10 years ago my FileStashy used XML, on Windows... Now it's all Json, and runs anywhere that .net core runs. Maybe one day, one <em>special</em> day, we'll all switch to <a href="">CSV</a>.)</p>
  164. <p>Sometimes I build other stuff on-top of Stashy, such as indexes, for faster lookups, and &quot;revisions&quot;, so I can look at old versions of an object. That was easy enough to write (and very fun of course!) but I wouldn't want to do too much with it, or I'd switch to a <em>real</em> key value store... but then get all the headaches that come from those.</p>
  165. <p>Got any crufty little things you've rolled yourself instead of using something "better"?</p>  
  166. ]]></description>
  167.      <pubDate>Thu, 12 Nov 2020 23:22:14 GMT</pubDate>
  168.      <dc:creator>Leon Bambrick</dc:creator>
  169.      <guid></guid>
  170.    </item>
  171.    <item>
  172.      <title>Tips For Working From Home</title>
  173.      <link></link>
  174.      <description><![CDATA[<p>Now that everyone else has to work from home let me share my tips from 5 happy years of this way of life:</p>
  175. <p><strong>Get some exercise!</strong> Measure your steps and make sure you do a healthy amount every day. Super important. With no incidental walking your fitness can really drop.</p>
  176. <p><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>
  177. <p><strong>Music!</strong> Music is crucial for me and maybe for you too. I bought a spotify subscription after a few months, just to get rid of the ads. You need <em>a lot</em> of playlists to fill up a week. Different music is needed at different times of day, and for different moods. Monday mornings and friday afternoons are two extreme opposites, and there many variations in between.</p>
  178. <p><strong>Look after your eyes!</strong> Home office is smaller than work office. Make sure your eyes get to look into the middle distance often. If you stare at just monitor/close walls all day, eyes never relax and you go blind! So stare out the window while you're day dreaming.</p>
  179. <p><strong>Plan B.</strong> You may need to be prepared in case your home internet connection goes down. (This happened to me yesterday, after a garbage truck took out the NBN for my whole neighborhood.) Make sure you can tether your laptop to your phone, or that you can work fully offline if needed.</p>
  180. <p><strong>The duck.</strong> Without a colleague to talk to you may find yourself talking to a rubber duck, explaining all your technical problems. This is a great technique and has been shown to work. Don't let your boss find out though or they'll fire you and keep the duck.</p>
  181. <p><strong>Headset.</strong> You'll need a good headset for remote meetings.</p>
  182. <p><img src="/image/headset_home_50.jpg" alt="some kind of weird helmet that provides oxygen to an office worker" /></p>
  183. <p><strong>Diet.</strong> Don't let high sugar foods enter the house. It's the only way to avoid the temptation and deadly <em>snaccidents</em>.</p>
  184. <p><strong>Environment.</strong> Do whatever you can to create a dedicated workspace. It will help you separate work from home and improve your focus. This way too, you can finally get the home office just the way you want it.</p>
  185. <p><img src="/image/finally.jpg" alt="finally got the home office just the way i want it" title="finally got the home office just the way i want it" /></p>
  186. <p><strong>Keyboard, Mouse, Monitor(s).</strong> Maybe your setup isn't perfect, but where possible, don't just work directly on your laptop. Use a real keyboard. I think wireless is a waste of time with keyboards, you hardly move it, just used a wired one! And I'm not one of those fetishists who spends all their time and money on them, though I don't wish to shame those who are, well not too much. More monitors are always better, but you may not have the space, the funds, or the opportunity to get that in place right now. I don't have strong opinions on mice either, but with a real keyboard you will also need a real mouse.</p>
  187. <p><strong>Habits.</strong> The whole experience hinges on your ability to construct your own habits that create a good life. You can't rely on following the momentum of those around you. You're free to build up or destroy the structure of your day. It doesn't take will power, it just takes sensible routines.</p>
  188. ]]></description>
  189.      <pubDate>Tue, 17 Mar 2020 08:19:52 GMT</pubDate>
  190.      <dc:creator>Leon Bambrick</dc:creator>
  191.      <guid></guid>
  192.    </item>
  193.    <item>
  194.      <title>Productivity with Powershell: Grab your agenda from outlook as plain text</title>
  195.      <link></link>
  196.      <description><![CDATA[<p>I use a plain text file to manage my daily todo items. (<a href="">Gina Trapani</a> championed this idea with the <a href="">&quot;todo.txt&quot; movement</a>) and I use some little bits of console goodness to make it work my way.</p>
  197. <p><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><br /><em>I like to jam with the console cowboys in cyberspace.</em>
  198. </p>
  199. <p>At the start of each day I run a powershell script, &quot;<code>today</code>&quot; that does a bunch of calculations, opens up my <code>todo.txt</code> file in <code>notepad++</code>, and puts a bunch of text into my clipboard as a starting point. Then I paste that list at the bottom of the document. I also scroll up to yesterday's list and run a notepad++ macro that &quot;sweeps&quot; any remaining tasks from yesterday into today's list. Then I get to work.</p>
  200. <p>But there is this big problem inside companies called &quot;meetings&quot; and they tend to get in the way of this thing called &quot;personal productivity&quot;. I work remotely and don't have a lot of meetings, so I don't have the habit of checking my calendar, or living in my calendar, as some people do. Hence I have a bad habit of <em>missing</em> meetings. Bosses don't like this habit.</p>
  201. <p>To alleviate the problem, I've improved my &quot;<code>today</code>&quot; script so that it will grab today's meeting schedule from outlook. I've <strong>shared</strong> the script I wrote for this as a github &quot;gist&quot;, here:</p>
  202. <p><a href="">Get today's schedule from Outlook, using COM, and format as text for my TODO.txt file</a></p>
  203. <p>It's not very &quot;elegant&quot; as it is an example of &quot;meware&quot; -- code built for an audience of one.</p>
  204. <p>Heck I'll just post it inline, here's my ugly baby:</p>
  207. <blockquote><pre style='white-space: pre-wrap;'><code># Get a list of meetings occurring today.
  208. function get-meetings() {
  209. $olFolderCalendar = 9
  210. $ol = New-Object -ComObject Outlook.Application
  211. $ns = $ol.GetNamespace('MAPI')
  212. $Start = (Get-Date).ToShortDateString()
  213. $End = (Get-Date).ToShortDateString()
  214. $Filter = &quot;[MessageClass]='IPM.Appointment' AND [Start] &gt; '$Start' AND [End] &lt; '$End'&quot;
  215. $appointments = $ns.GetDefaultFolder($olFolderCalendar).Items
  216. $appointments.IncludeRecurrences = $true
  217. $appointments.Restrict($Filter) |  
  218. % {
  219. if ($_.IsRecurring -ne $true) {
  220. # send the meeting down the pipeline
  221. $_;
  222. } else {
  223. #&quot;RECURRING... see if it occurs today?&quot;
  224. try {
  225. # This will throw an exception if it's not on today. (Note how we combine today's *date* with the start *time* of the meeting)
  226. $_.GetRecurrencePattern().GetOccurrence( ((Get-Date).ToString(&quot;yyyy-MM-dd&quot;) + &quot; &quot; + $_.Start.ToString(&quot;HH:mm&quot;)) )
  227. # but if it is on today, it will send today's occurrence down the pipeline.
  228. }
  229. catch
  230. {
  231. #&quot;Not today&quot;
  232. }
  233. }
  234. } | sort -property Start | % {
  235. # split up the names of the attendees to have just 1 firstname/surname and less space.
  236. $arrr = ($_.RequiredAttendees.split(';') | % { $_.Trim() } | % { $_.split(' ')[1] + ' ' + $_.split(' ')[0] } )
  237. $attendees = ($arrr -join &quot; &quot;).Replace(&quot;, &quot;,&quot;,&quot;).TrimEnd(',')
  238. # this is the formatted string that we return, ready for use in 'today'
  239. (&quot;`n`t`t[ ] &quot; + $_.Start.ToString(&quot;HH:mm&quot;) + &quot; - &quot; + $_.Subject.ToUpper() + &quot; with: &quot; + $attendees )  
  240. }
  241. }
  242. </code></pre></blockquote>
  245. <p>The resulting text looks like this:</p>
  247. <pre>
  248. [ ] 09:00 - STANDUP with: Keena Maloney,Rhea Zamora,Ed Jackson
  249. [ ] 10:00 - DESIGN REVIEW with: Steph Perkins,Rhea Zamora
  250. [ ] 14:30 - CUSTOMER COMPLAINTS with: Della Bouchard,Steph Perkins
  251. </pre>
  254. <p>The way recurring meetings work was the tricky bit. I couldn't find any simple way to query a recurring appointment to ask it &quot;Does it actually occur today?&quot;</p>
  255. <p>As always, I'm very open to any feedback or improvements!</p>
  257. ]]></description>
  258.      <pubDate>Fri, 31 Jan 2020 21:03:29 GMT</pubDate>
  259.      <dc:creator>Leon Bambrick</dc:creator>
  260.      <guid></guid>
  261.    </item>
  262.    <item>
  263.      <title>2019 By The Numbers</title>
  264.      <link></link>
  265.      <description><![CDATA[<p><a href=""><img src="" alt="instagram images from 2019" /></a></p>
  266. <p>Well it's the roaring 20's at last and here's the blogpost where I look back on the annual output of a machine I call &quot;me&quot;.</p>
  267. <p>I spend a lot of time berating myself for the things I didn't do, so it's pretty odd to look back and see that a lot of things did get out the door.</p>
  268. <p>Numbers in parens, e.g. &quot;(3,2,1)&quot;, are the figures from last year, the year before that and the year before that.</p>
  269. <ul>
  270. <li>1 new product launched <a href="">TimeSnapper for Mac</a>. <a href="">Jon Schneider</a> did all the work here, but that won't stop me from listing it as <em>my</em> biggest achievement of the year. Top work Jon! (And Atli continues to put in the long hours of keeping TimeSnapper for Windows alive. We're hoping to update the application and the website this year too.)</li>
  271. <li>1 Kanban Simulation game (0): <a href="">DevShop</a></li>
  272. <li>0 books published (1,1,0) Joseph and I slowed down work on <a href="">Evergreen Skills for Developers</a>. The brilliant thing about Evergreen Skills is that it'll still be fresh info even if it takes us 10 year to complete. I compiled 1 complete book in 2019, but haven't launched it due to Amazon &quot;issues&quot;, and outlined a few more. See <a href="">'how to get nothing done'</a></li>
  273. <li>13 <a href="">blog posts</a> written (10, 13, 17) — Most popular thing I published was probably this <a href="">html quine</a>.</li>
  274. <li>15 new <a href="">wiki articles completed</a> (14,10,50) — Best new article there is <a href="">Protective Factors for Mental Health</a></li>
  275. <li>48 Weekly Project Update emails shared with Richard Mason of <a href="">Aussie Bushwalking</a> (19,0). These keep the both of us productive all year long.</li>
  276. <li>~200 pictures at <a href="">insta/secretGeek</a> (~200)</li>
  277. <li>100 <a href="">Today-I-Learned</a> Entries written (73, 133, 233) — 30142 words (19761, 35289, 42352), 15 new topics (10,21, 44)</li>
  278. <li>389 contributions at <a href="">Github/secretGeek</a> (156,189,292)</li>
  279. <li>0 talks delivered (0,1,1) phew! 1 conference attended as always: <a href="">DDD Brisbane</a>.</li>
  280. <li>Daily step goal met every day unless gravely ill.</li>
  281. <li>Millions of tweets <a href="">@secretGeek</a>. This seems to be the one that more people saw:</li>
  282. </ul>
  283. <p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Argh, CSS.... Just use a table! <a href=""></a></p>&mdash; Leon Bambrick (@secretGeek) <a href="">August 18, 2019</a></blockquote></p>
  284. <script async src="" charset="utf-8"></script>
  286. <p><a href='/2018_Review'>Previously (2018)</a>, <a href="">Previously (2017)</a> <a href="">previously (2016)</a></p>
  288. ]]></description>
  289.      <pubDate>Fri, 10 Jan 2020 05:39:35 GMT</pubDate>
  290.      <dc:creator>Leon Bambrick</dc:creator>
  291.      <guid></guid>
  292.    </item>
  293.    <item>
  294.      <title>5 minutes to import CSV to a database: What do you do?</title>
  295.      <link></link>
  296.      <description><![CDATA[<p>I challenged my twitter peeps:</p>
  297. <blockquote>
  298. <p>Challenge: you have a csv file and you need to import it into a new table in a database. You have 5 mins to get it done. What tools do you use?</p>
  299. <p><a href="">@secretgeek</a></p>
  300. </blockquote>
  301. <p>and was overwhelmed with the responses! So many different ways people approach the problem, and so many different tools.</p>
  302. <p>It reminds me of Miles' Law:</p>
  303. <blockquote>
  304. <p>Where you stand on an issue depends on where you sit.</p>
  305. </blockquote>
  306. <ul>
  307. <li>If you sit in python all day, you'll write a python script.</li>
  308. <li>If you sit in powershell all day, you'll use powershell</li>
  309. <li>If you sit in SQL Server all day, you might use T-SQL itself to do the work.</li>
  310. <li>If you sit in an editor all day, you might use search/replace to transform the data into sql statements.</li>
  311. </ul>
  312. <p>I put all the solutions I saw into my &quot;<a href=''>today I learned</a>s&quot; site, here's a table of contents for the topic:</p>
  313. <ul>
  314. <li><a href="">Import CSV file to a Database, quickly</a>
  315. <ul>
  316. <li><a href="">Import CSV file to any database with any OS</a></li>
  317. <li><a href="">Import CSV file to any database with Windows tools</a></li>
  318. <li><a href="">Import CSV file to any Database with MacOS</a></li>
  319. <li><a href="">Import CSV file to MS SQL Server</a></li>
  320. <li><a href="">Import CSV file to SQLite</a></li>
  321. <li><a href="">Import CSV file to MySQL</a></li>
  322. <li><a href="">Import CSV file to Postgresql</a></li>
  323. <li><a href="">Import CSV file to Oracle</a></li>
  324. <li><a href="">Import CSV file to Hadoop</a></li>
  325. <li><a href="">Alternative: Just treat the CSV as SQL</a></li>
  326. </ul>
  327. </li>
  328. </ul>
  330. <p>In related CSV-news I should mention that I made a git repo: &quot;<a href="">Awesome CSV</a>&quot; where I collect all the coolest CSV tools, articles and specs from around the planet. It's a happening place for cool people to hang out and learn cool things.</p>
  332. <p>And my own modest tool <a href="">NimbleText</a> treats everything as delimited text, lets you do <a href="">powerful things quickly</a>, and is arguably* the greatest invention in the history of the universe.</p>
  334. <p>I also have an <a href=''>Awesome GUID</a> repo, where I store awesome things related to GUIDs. There are surprisingly few things there. Hmmm.</p>
  336. <hr />
  338. <p><small><strong>*</strong> Whenever someone says 'arguably' it is safe to replace it with 'not'. This is arguably true in every circumstance.</small></p>
  340. ]]></description>
  341.      <pubDate>Thu, 10 Oct 2019 08:24:31 GMT</pubDate>
  342.      <dc:creator>Leon Bambrick</dc:creator>
  343.      <guid></guid>
  344.    </item>
  345.    <item>
  346.      <title>Desert Skies - exclusive inside information from the developers</title>
  347.      <link></link>
  348.      <description><![CDATA[<p>Unless you've been living under a rock like some disgusting sand-sneaking Seeker -- you're aware of the awesome sensation taking the gaming community by storm: <a href="">Desert Skies</a>.</p>
  350. <p>Here's a video of the game play in case you're not familiar.</p>
  352. <p><iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>
  354. <p>I recently sat down for an intense lunch with one of the minds from <a href="">White Rabbit Games</a> - the creative duo behind this Indy gaming sensation, and I found out some exclusive information.</p>
  356. <p>Although the company is called &quot;White Rabbit Games&quot; the logo is of a cat.</p>
  358. <p><img src='' alt='white rabbit games logo... a white cat' title='white rabbit games logo... a white cat' style='background-color:#222;padding:10px;' /></p>
  360. <p>SEE!?</p>
  362. <p>What's that all about?</p>
  364. <p>T: we have a fluffy white cat, and it looks like a bunny so we call it &quot;bunny&quot;.</p>
  366. <p>Thus the white rabbit is actually a cat.</p>
  368. <p>Woah.</p>
  370. <p>That's enough revelations for one day.</p>
  372. <p>It's a really awesome game. I find it pretty exciting because it's a simple idea that is popular enough that it will get a chance to expand in some really interesting directions. <a href="">Keep an eye on this</a>!</p>
  375. ]]></description>
  376.      <pubDate>Sun, 06 Oct 2019 01:23:38 GMT</pubDate>
  377.      <dc:creator>Leon Bambrick</dc:creator>
  378.      <guid></guid>
  379.    </item>
  380.    <item>
  381.      <title>What is NimbleText (a story about cheese)</title>
  382.      <link></link>
  383.      <description><![CDATA[<p>A good friend asked me the other day, "Wait a second, what's nimble text?" and I stammered out an answer. I'm not good at elevator pitches. Waving my arms around didn't make it any clearer. I tried waving them in bigger circles and pointing as I talked. It still didn't help.</p>
  385. <p>I decided to email him an answer. It turns out I don't have his email address, so I'm writing it here, and I'll transmit the URL some other way. You get to read my reply in public.</p>
  387. <p>What then, is NimbleText?</p>
  389. <p>NimbleText is an adhoc code generator.</p>
  391. <p>For example, say you have a list of &quot;keywords&quot;, <em>(he's a digital advertising specialist... it takes all kinds)</em> and you want to do something with each keyword, maybe insert it into a database.</p>
  394. <p>Here's your list of keywords (these are French cheeses)</p>
  396. <blockquote><pre>Abondance
  397. Banon
  398. Beaufort
  399. Bleu
  400. Brie
  401. Brillat-Savarin
  402. Brocciu Cara or Brocciu
  403. Cabécou
  404. Cancoillotte
  405. Camembert de Normandie
  406. Chabichou du Poitou
  407. Chaource
  408. Chevrotin
  409. Comté</pre></blockquote>
  411. <p> paste that into NimbleText, and type in a pattern... how about this:</p>
  413. <blockquote><pre>Insert into Keywords(Keyword) Values ('$0')
  414. </pre></blockquote>
  416. <p>NimbleText will *magically* create this SQL query for you:</p>
  418. <blockquote><pre>Insert into Keywords(Keyword) Values ('Abondance')
  419. Insert into Keywords(Keyword) Values ('Banon')
  420. Insert into Keywords(Keyword) Values ('Beaufort')
  421. Insert into Keywords(Keyword) Values ('Bleu')
  422. Insert into Keywords(Keyword) Values ('Brie')
  423. Insert into Keywords(Keyword) Values ('Brillat-Savarin')
  424. Insert into Keywords(Keyword) Values ('Brocciu Cara or Brocciu')
  425. Insert into Keywords(Keyword) Values ('Cabécou')
  426. Insert into Keywords(Keyword) Values ('Cancoillotte')
  427. Insert into Keywords(Keyword) Values ('Camembert de Normandie')
  428. Insert into Keywords(Keyword) Values ('Chabichou du Poitou')
  429. Insert into Keywords(Keyword) Values ('Chaource')
  430. Insert into Keywords(Keyword) Values ('Chevrotin')
  431. Insert into Keywords(Keyword) Values ('Comté')
  432. </pre></blockquote>
  434. <p>Two seconds later, you run the SQL and insert all the keywords into the database.</p>
  436. <p>You can play with that example here: <a href=""></a></p>
  438. <p>If the input had more than one column, you would refer to the next column as <code>$1</code>, then <code>$2</code>, etc.</p>
  440. <p>So if the keyword data included, I don't know... some search traffic numbers?...</p>
  442. <blockquote><pre>Abondance,1000
  443. Banon,3000
  444. Beaufort,200
  445. Bleu,12
  446. Brie,6
  447. Brillat-Savarin,90
  448. </pre></blockquote>
  450. <p>We could use a pattern like this:</p>
  452. <blockquote><pre>Insert into KeywordResult (Keyword,Result) Values ('$0', $1)
  453. </pre></blockquote>
  455. <p>To generate this result:</p>
  457. <blockquote><pre>Insert into KeywordResult (Keyword,Result) Values ('Abondance', 1000)
  458. Insert into KeywordResult (Keyword,Result) Values ('Banon', 3000)
  459. Insert into KeywordResult (Keyword,Result) Values ('Beaufort', 200)
  460. Insert into KeywordResult (Keyword,Result) Values ('Bleu', 12)
  461. Insert into KeywordResult (Keyword,Result) Values ('Brie', 6)
  462. Insert into KeywordResult (Keyword,Result) Values ('Brillat-Savarin', 90)
  463. </pre></blockquote>
  465. <p>(See this example here: <a href=""></a>)</p>
  467. <p>But it's not just for generating SQL queries, it's for text in general; and it's not just for keywords and it's not even specific to cheeses. There are many non-cheese uses.</p>
  469. <p>It helps you anytime you want to rearrange some data and do something to every row, to generate a result.</p>
  471. <p>There's an <a href=''>online version</a>, and a downloadable version (with <a href=''>extra features</a>). You can embed javascript inside your patterns to do really tricky formatting stuff. It's versatile.</p>
  473. <p>It's just this thing, you know. For stuff.</p>
  475. ]]></description>
  476.      <pubDate>Tue, 16 Jul 2019 08:56:12 GMT</pubDate>
  477.      <dc:creator>Leon Bambrick</dc:creator>
  478.      <guid></guid>
  479.    </item>
  480.    <item>
  481.      <title>Secrets of Mastering Excel</title>
  482.      <link></link>
  483.      <description><![CDATA[<p>Inspired by a <a href="">comment thread at hacker news</a> I made this mini site:</p>
  485. <p><a href='' class='action'></a></p>
  487. <p>I often want to share Joel Spolsky's famous &quot;You Suck at Excel&quot; video tutorial with &quot;important&quot; business people inside the large enterprise where I spend a lot of time.</p>
  489. <p>But it would be easily misconstrued as trolling if I sent a business customer a URL that literally tells them, right in the heading, that they &quot;suck&quot; at excel.</p>
  491. <p>So, as advised by user <code>TuringTest</code> (in the thread mentioned above) I created a mini site, on its own sub-domain, that is palatable to a business mindset, and <em>brutally</em> overlaid a heading that says &quot;Secrets of Mastering Excel&quot; right over the top of the &quot;You Suck at Excel&quot; heading.</p>
  493. <p>Now I've got something I can recommend to business people without causing disharmony. And I can leave a link to it in my corporate email signature, to nudge others to improve their Excel game.</p>
  495. <p>Ideally the page would detect when the video starts and remove the label, so it doesn't obscure the video. Also, I'd like to write up a set of notes about the talk, but ain't nobody got time for that, so I've linked to the notes from Max Masnick. Perfect is the mortal enemy of done and they are locked in an ultimate death embrace and that is how storm clouds create lightning but I digress.</p>
  497. <p>The whole thing from idea to delivery was about an hour. I was really pleased with the speed on this one.</p>
  499. ]]></description>
  500.      <pubDate>Sat, 13 Jul 2019 21:12:11 GMT</pubDate>
  501.      <dc:creator>Leon Bambrick</dc:creator>
  502.      <guid></guid>
  503.    </item>
  504.    <item>
  505.      <title>The Market for Ideas (and is contenteditable really terrible?)</title>
  506.      <link></link>
  507.      <description><![CDATA[<p>Some people invest in gold, others bitcoin. I put my money on ideas. The volatility can be wild.</p>
  508. <p>Take this idea -- the idea that &quot;Contenteditable&quot; attribute is a terrible basis for a Wysiwyg editor, as expressed by <a href="">this article from medium engineering</a>.</p>
  509. <p>5 years ago, this idea was only worth 3 points and 1 comment.</p>
  510. <ul>
  511. <li><a href="">Why ContentEditable is Terrible</a> 5 years ago - 3 points - 1 comment</li>
  512. </ul>
  513. <p><em>(I bought all I could! I liquidated all my other ideas so I could go long on this one....)</em></p>
  514. <p>One year later -- it's worth had grown to 75 points and 9 comments:</p>
  515. <ul>
  516. <li><a href="">Why ContentEditable is Terrible</a> 4 years ago - 75 points - 9 comments</li>
  517. </ul>
  518. <p><em>(I was tempted to cash out... but some stubborn streak... I held my nerve)</em></p>
  519. <p>It hit its peak 3 years ago when its worth grew to 155 points and 76 comments</p>
  520. <ul>
  521. <li><a href="">Why ContentEditable is Terrible</a> 3 years ago - 155 points - 76 comments</li>
  522. </ul>
  523. <p><em>(I sold it all, by god, I cashed it all in, right at the peak! It was glorious!)</em></p>
  524. <p>Soon after: the idea came crashing down. A year ago it was old news, back down to 3 points and 0 comments.</p>
  525. <ul>
  526. <li><a href="">Why ContentEditable is Terrible</a> 1 year ago - 3 points - 0 comments</li>
  527. </ul>
  528. <p>I guess what I'm saying is... sometimes an idea is before it's time. Not enough people understand the fundamentals to be able to engage with the idea. Then the audience has caught up, and they understand the idea. And then, having grokked it, the idea doesn't captivate them any longer.</p>
  530. <p><em>A different though related thought is <a href=''>"It's better to be wrong than early"</a> as described at hackernoon</a>, a sentiment that occurs a few times in Ray Dalio's Principles.</em></p>
  532. <p><img src='' alt='contenteditable' title="this is not a rigorous study" alt='results at hn.algolgia of searching for contenteditable is terrible' /> </p>
  534. <p>I don't really invest in ideas. Not explicitly. (<em>At a deep level, just about everything we do is an investment in an idea.</em>)</p>
  537. <p>p.s. I built something with <code>contenteditable</code> this week... I agree it's terrible. <a href=''>A page that lets you edit its style, without using javascript</a></p>
  538. ]]></description>
  539.      <pubDate>Thu, 13 Jun 2019 09:07:53 GMT</pubDate>
  540.      <dc:creator>Leon Bambrick</dc:creator>
  541.      <guid></guid>
  542.    </item>
  543.    <item>
  544.      <title>a html quine</title>
  545.      <link></link>
  546.      <description><![CDATA[<p>Yesterday I was on a bus! Yes, a bus! I don't get to ride buses so often due to the working from home lyfe, but I took the opportunity to write some simple code (as I used to do on buses in the past... i even gave <a href="">a talk about it once</a>, when was a thing.)</p>
  547. <p>And the thing I coded on the bus was a html quine.</p>
  548. <p><a href="" class="action sm">Go and see this html quine</a></p>
  549. <p>It's... different?</p>
  550. <p><a href=""><img src="" alt="html quine.jpg" /></a></p>
  551. <p>A quine is a program that produces, as output, its own source code. I've <a href="">discussed and demonstrated quines over here in the wiki</a>.</p>
  552. <p>And as I say in the html quine link, although the idea had bounced around in my head for a decade, the thing that reminded me to go and do it was seeing this piece of &quot;Code as Art&quot; from Geoff Huntley recently: <a href="">no yaml</a>. There must be more Code as Art in this world.</p>
  554. <hr />
  556. <p>See also, lengthy <a href=''>Hacker News discussion</a> and more recently <a href=''>more discussion.</a></p>
  558. ]]></description>
  559.      <pubDate>Tue, 04 Jun 2019 19:24:37 GMT</pubDate>
  560.      <dc:creator>Leon Bambrick</dc:creator>
  561.      <guid></guid>
  562.    </item>
  563.    <item>
  564.      <title>auto play</title>
  565.      <link></link>
  566.      <description><![CDATA[<p>Even though I'm polite and I click yes to let all the websites keep their cookies on my machine, for their own devilish surveillance purposes, even though I say yes and there are no doubt a million cookies filled with details about me, knowing everything i like and what i click on, and invading every ounce of my privacy, it seems that they can't seem to find the one cookie that matters, they keep losing that one cookie i care about and it's the cookie that says: "Don't autoplay the fucking videos on youtube." Just don't do it. He's told us, over and over, on every device, not to autoplay those videos, just hold onto this one simple fact, this tiny binary digit of truth, and do not autoplay those videos. But that's the one cookie they cannot retain, they cannot keep hold of, it evades their grasp, it leaps out of their fingers like an oily fish cookie, a digusting cookie flavour that is not very popular when A/B tested in regular stores, it is the slipperiest cookie and i click once more to say "again, i tell you, please i beg you, do not autoplay your videos" and once more I know they will forget this fact as they have a specific form of memory loss, a Korsakoff syndrome all their own, where all private thoughts of an individual are retained indefinitely and sold to the highest bidder but one particular bit of data is unlike any other and is somehow coated in polytetrafluoroethene and cannot be persisted in any form, it is like those burn after reading messages that will self destruct as soon as they are read and so i am stuck endlessly watching one autoplayed video after another down stranger and stranger wormholes down rabbit rabbit holes in weird enclaves of digital degeneration as i see things unthinkable things things i cannot unsee and always i squirm and wish to escape but it cannot be done i must keep watching them play and play the playing must be played they cannot pause their playing, the playing must play, like clockwork orange i am bound before the screen with eyeballs clamped open by spidery metal fingers and please keep your cookie no more autoplay for me i cannot resist.</p>
  568. <p>&nbsp;</p>
  571. ]]></description>
  572.      <pubDate>Sun, 02 Jun 2019 21:35:21 GMT</pubDate>
  573.      <dc:creator>Leon Bambrick</dc:creator>
  574.      <guid></guid>
  575.    </item>
  576.    <item>
  577.      <title>TimeSnapper for Mac: Beta Testers Needed</title>
  578.      <link></link>
  579.      <description><![CDATA[<p><img src="" alt="TimeSnapper Logo" style="float:right"/> Finally some exciting news on the TimeSnapper front.</p>
  581. <p>For a long time, the most requested feature for TimeSnapper has been a whole new version, for the Mac OS. Many of our customers and friends have moved from Windows to Mac over the last decade, and consistently told us that they miss the peace of mind and assistance that TimeSnapper provides.</p>
  583. <p>One such customer, <a href="">Jon Schneider</a> was so tired of the situation that he built a new version of TimeSnapper, from the ground up, for the Mac OS. He is now part of the TimeSnapper team (along with Atli and I) and we're now ready -- with your help -- to welcome beta testers: people who are willing to run this software and give us feedback, suggestions and error reports about their experience.</p>
  587. <p><iframe src="" width="640" height="680" frameborder="0" marginheight="0" marginwidth="0">Loading...</iframe></p>
  589. <p>A quick recap: <a href="">TimeSnapper</a> is a piece of software you can run in the background of your computer. It takes screenshots of your desktop every few seconds all week long. You can use it to recover text you've lost when (for example) your browser crashes, or you can use it to help fill out a timesheet, or just to gain an objective answer to the question &quot;Where did my time go?&quot; It's clever about the way it uses resources, so it doesn't fill up your hard drive or slow your computer.</p>
  591. <p>Huge thanks to you for considering coming along on this journey, and a biiiiiiiiiig thank you to Jon for stepping up and getting us here.</p>    
  593. <p><img src='' alt='ts mac options' title='ts mac options' /></p>
  595. <p><img src='' alt='ts mac playback' title='ts mac playback' /></p>]]></description>
  596.      <pubDate>Mon, 08 Apr 2019 10:02:43 GMT</pubDate>
  597.      <dc:creator>Leon Bambrick</dc:creator>
  598.      <guid></guid>
  599.    </item>
  600.    <item>
  601.      <title>React is NOT ok</title>
  602.      <link></link>
  603.      <description><![CDATA[<p>Look how tragic this is....</p>
  604. <p>You create your new react app with:</p>
  605. <blockquote><pre>npx create-react-app my-app
  606. </pre></blockquote>
  607. <p>And it spits out 907 lines of techno-babblicious output, scrolling scrolling scrolling in your console, ending at last with exactly one useful shard of information:</p>
  608. <blockquote><pre>Success! Created my-app at C:\example\my-app
  609. Inside that directory, you can run several commands:
  611. yarn start
  612. Starts the development server.
  614. yarn build
  615. Bundles the app into static files for production.
  617. yarn test
  618. Starts the test runner.
  620. yarn eject
  621. Removes this tool and copies build dependencies, configuration files
  622. and scripts into the app directory. If you do this, you can’t go back!
  624. We suggest that you begin by typing:
  626. cd my-app
  627. yarn start
  629. Happy hacking!
  630. </pre></blockquote>
  631. <p>But after the wall of gobbledygook that preceded it, it's easily overlooked.</p>
  632. <p>If the React team knew about the wonders of &quot;ok&quot; (for <a href="">bash</a> or <a href="">powershell</a>) they'd simply create a &quot;.ok&quot; file inside the &quot;my-app&quot; folder that says:</p>
  633. <blockquote><pre>yarn start #   Starts the development server.
  634. yarn build #   Bundles the app into static files for production.
  635. yarn test  #   Starts the test runner.
  636. </pre></blockquote>
  637. <p>...Then you'd immediately be able to find the commands again, <strong>and run them</strong> with a simple &quot;<code>ok 1</code>&quot;, or &quot;<code>ok 2</code>&quot; or &quot;<code>ok 3</code>&quot;</p>
  638. <p>But instead: those commands, sailing by in the infinite neon-scroll of the console, will be lost in time like tears in rain.</p>
  639. <p><img src="" alt="blade runner ending, tears in rain" /></p>
  641. ]]></description>
  642.      <pubDate>Thu, 14 Mar 2019 02:22:11 GMT</pubDate>
  643.      <dc:creator>Leon Bambrick</dc:creator>
  644.      <guid></guid>
  645.    </item>
  646.  </channel>
  647. </rss>

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda