<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.1">Jekyll</generator><link href="https://n8ta.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://n8ta.com/" rel="alternate" type="text/html" /><updated>2024-08-14T02:14:35+00:00</updated><id>https://n8ta.com/feed.xml</id><title type="html">Nate Tracy-Amoroso’s Homepage</title><subtitle>Tech and Whatever Else</subtitle><author><name>Nate Tracy-Amoroso</name></author><entry><title type="html">Setting up llvm for inkwell on macOS</title><link href="https://n8ta.com/llvm/compilers/inkwell/rust/2022/05/28/llvm-for-inkwell-macos.html" rel="alternate" type="text/html" title="Setting up llvm for inkwell on macOS" /><published>2022-05-28T03:00:00+00:00</published><updated>2022-05-28T03:00:00+00:00</updated><id>https://n8ta.com/llvm/compilers/inkwell/rust/2022/05/28/llvm-for-inkwell-macos</id><content type="html" xml:base="https://n8ta.com/llvm/compilers/inkwell/rust/2022/05/28/llvm-for-inkwell-macos.html">&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone https://github.com/llvm/llvm-project.git
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;llvm-project
git checkout remotes/origin/release/13.x
&lt;span class=&quot;nb&quot;&gt;mkdir &lt;/span&gt;build &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;build
cmake ../llvm &lt;span class=&quot;nt&quot;&gt;-DCMAKE_INSTALL_PREFIX&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/llvm-13
cmake &lt;span class=&quot;nt&quot;&gt;--build&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--target&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I’m compiling LLVM for use with &lt;a href=&quot;https://thedan64.github.io/inkwell/inkwell/index.html&quot;&gt;inkwell&lt;/a&gt; which relies on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LLVM_SYS_130_PREFIX&lt;/code&gt;
env variable to find llvm (for llvm 13 of course, it’s different for other versions &lt;a href=&quot;https://crates.io/crates/llvm-sys#llvm-compatibility&quot;&gt;more here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;After installing modify your shell to set this variable to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$HOME/llvm-13&lt;/code&gt; or wherever you want llvm (modify the cmake DCMAKE_INSTALL_PREFIX flag as well).&lt;/p&gt;

&lt;p&gt;If you want a version other than 13 run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git branch -a&lt;/code&gt; for a list of remote branches.&lt;/p&gt;

&lt;p&gt;You can also find official instructions here: &lt;a href=&quot;https://llvm.org/docs/CMake.html&quot;&gt;https://llvm.org/docs/CMake.html&lt;/a&gt;&lt;/p&gt;</content><author><name>Nate Tracy-Amoroso</name></author><category term="llvm" /><category term="compilers" /><category term="inkwell" /><category term="rust" /><summary type="html">git clone https://github.com/llvm/llvm-project.git cd llvm-project git checkout remotes/origin/release/13.x mkdir build &amp;amp;&amp;amp; cd build cmake ../llvm -DCMAKE_INSTALL_PREFIX=$HOME/llvm-13 cmake --build . --target install</summary></entry><entry><title type="html">What to do when mysql’s .binlog files are filling up the disk</title><link href="https://n8ta.com/mysql/2022/05/28/mysql-binlogs-filling-up-disk.html" rel="alternate" type="text/html" title="What to do when mysql’s .binlog files are filling up the disk" /><published>2022-05-28T03:00:00+00:00</published><updated>2022-05-28T03:00:00+00:00</updated><id>https://n8ta.com/mysql/2022/05/28/mysql-binlogs-filling-up-disk</id><content type="html" xml:base="https://n8ta.com/mysql/2022/05/28/mysql-binlogs-filling-up-disk.html">&lt;p&gt;Woke up to alerts that websites were down. Quickly find that the disk is full with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df -h&lt;/code&gt;. Next up why. Install ncdu with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt-get install ncdu&lt;/code&gt; and view a tree of my directories and their sizes.&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;---&lt;/span&gt; / &lt;span class=&quot;nt&quot;&gt;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/span&gt;
    9.1 GiB &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;##########] /var&lt;/span&gt;
    6.2 GiB &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;######    ] /usr&lt;/span&gt;
    2.6 GiB &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;##        ] /home&lt;/span&gt;
    2.2 GiB &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;##        ] /snap&lt;/span&gt;
  387.1 MiB &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;          &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; /boot
  150.8 MiB &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;          &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; /root
   36.1 MiB &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;          &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; /etc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dig around in there until I find the binlogs. Okay how to remove them, quick google turns up this to make them automatically expire&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PERSIST&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;binlog_expire_logs_seconds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;259200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;GLOBAL&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;binlog_expire_logs_seconds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;259200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;SHOW&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;BINARY&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LOGS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.001604 | 104861415 | No        |
| binlog.001605 |   2133604 | No        |
| binlog.001606 |  10123192 | No        |
| binlog.001607 |       157 | No        |
| binlog.001608 |       157 | No        |
| binlog.001609 |  54486285 | No        |
| binlog.001610 |    181294 | No        |
| binlog.001611 |    301159 | No        |
| binlog.001612 |    120357 | No        |
| binlog.001613 |       157 | No        |
| binlog.001614 |  20589546 | No        |
| binlog.001615 |  72575731 | No        |
| binlog.001616 |  41724083 | No        |
| binlog.001617 |       157 | No        |
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Oh that didn’t clean the old ones. Finally cleared with&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;PURGE&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;BINARY&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LOGS&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TO&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;binlog.last_number_i_saw&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Restart a few things and we’re rolling again.&lt;/p&gt;</content><author><name>Nate Tracy-Amoroso</name></author><category term="mysql" /><summary type="html">Woke up to alerts that websites were down. Quickly find that the disk is full with df -h. Next up why. Install ncdu with apt-get install ncdu and view a tree of my directories and their sizes.</summary></entry><entry><title type="html">Don’t make me wait</title><link href="https://n8ta.com/2021/11/08/dont-make-me-wait.html" rel="alternate" type="text/html" title="Don’t make me wait" /><published>2021-11-08T03:00:00+00:00</published><updated>2021-11-08T03:00:00+00:00</updated><id>https://n8ta.com/2021/11/08/dont-make-me-wait</id><content type="html" xml:base="https://n8ta.com/2021/11/08/dont-make-me-wait.html">&lt;p&gt;Servers are lovely. They run 24/7, they do their work immediately, and they usually manage to do a few things at time. Beautiful.&lt;/p&gt;

&lt;p&gt;Enters the engineer.&lt;/p&gt;

&lt;p&gt;Suddenly it’s important that we batch process. For “efficiency”. Now our systems sit idle for 59 minutes an hour. Amazing.&lt;/p&gt;

&lt;p&gt;There I am $14 spent at one of the largest most advanced tech companies in the world for a copy of a piece of software. A binary.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“It may take up to one hour for your purchase to appear in your digital blah blah blah”
-Bad Website&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What could they be doing. Credit cards take seconds not minutes to process. Even if they want to give me a unique 
binary to track pirating that would only take seconds. Alas I shall never know. But hopefully by the time this 
post is live my download will be ready…&lt;/p&gt;

&lt;p&gt;PLEASE stop slowing down computers with human scale constraints. A computer scale batch (for a web server at least) would be in 50ms-1000ms range. If you ever
find yourself using hours in computer systems there’s a good chance you’ve fucked things up.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
P.S. Am I impatient? Yes. Is $14 a lot No. Is there any reason this shouldn’t be instant &lt;strong&gt;NO!&lt;/strong&gt;&lt;/p&gt;</content><author><name>Nate Tracy-Amoroso</name></author><summary type="html">Servers are lovely. They run 24/7, they do their work immediately, and they usually manage to do a few things at time. Beautiful.</summary></entry><entry><title type="html">Ask not if async/await is good enough for you, ask if you are you good enough for async/await</title><link href="https://n8ta.com/async/await/c%23/2021/09/05/are-you-sure-you-want-async-await.html" rel="alternate" type="text/html" title="Ask not if async/await is good enough for you, ask if you are you good enough for async/await" /><published>2021-09-05T03:00:00+00:00</published><updated>2021-09-05T03:00:00+00:00</updated><id>https://n8ta.com/async/await/c%23/2021/09/05/are-you-sure-you-want-async-await</id><content type="html" xml:base="https://n8ta.com/async/await/c%23/2021/09/05/are-you-sure-you-want-async-await.html">&lt;div class=&quot;language-c# highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;doesYourCodeLookLikeThisAsync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ifItDoes&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;YouMightFindThat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;thereWasNoPoint&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;usingAsyncAwait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;because&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;There&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;isNoParalellism&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;that&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;we&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;can&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exploit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;here&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;becuase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;What&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;youActuallyWanted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;was&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;single&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;faster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// but that is hard so instead just use &lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// async await and that&apos;ll make everythign faster somehow. &lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you actually want to use async/await to make thing faster you need to notice what work can be done in parallel and 
actually do it in parallel and then await strategically when you need the result.&lt;/p&gt;

&lt;p&gt;Here’s what I see a lot. Code that boils down to be blocking non-async code.&lt;/p&gt;

&lt;div class=&quot;language-c# highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c_data&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;loadCustomerData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// wait for customer work to be done&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v_data&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;loadVendorData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// then do vendor work&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you actually want a speedup you need something like this.&lt;/p&gt;
&lt;div class=&quot;language-c# highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;customerWork&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c_data&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;loadCustomerData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;vendorWork&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v_data&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;loadVendorData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WhenAll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;customerWork&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;vendorWork&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// wait for both to complete in parallel&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This isn’t simpler. It’s quite a bit more complicated. It’s also harder to read.
In general I’d only want to implement this kind of solution when perf matters OR if the team is ready to normalize
async/await complexity.&lt;/p&gt;

&lt;p&gt;If you don’t have perf problems and don’t want to run into async await complexity, code like it’s 1990 (okay this is c# so 2000).&lt;/p&gt;

&lt;div class=&quot;language-c# highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c_data&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;loadCustomerData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v_data&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;loadVendorData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>Nate Tracy-Amoroso</name></author><category term="async" /><category term="await" /><category term="c#" /><summary type="html">async Task&amp;lt;int&amp;gt; doesYourCodeLookLikeThisAsync() { var ifItDoes = await this.YouMightFindThat(); var thereWasNoPoint = await to.usingAsyncAwait(); because.There = await isNoParalellism(that, we, can exploit, here); becuase.What = await youActuallyWanted(was, to, make, single-thread, code, faster); // but that is hard so instead just use // async await and that&apos;ll make everythign faster somehow. }</summary></entry><entry><title type="html">Scancodes for the windows keyboard in a machine readable format</title><link href="https://n8ta.com/windows/2021/09/04/windows-scancodes-machine-readable.html" rel="alternate" type="text/html" title="Scancodes for the windows keyboard in a machine readable format" /><published>2021-09-04T03:00:00+00:00</published><updated>2021-09-04T03:00:00+00:00</updated><id>https://n8ta.com/windows/2021/09/04/windows-scancodes-machine-readable</id><content type="html" xml:base="https://n8ta.com/windows/2021/09/04/windows-scancodes-machine-readable.html">&lt;p&gt;&lt;a href=&quot;/assets/scancodes.txt&quot;&gt;scancodes.txt&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;00 NOTHING
20 D
40 F6
60 Ctrl F3
80 Alt 9
A0 Alt Dn Arrow
01 ESC
21 F
41 F7
61 Ctrl F4
81 Alt 0
A1 Alt PgDn
02 1
22 G
42 F8
62 Ctrl F5
82 Alt -
A2 Alt Ins
03 2
23 H
43 F9
63 Ctrl F6
82 Alt =
A3 Alt Del
04 3
24 J
44 F10
64 Ctrl F7
84 Ctrl PgUp
A4 Alt / (num)
05 4
25 K
45 Num Lk
65 Ctrl F8
85 F11
A5 Alt Tab
06 5
26 L
46 Scrl Lk
66 Ctrl F9
86 F12
A6 Alt Enter (Num)
07 6
27 ; :
47 Home
67 Ctrl F10
87 Shift F11
08 7
28 &apos; &quot;
48 Up Arrow
68 Alt F1
88 Shift F12
09 8
29 ` ~
49 Pg Up
69 Alt F2
89 Ctrl F11
0A 9
2A Left Shift
4A - (num)
6A Alt F3
8A Ctrl F12
0B 0
2B \ |
4B 4 Left Arrow
6B Alt F4
8B Alt F11
0C - _
2C Z
4C 5 (num)
6C Alt F5
8C Alt F12
0D = +
2D X
4D 6 Rt Arrow
6D Alt F6
8C Ctrl Up Arrow
0E BKSP
0F Tab
10 Q
11 W
12 E
13 R
14 T
15 Y
16 U
17 I
18 O
19 P
1A [ {
1B ] }
1C Enter
1D Ctrl
1E A
1F S
2E C
2F V
30 B
31 N
32 M
33 , &amp;lt;
34 . &amp;gt;
35 / ?
36 Right Shift
37 Print Screen
38 Alt
39 Space
3A CapsLock
3B F1
3C F2
3D F3
3E F4
3F F5
4E + (num)
4F 1 End
50 2 Dn Arrow
51 3 Pg Dn
52 0 Ins
53 Del .
54 Shift F1
55 Shift F2
56 Shift F3
57 Shift F4
58 Shift F5
59 Shift F6
5A Shift F7
5B Shift F8
5C Shift F9
5D Shift F10
5E Ctrl F1
5F Ctrl F2
6E Alt F7
6F Alt F8
70 Alt F9
71 Alt F10
72 Ctrl PtScr
73 Ctrl L Arrow
74 Ctrl R Arrow
75 Ctrl End
76 Ctrl PgDn
77 Ctrl Home
78 Alt 1
79 Alt 2
7A Alt 3
7B Alt 4
7C Alt 5
7D Alt 6
7E Alt 7
7F Alt 8
8E Ctrl - (num)
8F Ctrl 5 (num)
90 Ctrl + (num)
91 Ctrl Dn Arrow
92 Ctrl Ins
93 Ctrl Del
94 Ctrl Tab
95 Ctrl / (num)
96 Ctrl * (num)
97 Alt Home
98 Alt Up Arrow
99 Alt PgUp
9A &amp;lt;none&amp;gt;
9B Alt Left Arrow
9C &amp;lt;none&amp;gt;
9D Alt Rt Arrow
9E &amp;lt;none&amp;gt;
9F Alt End
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>Nate Tracy-Amoroso</name></author><category term="windows" /><summary type="html">scancodes.txt</summary></entry><entry><title type="html">The Permissions-Policy header still sucks; it’s been 3 years</title><link href="https://n8ta.com/http/2021/08/23/permissions-policy-header-still-sucks.html" rel="alternate" type="text/html" title="The Permissions-Policy header still sucks; it’s been 3 years" /><published>2021-08-23T02:00:00+00:00</published><updated>2021-08-23T02:00:00+00:00</updated><id>https://n8ta.com/http/2021/08/23/permissions-policy-header-still-sucks</id><content type="html" xml:base="https://n8ta.com/http/2021/08/23/permissions-policy-header-still-sucks.html">&lt;p&gt;The HTTP header permissions policy (formerly feature-policy) controls what features the page can use. Eg. USB, accelerometer, battery, camera…&lt;/p&gt;

&lt;p&gt;The most secure permissions policy header looks like this (apache config):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
Header always set Permissions-Policy &quot;accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), layout-animations=(), legacy-image-formats=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), oversized-images=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), speaker-selection=(), sync-xhr=(), unoptimized-images=(), unsized-media=(), usb=(), vibrate=(), vr=(), screen-wake-lock=(), web-share=(), xr-spatial-tracking=()&quot;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Yuck!   &lt;small&gt;Those =() are empty lists meaning nothing is allowed to use the feature&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;The worst part is this example will be obsolete once google shoves a new feature through w3c and we all need to disable the new
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;intra-ocular-laser&lt;/code&gt; feature.&lt;/p&gt;

&lt;p&gt;Please give us a way to specify that the default is to deny the use of a feature.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
Permissions-Policy: default()
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lo and behold my idea isn’t original. Someone suggested the same thing 3 years ago.
I have no idea how these things are standardized but maybe upvoting the first post here will help:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/w3c/webappsec-permissions-policy/issues/189&quot;&gt;github.com/w3c/webappsec-permissions-policy/issues/189&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are lots of more complicated suggestions the comments. I don’t personally see a need for them.
A good default of DENY and a whitelist of features you’re actually using seems like a fine approach.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
Permissions-Policy: default=(),accelerometer(&apos;self&apos;)
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Feel free to shoot me an email if you think I’m wrong.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;PS:&lt;/p&gt;

&lt;p&gt;Yes Yes I know this is small potatoes and only even comes into play once someone manages to get malicious js running
on your page. But still, the fix is easy, let’s do it.&lt;/p&gt;</content><author><name>Nate Tracy-Amoroso</name></author><category term="http" /><summary type="html">The HTTP header permissions policy (formerly feature-policy) controls what features the page can use. Eg. USB, accelerometer, battery, camera…</summary></entry><entry><title type="html">What’s up with null in c# (and c, cpp, etc…)</title><link href="https://n8ta.com/c%20sharp/2021/08/22/whats-up-with-null.html" rel="alternate" type="text/html" title="What’s up with null in c# (and c, cpp, etc…)" /><published>2021-08-22T03:00:00+00:00</published><updated>2021-08-22T03:00:00+00:00</updated><id>https://n8ta.com/c%20sharp/2021/08/22/whats-up-with-null</id><content type="html" xml:base="https://n8ta.com/c%20sharp/2021/08/22/whats-up-with-null.html">&lt;p&gt;I constantly see this at work&lt;/p&gt;

&lt;div class=&quot;language-c# highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Tmp&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;DoSomething&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TheType&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TheOtherType&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AnOtherType&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;b&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ArgumentNullException&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;c&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Done&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And I die a little inside every time.&lt;/p&gt;

&lt;p&gt;Didn’t I say I wanted a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TheType&lt;/code&gt;? Why is it possible that I am instead given a bomb type instead that’ll explode if I touch it.
Eg:&lt;/p&gt;

&lt;div class=&quot;language-c# highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TheType&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TheOtherType&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AnotherType&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Program&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tmp&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Tmp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;DoSomething&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Somehow null is a valid `TheType`&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Tmp&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;DoSomething&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TheType&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TheOtherType&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AnotherType&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ToString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Done&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And BOOM, exception.&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Run-time exception (line 19): Object reference not set to an instance of an object.

Stack Trace:

[System.NullReferenceException: Object reference not set to an instance of an object.]
   at Tmp.DoSomething(TheType a, TheOtherType b, AnotherType c) :line 19
   at Program.Main() :line 13

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;My poor function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DoSomething&lt;/code&gt; asked for a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TheType&lt;/code&gt; was handled literally nothing and the type system just let it happen.&lt;/p&gt;

&lt;p&gt;This is made worse by the fact that c# has the idea of nullability and they get it right for primitives. Here’s a program
that won’t compile. (Wouldn’t it be great if the earlier examples didn’t compile too!)&lt;/p&gt;
&lt;div class=&quot;language-c# highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Program&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;123&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mapping&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Dictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;mapping&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-awk highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Argument&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;cannot&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;convert&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;long&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;long&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Hey look at that it noticed that a nullable long &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;long?&lt;/code&gt; is not the same as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;long&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C#&lt;/code&gt; even has this pretty syntax:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-C#&quot;&gt;public class Program
{
    public static void M`ai``n()
    {
        long? a = 123;
        if (a is long notNullA) {
            var mapping = new Dictionary&amp;lt;long,long&amp;gt;();
            mapping[notNullA] = 1;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We can unwrap our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;long?&lt;/code&gt; into a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;long&lt;/code&gt; and get a new variable with the correct type.&lt;/p&gt;

&lt;p&gt;Of course you can do the same unwrapping trick for classes but you shouldn’t need to double check every arguement is the type
you asked for. Classes should default to non-nullable just like the primitives.&lt;/p&gt;

&lt;p&gt;The current behavior is un-intuitive, boilerplate heavy, and inflexible.&lt;/p&gt;</content><author><name>Nate Tracy-Amoroso</name></author><category term="c sharp" /><summary type="html">I constantly see this at work</summary></entry><entry><title type="html">mysql 5.7 per query timeout with optimizer hints in rails 6.0 and plain sql</title><link href="https://n8ta.com/mysql/2021/07/19/mysql-per-query-timeout-with-optimizer-hints.html" rel="alternate" type="text/html" title="mysql 5.7 per query timeout with optimizer hints in rails 6.0 and plain sql" /><published>2021-07-19T03:00:00+00:00</published><updated>2021-07-19T03:00:00+00:00</updated><id>https://n8ta.com/mysql/2021/07/19/mysql-per-query-timeout-with-optimizer-hints</id><content type="html" xml:base="https://n8ta.com/mysql/2021/07/19/mysql-per-query-timeout-with-optimizer-hints.html">&lt;p&gt;MySQL &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;gt;= 5.7&lt;/code&gt; allows a per query timeout as an optimizer hint. It only works for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SELECT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here’s a 500ms timeout:&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/*+ MAX_EXECUTION_TIME(500) */&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;DISTINCT&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;`model`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And in rails you can do&lt;/p&gt;
&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;begin&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;optimizer_hints&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;MAX_EXECUTION_TIME(500)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;count&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ActiveRecord&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;StatementTimeout&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Uh-oH!&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It’s been easy to set a GLOBAL max query execution time in mysql for awhile. However this breaks mysqldump and other long
running commands. &lt;a href=&quot;/mysql/2021/04/02/how-to-set-mysql-query-timeout.html&quot;&gt;post&lt;/a&gt;. I prefer an opt-in system where 
I can wrap only the problematic queries.&lt;/p&gt;

&lt;p&gt;So I’ve been searching for a way to do better per-query timeouts and here it is!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/5.7/en/optimizer-hints.html#optimizer-hints-execution-time&quot;&gt;MySQL docs&lt;/a&gt;&lt;/p&gt;</content><author><name>Nate Tracy-Amoroso</name></author><category term="mysql" /><summary type="html">MySQL &amp;gt;= 5.7 allows a per query timeout as an optimizer hint. It only works for SELECT.</summary></entry><entry><title type="html">Struggling to replace master slave, how about shepard sheep?</title><link href="https://n8ta.com/2021/07/01/struggling-replace-master-slave-how-about-shepard-sheep.html" rel="alternate" type="text/html" title="Struggling to replace master slave, how about shepard sheep?" /><published>2021-07-01T03:00:00+00:00</published><updated>2021-07-01T03:00:00+00:00</updated><id>https://n8ta.com/2021/07/01/struggling-replace-master-slave-how-about-shepard-sheep</id><content type="html" xml:base="https://n8ta.com/2021/07/01/struggling-replace-master-slave-how-about-shepard-sheep.html">&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Master&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slave&lt;/code&gt; are everywhere in computer science.&lt;/p&gt;

&lt;p&gt;A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;master&lt;/code&gt; database server handles the writes and passes
them out to read replicas or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;slaves&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The git &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;master&lt;/code&gt; branch.&lt;/p&gt;

&lt;p&gt;To name the biggest two. For some these words conjure bad imagery and worse history.
There have been lots of attemps to replace them. There’s also been a some  maligning the change as stupid,
ageist, and other nonesense &lt;a href=&quot;https://www.quora.com/What-do-you-think-about-few-major-software-removing-terms-master-and-slave-from-their-code-because-they-can-be-considered-offensive&quot;&gt;mostly bad arguements on quora&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There have been a lot of a suggestions&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;parent/child&lt;/li&gt;
  &lt;li&gt;leader/follower&lt;/li&gt;
  &lt;li&gt;primary/replica&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But all of these share one thing. They lack&lt;/p&gt;
&lt;style&gt;
.html-rainbow-text span {
	font-family: Arial;
	display: inline-block;
	font-weight: bold;
	font-size: 50px;
	text-shadow: #A3A3A3 1px 1px 1px;
}

&lt;/style&gt;

&lt;div class=&quot;html-rainbow-text&quot; style=&quot;text-align: center;&quot;&gt;
	&lt;span style=&quot;color:#9400D3&quot;&gt;I&lt;/span&gt;&lt;span style=&quot;color:#4B0082&quot;&gt;M&lt;/span&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;A&lt;/span&gt;&lt;span style=&quot;color:#00FF00&quot;&gt;G&lt;/span&gt;&lt;span style=&quot;color:#FFFF00&quot;&gt;I&lt;/span&gt;&lt;span style=&quot;color:#FF7F00&quot;&gt;N&lt;/span&gt;&lt;span style=&quot;color:#FF0000&quot;&gt;A&lt;/span&gt;&lt;span style=&quot;color:#FF7F00&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color:#FFFF00&quot;&gt;I&lt;/span&gt;&lt;span style=&quot;color:#00FF00&quot;&gt;O&lt;/span&gt;&lt;span style=&quot;color:#0000FF&quot;&gt;N&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;So I present my own alternative.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/flock.jpg&quot; alt=&quot;Photo of a shepard and their sheep in a large green field. 75%  of the image is a sunny sky.&quot; /&gt;
&lt;small&gt;&lt;a style=&quot;color: black&quot; href=&quot;https://photostockeditor.com/image/man-standing-in-front-of-group-of-lamb-2363&quot;&gt;source&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;h1 id=&quot;shepard-and-sheep&quot;&gt;Shepard and Sheep&lt;/h1&gt;

&lt;h2 id=&quot;pros&quot;&gt;Pros:&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;Contains sheep, everyone loves sheep&lt;/li&gt;
  &lt;li&gt;Not controversial&lt;/li&gt;
  &lt;li&gt;Contains shepard, good old timey imagery&lt;/li&gt;
  &lt;li&gt;Fun to say shhhh-eppp-ard shhhh-eeeyyypp&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;cons&quot;&gt;Cons:&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;¿ Doesn’t include any other animals ?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Please help me spread the word. A suitable replacement has been found. It’s time to&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git pull origin shepard
kubectl create &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; sheep
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>Nate Tracy-Amoroso</name></author><summary type="html">Master and slave are everywhere in computer science.</summary></entry><entry><title type="html">Why is there a chip shortage? Crap like this!</title><link href="https://n8ta.com/2021/05/23/why-is-there-a-chip-shortage-crap-like-this.html" rel="alternate" type="text/html" title="Why is there a chip shortage? Crap like this!" /><published>2021-05-23T03:00:00+00:00</published><updated>2021-05-23T03:00:00+00:00</updated><id>https://n8ta.com/2021/05/23/why-is-there-a-chip-shortage-crap-like-this</id><content type="html" xml:base="https://n8ta.com/2021/05/23/why-is-there-a-chip-shortage-crap-like-this.html">&lt;p&gt;We’ve heard a lot about how a lack of silicon chips is crippling manufacturing. I hold the opposite view,
manufacturing is being crippled by a surplus of silicon. I just left the lovely state of Florida and while
there I saw this fantastic light switch panel.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/crap.jpeg&quot; alt=&quot;A light switch followed by a panel with a toggle button followed by another lightswitch&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It has 3 parts&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A normal lightswitch (it controls nothing)&lt;/li&gt;
  &lt;li&gt;A lovely fanimation ceiling fan that actually controls the lights as well as the fan&lt;/li&gt;
  &lt;li&gt;A normal lightswitch (it also does nothing)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While I’m sure these people make great fans they’ve massively overcomplicated it in a few ways.
First there’s an on off switch that control the PANEL not the fan. You can slide that to off and the fan stays on but the buttons
now do nothing. Why does the panel itself have state that is separate from the lights/fan state?&lt;/p&gt;

&lt;p&gt;Second they’ve replaced lovely rocking light switches which are easy and intuitive to use and replaced them
with a small green button. Switches are great they have two states just like lights on and off vs up and down. 
Buttons have no state.&lt;/p&gt;

&lt;p&gt;Third they violate assumptions; we expect to control fan speed either not at all or by
turning a nob. They use neither and have a series of buttons.&lt;/p&gt;

&lt;p&gt;Had they needed to make this product in 1950 it would have been two light switches. That’s it. No circuit board behind
the lightswitch, no buttons, nothing. Instead they use more tech than they need by about 70 years.&lt;/p&gt;

&lt;p&gt;A few other things I’d like to see have their circuit boards ripped out:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Microwaves (just 1 button to add 30s please, idk what the rest are for)&lt;/li&gt;
  &lt;li&gt;Cars (not all the circuit boards, just no over the air updates please)&lt;/li&gt;
  &lt;li&gt;Smart-insert-noun (lightblubs, refrigerators, ac units, etc.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Anyway next time you buy something choose the dumb version. It’ll last twice as long and cost half as much.&lt;/p&gt;</content><author><name>Nate Tracy-Amoroso</name></author><summary type="html">We’ve heard a lot about how a lack of silicon chips is crippling manufacturing. I hold the opposite view, manufacturing is being crippled by a surplus of silicon. I just left the lovely state of Florida and while there I saw this fantastic light switch panel.</summary></entry></feed>