<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Default &#8211; Ian McKellar</title>
	<atom:link href="https://ianloic.com/category/posts/feed/" rel="self" type="application/rss+xml" />
	<link>https://ianloic.com</link>
	<description>software and opinions</description>
	<lastBuildDate>Tue, 16 Feb 2021 19:56:17 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.3</generator>
	<atom:link rel='hub' href='https://ianloic.com/?pushpress=hub'/>
	<item>
		<title>VSCode Remote and the command line</title>
		<link>https://ianloic.com/2021/02/16/vscode-remote-and-the-command-line/</link>
		
		<dc:creator><![CDATA[Ian McKellar]]></dc:creator>
		<pubDate>Tue, 16 Feb 2021 19:56:17 +0000</pubDate>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[hacks]]></category>
		<category><![CDATA[zsh]]></category>
		<guid isPermaLink="false">https://ianloic.com/?p=668</guid>

					<description><![CDATA[I use Visual Studio Code in conjunction with terminal windows. I&#8217;m very used to using source control, building and running tests from the command-line and I tend to work on sufficiently weird things that VSCode&#8217;s ideas about what a build is don&#8217;t map well. When poking around my source tree, building or running tests I &#8230; <p class="link-more"><a href="https://ianloic.com/2021/02/16/vscode-remote-and-the-command-line/" class="more-link">Continue reading<span class="screen-reader-text"> "VSCode Remote and the command line"</span></a></p>]]></description>
										<content:encoded><![CDATA[
<p>I use <a href="https://code.visualstudio.com/">Visual Studio Code</a> in conjunction with <a href="https://help.gnome.org/users/gnome-terminal/stable/">terminal windows</a>. I&#8217;m very used to using source control, building and running tests from the command-line and I tend to work on sufficiently weird things that VSCode&#8217;s ideas about what a build is don&#8217;t map well.</p>



<p>When poking around my source tree, building or running tests I often want to open an interesting file in my editor. Locally I just run <code>code path/to/file</code> and that works great, but with <a href="https://code.visualstudio.com/docs/remote/remote-overview">Visual Studio Code Remote</a> it does not. I&#8217;ve been working from home since March 2020 and both the workstation in my office and the cloud machines at my disposal are much more powerful than my laptop. I wanted to get this same functionality working in this setup.</p>



<p>I looked at how running <code>code</code> within VSCode&#8217;s integrated terminal works. Each remote instance creates a uniquely named directory under <code>~/.vscode-server/bin/</code> that contains a copy of <code>node</code>, the installed extensions, helper scripts (including one called <code>bin/code</code>) and other state. There&#8217;s a UNIX domain socket called <code>/run/user/UID/vscode-ipc-SOME-UUID.sock</code> that&#8217;s put in the integrated terminal shell&#8217;s environment variable <code>$VSCODE_IPC_HOOK_CLI</code>.</p>



<p>I only tend to run a single VSCode remote instance per server so I wrote a Zsh function that simply looks for the most recent helper script and runs it with the most recent socket:</p>



<pre class="wp-block-preformatted">code () {
     local script=$(echo ~/.vscode-server/bin/*/bin/code(*ocNY1)) 
     if [[ -z ${script} ]]
     then
         echo "VSCode remote script not found"
         exit 1
     fi
     local socket=$(echo /run/user/$UID/vscode-ipc-*.sock(=ocNY1))
     if [[ -z ${socket} ]]
     then
         echo "VSCode IPC socket not found"
         exit 1
     fi
     export VSCODE_IPC_HOOK_CLI=${socket}
     ${script} $*
 }</pre>



<p>This uses some Zsh-specific globbing but I&#8217;m sure the same thing could be implemented for <code>bash</code> or <code>tcsh</code> or <code>fish</code> or whatever the kids are using these days.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Injustices and Anachronisms</title>
		<link>https://ianloic.com/2019/05/15/injustices-and-anachronisms/</link>
		
		<dc:creator><![CDATA[Ian McKellar]]></dc:creator>
		<pubDate>Wed, 15 May 2019 16:29:10 +0000</pubDate>
				<category><![CDATA[Default]]></category>
		<guid isPermaLink="false">https://ianloic.com/?p=621</guid>

					<description><![CDATA[A couple of weeks ago I was thinking happily about the fact that my kids will never know a time before marriage equality in the country that they&#8217;re growing up in. The US Supreme Court struck down bans on same-sex partners marrying less than a month before they were born. There was some talk of &#8230; <p class="link-more"><a href="https://ianloic.com/2019/05/15/injustices-and-anachronisms/" class="more-link">Continue reading<span class="screen-reader-text"> "Injustices and Anachronisms"</span></a></p>]]></description>
										<content:encoded><![CDATA[
<p>A couple of weeks ago I was thinking happily about the fact that my kids will never know a time before marriage equality in the country that they&#8217;re growing up in. The US Supreme Court <a href="https://en.wikipedia.org/wiki/Obergefell_v._Hodges">struck down</a> bans on same-sex partners marrying less than a month before they were born. There was some talk of constitutional amendments to restore the discrimination in the aftermath of the ruling but that&#8217;s largely subsided.</p>



<p>Outside of the United States this is still a live issue. My kids are Australian and Swiss too. After a problematic plebiscite Australia recognized marriage equality in 2017. Switzerland doesn&#8217;t allow same-sex marriage but <a href="https://en.wikipedia.org/wiki/Recognition_of_same-sex_unions_in_Switzerland#Public_opinion">polls show heavy support</a> and I expect the law will change before my kids are aware.</p>



<p>My kids will probably grow up seeing &#8220;other&#8221;, &#8220;backwards&#8221;, &#8220;bad places&#8221; that are stuck in the past. I don&#8217;t expect Saudi Arabia or Uganda to make this kind of progress before my kids are aware of the legal and cultural difference around the world. They&#8217;ll probably see that there&#8217;s something wrong with those societies. I hope they don&#8217;t think that the problem lies in the people there or the religions they follow, but that there&#8217;s some social block preventing their inevitable progress towards modernity and civility.</p>



<p>Then I realized that this is how I feel about capital punishment in the United States.</p>



<hr class="wp-block-separator"/>



<p>Growing up in Australia capital punishment was a part of history lessons not civics lessons. We learned that <a href="https://en.wikipedia.org/wiki/Ronald_Ryan">Ronald Ryan</a> was the last man hanged. In 1967 the country was changing: there were protests against the war in Vietnam, metric currency and measures were being adopted, feminism and indigenous rights movements were becoming visible. The end of capital punishment was a part of that &#8211; part of the country growing up and becoming a modern civilized democracy.</p>



<p>Now I&#8217;ve found myself living in a country where capital punishment is seen as an injustice by many, as racist, ineffective and expensive by others. But for me it&#8217;s more than that &#8211; it&#8217;s an anachronism. It&#8217;s as far in the past and as settled a question as segregated lunch counters. Just thinking about it turns my stomach.</p>



<hr class="wp-block-separator"/>



<p>As a child I didn&#8217;t think that restricting marriage to being between men and women was an injustice &#8211; I just didn&#8217;t think about it. As I grew up and found gay friends and family members struggling with discrimination it became pretty clear pretty quickly that restrictions are on peoples right to marry and have a family based on their sexuality was both nonsensical and damaging to the lives of people who I cared about.</p>



<p>Will my children have to learn that capital punishment is an injustice? </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Reusing Passwords</title>
		<link>https://ianloic.com/2016/11/26/reusing-passwords/</link>
		
		<dc:creator><![CDATA[Ian McKellar]]></dc:creator>
		<pubDate>Sat, 26 Nov 2016 19:33:35 +0000</pubDate>
				<category><![CDATA[Default]]></category>
		<guid isPermaLink="false">https://ianloic.com/?p=570</guid>

					<description><![CDATA[I have a confession. Sometimes I reuse passwords. Not for anything that &#8220;matters&#8221;, but I&#8217;ve ended up using a couple of passwords a lot of times. And inevitably some of those sites get hacked. But where did I use them? Chrome remembers all my passwords but unfortunately doesn&#8217;t seem to offer a straightforward API to &#8230; <p class="link-more"><a href="https://ianloic.com/2016/11/26/reusing-passwords/" class="more-link">Continue reading<span class="screen-reader-text"> "Reusing Passwords"</span></a></p>]]></description>
										<content:encoded><![CDATA[<p>I have a confession. Sometimes I reuse passwords. Not for anything that &#8220;matters&#8221;, but I&#8217;ve ended up using a couple of passwords a lot of times. And inevitably some of those sites get hacked. But where did I use them?</p>
<p>Chrome remembers all my passwords but unfortunately doesn&#8217;t seem to offer a straightforward API to get at them. Conveniently they do sync my passwords to my computer&#8217;s password store and there&#8217;s an <a href="https://specifications.freedesktop.org/secret-service/">API for that</a>.</p>
<p>I wrote a little script and I&#8217;ve been going through generating unique passwords for all the unimportant sites and turning two-factor authentication on where it&#8217;s offered. The <em>Secret Service</em> database (and Chrome) seem to sometimes end up with multiple entries for a single site, and Chrome doesn&#8217;t seem to sync my updates immediately, but I&#8217;ve found this a helpful start.</p>
<p><a href="https://gist.github.com/ianloic/b32db4dfd8d03a3c0ffbb4d1eca9be6a">https://gist.github.com/ianloic/b32db4dfd8d03a3c0ffbb4d1eca9be6a</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Partisan Divide</title>
		<link>https://ianloic.com/2016/11/07/partisan-divide/</link>
		
		<dc:creator><![CDATA[Ian McKellar]]></dc:creator>
		<pubDate>Mon, 07 Nov 2016 17:57:48 +0000</pubDate>
				<category><![CDATA[Default]]></category>
		<guid isPermaLink="false">https://ianloic.com/?p=566</guid>

					<description><![CDATA[There&#8217;s an American election on Tuesday. Whatever the outcome of the races, the partisan polarization is disturbing. Roughly 40% of the electorate considers each presidential candidate to be unqualified to even run. I don&#8217;t have the right to vote but my perspective is just as absolute. I&#8217;m right, but I&#8217;d say that wouldn&#8217;t I. Each &#8230; <p class="link-more"><a href="https://ianloic.com/2016/11/07/partisan-divide/" class="more-link">Continue reading<span class="screen-reader-text"> "Partisan Divide"</span></a></p>]]></description>
										<content:encoded><![CDATA[<p>There&#8217;s an American election on Tuesday. Whatever the outcome of the races, the partisan polarization is disturbing. Roughly 40% of the electorate considers each presidential candidate to be unqualified to even run. I don&#8217;t have the right to vote but my <a href="https://shop.hillaryclinton.com/products/im-with-her-car-magnet">perspective</a> is just as absolute. I&#8217;m right, but I&#8217;d say that wouldn&#8217;t I.</p>
<p>Each party chose a candidate that was dismissed out of hand by half the country as even a valid choice to offer. The core of the debate has not been over policy or even really a vision of the future of the country, but of the fatal personal flaws of the other candidate.</p>
<p>Where do we go from here? If America elects Trump on Tuesday then I and half the country won&#8217;t just feel defeated and disappointed, worried about next four years and the country our children will inherit, but we&#8217;ll be skeptical of the president elect&#8217;s eligibility to hold the office to which he was democratically elected. If Clinton prevails the other half of the country will feel the same way.</p>
<p>Perhaps more disturbingly support for the candidates break heavily along gender, ethnicity and class lines. Whoever wins, whole communities will not only feel unrepresented in the White House, they&#8217;ll feel that its occupant is illegitimate. And for all their various skills, neither candidate has demonstrated skill in uniting the nation.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Tyranny is mostly pleasant</title>
		<link>https://ianloic.com/2016/06/08/tyranny-is-mostly-pleasant/</link>
		
		<dc:creator><![CDATA[Ian McKellar]]></dc:creator>
		<pubDate>Thu, 09 Jun 2016 00:55:33 +0000</pubDate>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[dwebsummit]]></category>
		<category><![CDATA[free software]]></category>
		<category><![CDATA[tyranny]]></category>
		<guid isPermaLink="false">https://ianloic.com/?p=558</guid>

					<description><![CDATA[In my life I&#8217;ve been lucky enough to visit some brutal military dictatorships. From Suharto&#8217;s Indonesia as a child to Mubarak&#8217;s Egypt more recently, they&#8217;ve been really pleasant to visit. My impression is that most citizens of these countries were fairly unencumbered by the political system they lived under. Some people had terrible time &#8211; &#8230; <p class="link-more"><a href="https://ianloic.com/2016/06/08/tyranny-is-mostly-pleasant/" class="more-link">Continue reading<span class="screen-reader-text"> "Tyranny is mostly pleasant"</span></a></p>]]></description>
										<content:encoded><![CDATA[<p>In my life I&#8217;ve been lucky enough to visit some brutal military dictatorships. From Suharto&#8217;s Indonesia as a child to Mubarak&#8217;s Egypt more recently, they&#8217;ve been really pleasant to visit. My impression is that most citizens of these countries were fairly unencumbered by the political system they lived under. Some people had terrible time &#8211; Islamists in Egypt, Timorese and Papuans in Indonesia &#8211; were tortured and murdered, their languages and beliefs suppressed. But for most people this wasn&#8217;t an issue.</p>
<p>Thinking about technology we have a similar situation. Most people are happy to rely on a proprietary operating system like MacOS or Windows because even though it takes away some freedoms, for them these freedoms aren&#8217;t as important on a day-to-day basis as the convenience that the platform provides.</p>
<p>Even though they&#8217;ve done a terrible job of protecting women and marginalized minorities from abuse, Twitter is a really convenient conversation platform for me. Facebook too with its real names policy excludes many people from honest, safe expression, but for a white cis man like me it&#8217;s really convenient.</p>
<p>On the other hand I run Linux on my personal computers because software freedom is morally important to me and the practical benefits for my fringe use case (programming) are significant.</p>
<p>If we&#8217;re going to build and promote Free technology &#8211; both FLOSS and a decentralized web, we need to accept that the pure principle of freedom isn&#8217;t enough to kick-start change. Enough people need to suffer enough discomfort to trigger a revolution.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Decentralized Web: My Thought Experiment</title>
		<link>https://ianloic.com/2016/06/08/decentralized-web-my-thought-experiment/</link>
		
		<dc:creator><![CDATA[Ian McKellar]]></dc:creator>
		<pubDate>Wed, 08 Jun 2016 22:11:16 +0000</pubDate>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[dwebsummit]]></category>
		<category><![CDATA[reputation]]></category>
		<guid isPermaLink="false">https://ianloic.com/?p=555</guid>

					<description><![CDATA[I&#8217;m at the Decentralized Web Summit today and it&#8217;s all very interesting. There are some big picture ideas of how the future should be. There are all sorts of interesting disparate technologies filling all kinds of holes. But I have a thought experiment that I&#8217;ve used to understand where we need to go and what we need &#8230; <p class="link-more"><a href="https://ianloic.com/2016/06/08/decentralized-web-my-thought-experiment/" class="more-link">Continue reading<span class="screen-reader-text"> "Decentralized Web: My Thought Experiment"</span></a></p>]]></description>
										<content:encoded><![CDATA[<p>I&#8217;m at the <a href="http://www.decentralizedweb.net/">Decentralized Web Summit</a> today and it&#8217;s all very interesting. There are some big picture ideas of how the future should be. There are all sorts of interesting disparate technologies filling all kinds of holes. But I have a thought experiment that I&#8217;ve used to understand where we need to go and what we need to build to get there.</p>
<p>Uber. Or Lyft or AirBnB, or even Etsy.</p>
<p>This new sharing economy supposedly shakes up traditional businesses by harnessing the distributed power of the internet, but when you ignore shiny apps these businesses look a lot like traditional rent-seeking middlemen.</p>
<p>It feels like a bug that we are making new businesses that look like such old businesses. Ride sharing shouldn&#8217;t need  middleman. Prospective passengers and drivers should be able to discover each other, agree on a transaction, go for a ride and then make payment.</p>
<p>We have a lot of the pieces already, but <em>reputation</em> is the big challenge I see in all this. Even centralized systems struggle with reputation but we don&#8217;t have a good way to know if we should trust that a driver is competent or a guest won&#8217;t trash my apartment. I don&#8217;t know how to solve this, but I sure hope someone is thinking about it.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Low Fidelity Abstraction</title>
		<link>https://ianloic.com/2016/05/25/low-fidelity-abstraction/</link>
		
		<dc:creator><![CDATA[Ian McKellar]]></dc:creator>
		<pubDate>Thu, 26 May 2016 00:53:03 +0000</pubDate>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[rant]]></category>
		<guid isPermaLink="false">https://ianloic.com/?p=550</guid>

					<description><![CDATA[It&#8217;s only through abstraction that we&#8217;re able to build the complex software systems that we do today. Hiding unimportant details from developers lets us work more efficiently and most importantly it allows us to devote more of our brain to the higher-level problems we&#8217;re trying to solve for our users. As an obvious example, if you&#8217;re &#8230; <p class="link-more"><a href="https://ianloic.com/2016/05/25/low-fidelity-abstraction/" class="more-link">Continue reading<span class="screen-reader-text"> "Low Fidelity Abstraction"</span></a></p>]]></description>
										<content:encoded><![CDATA[<p>It&#8217;s only through abstraction that we&#8217;re able to build the complex software systems that we do today. Hiding unimportant details from developers lets us work more efficiently and most importantly it allows us to devote more of our brain to the higher-level problems we&#8217;re trying to solve for our users.</p>
<p>As an obvious example, if you&#8217;re implementing a simple arithmetic function in assembly language you have to expend a lot of your brain power to track which registers are used for what, how the CPU will schedule the instructions and so on, while in a high level language you just worry about if you&#8217;ve picked the right algorithm and let the compiler worry about communicating it correctly and efficiently to the processor.</p>
<h2>Lo-fi</h2>
<p>More abstraction isn&#8217;t necessarily good though. If your abstractions hide important details then the cognitive burden on developers is increased (as they keep track of important information not expressed in the API) or their software will be worse (if they ignore those details). This can take many forms, but generally it makes things that can be expensive feel free by overloading programming language constructs. Here are some examples&#8230;</p>
<h2>Getters and Setters</h2>
<p>Getters and setters can implicitly introduce unexpected, important side effects. Code that looks like:</p>
<pre>foo.bar = x;
y = foo.baz;</pre>
<p>is familiar to programmers. We think we know what it means and it looks cheap. It looks like we&#8217;re writing a value to a memory location in the <em>foo</em> structure and reading out of another. In a language that supports getters and setters that may be what&#8217;s happening, or much more may be happening under the hood. Some common unexpected things that happen with getters and setters are:</p>
<ul>
<li><strong>unexpected mutation</strong> &#8211; getting or setting a field changes some other aspect of an object. For example, does setting <em>person.fullName</em> update the <em>person.firstName</em> and <em>person.lastName</em> fields?</li>
<li><strong>lack of idempotency</strong> &#8211; reading the same field of an object repeatedly shouldn&#8217;t change its value, but with a getter it can. It&#8217;s even often convenient to have a <em>nextId</em> getter than returns an incrementing id or something.</li>
<li><strong>lack of symmetry</strong> &#8211; if you write to a field does the same value come out when you immediately read from it? Some getters or setters clean up data &#8211; useful, but unexpected.</li>
<li><strong>slow performance</strong> &#8211; setting a field on a struct is just about the cheapest thing you can do in high level code. Calling a getter or setter can do just about anything. Expensive field validation for setters, expensive computation for getters, and even worse reading from or writing to a database are unexpected yet common.</li>
</ul>
<p>Getters and setters are really useful to API designers. They allow us to present a simple interface to our consumers but they introduce the risk of hiding details that will impact them or their users.</p>
<h2>Automatic Memory Management</h2>
<p>Automatic memory management is one of the great step forwards for programmer productivity. Managing memory with <em>malloc</em> and <em>free</em> is difficult to get right, often inefficient (because we err on the side of simple predictability) and the source of many bugs. Automatic memory management introduces its own issues.</p>
<p>It&#8217;s not so much that garbage collection is slow, but it makes allocation look free. The more allocation that occurs the more memory is used and the more garbage needs to be collected. The performance price of additional allocations aren&#8217;t paid by the code that&#8217;s doing the allocations but by the whole application.</p>
<p>APIs&#8217; memory behavior is hidden from callers making it unclear what their cost will be. Worse, in weirder automatic memory management systems like Automatic Reference Counting in modern versions of Objective-C, it&#8217;s not clear if APIs will retain objects passed to them or returned from them &#8211; often even to the implementers of the API (<a href="https://github.com/liquidx/CoreBluetoothPeripheral#cbcentralmanager-connectperipheral-silently-fails">for example</a>).</p>
<h2>IPC and RPC</h2>
<p>It&#8217;s appealing to hide inter-process communication and remote procedure calls behind interfaces that look like local method calls. Local method calls are cheap, reliable, don&#8217;t leak user data, don&#8217;t have semantics that can change over time, and so on. Both IPC and RPC have those issues and can have them to radically different extents.  When we make calling remote services feel the same as calling local methods we remove the chore of using a library but force developers to carry the burden of the subtle but significant differences in our meagre brains.</p>
<h2>But&#8230;</h2>
<p>But I like abstraction. It can be incredibly valuable to hide unimportant details but incredibly costly to hide important ones. In practice, instead of being aware of the costs hidden by an abstraction and taking them into account, developers will ignore them. We&#8217;re a lazy people, and easily distracted.</p>
<p>When designing an API step back and think about how developers will use your API. Make cheap things easy but expensive things obviously expensive.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>HTTP/2 on nginx on Debian</title>
		<link>https://ianloic.com/2016/05/22/http2-on-nginx-on-debian/</link>
		
		<dc:creator><![CDATA[Ian McKellar]]></dc:creator>
		<pubDate>Mon, 23 May 2016 03:41:16 +0000</pubDate>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[http2]]></category>
		<category><![CDATA[nginx]]></category>
		<guid isPermaLink="false">https://ianloic.com/?p=545</guid>

					<description><![CDATA[I run my web site off a Debian server on GCE. I like tinkering with the configuration. I hear that HTTP 2 is the new hot thing, and that&#8217;s going to mean supporting ALPN which means upgrading to OpenSSL 1.0.2 and nginx 1.9.5 or newer. But they isn&#8217;t supported in Debian 8. I used apt pinning &#8230; <p class="link-more"><a href="https://ianloic.com/2016/05/22/http2-on-nginx-on-debian/" class="more-link">Continue reading<span class="screen-reader-text"> "HTTP/2 on nginx on Debian"</span></a></p>]]></description>
										<content:encoded><![CDATA[<p>I run my web site off a <a href="https://www.debian.org/">Debian</a> server on <a href="https://cloud.google.com/compute/">GCE</a>. I like tinkering with the configuration. I hear that <a href="https://http2.github.io/">HTTP 2</a> is the new hot thing, and that&#8217;s going to mean supporting <a href="https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation">ALPN</a> which means upgrading to OpenSSL 1.0.2 and nginx 1.9.5 or newer. But they isn&#8217;t supported in <a href="https://www.debian.org/releases/jessie/">Debian 8</a>.</p>
<p>I used <a href="https://wiki.debian.org/AptPreferences#Pinning">apt pinning</a> to bring in versions of nginx and OpenSSL from <a href="https://www.debian.org/releases/testing/">testing</a> into my jessie server. I first added sources for testing by creating a file <code>/etc/apt/sources.list.d/testing.list</code>:</p>
<pre>deb http://ftp.us.debian.org/debian testing main non-free contrib</pre>
<p>Then I configured my pin priorities by creating <code>/etc/apt/preferences</code> with:</p>
<pre>Package: *
Pin: release a=stable
Pin-Priority: 700

Package: *
Pin: release a=testing
Pin-Priority: 650

Package: *
Pin: release a=unstable
Pin-Priority: 600</pre>
<p>After an <code>apt-get update</code> I could install the version of nginx from testing, bringing in the appropriate version of OpenSSL: <code>apt-get -t=testing install nginx-full</code></p>
<p>Then it was just a matter of changing:</p>
<pre>listen 443 ssl;</pre>
<p>to:</p>
<pre>listen 443 ssl http2;</pre>
<p>wherever I wanted it.</p>
<p>Now it looks like I&#8217;m serving over HTTP/2. Not that it makes a whole lot of obvious difference yet.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Writing ES6 without a transpiler</title>
		<link>https://ianloic.com/2016/03/18/writing-es6-without-a-transpiler/</link>
		
		<dc:creator><![CDATA[Ian McKellar]]></dc:creator>
		<pubDate>Fri, 18 Mar 2016 18:03:47 +0000</pubDate>
				<category><![CDATA[Default]]></category>
		<guid isPermaLink="false">https://ianloic.com/?p=540</guid>

					<description><![CDATA[I like modern JS features. I&#8217;ve been using some like const and let for a long time in specific contexts like Gecko chrome (when I worked on Flock &#38; Songbird). Recently I&#8217;ve been playing with the features that have been standardized as ES6. I tried a bunch of different build-system and transpiler approaches but I found &#8230; <p class="link-more"><a href="https://ianloic.com/2016/03/18/writing-es6-without-a-transpiler/" class="more-link">Continue reading<span class="screen-reader-text"> "Writing ES6 without a transpiler"</span></a></p>]]></description>
										<content:encoded><![CDATA[<p>I like modern JS features. I&#8217;ve been using some like const and let for a long time in specific contexts like <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const#Firefox-specific_notes">Gecko chrome</a> (when I worked on <a href="https://en.wikipedia.org/wiki/Flock_(web_browser)">Flock</a> &amp; <a href="https://en.wikipedia.org/wiki/Songbird_(software)">Songbird</a>). Recently I&#8217;ve been playing with the features that have been standardized as ES6.</p>
<p>I tried a bunch of different build-system and transpiler approaches but I found them all unsatisfying. Even with automatic transpilation on save, even with source maps, I felt that I was missing too much of the edit/reload cycle that makes web JS programming such a pleasure. Even with low latency I couldn&#8217;t take advantage of things like being able to edit my source code inside the <a href="https://developer.chrome.com/devtools/docs/javascript-debugging">Chrome developer tools debugger</a>.</p>
<p>Luckily stable Chrome <a href="https://www.chromestatus.com/features#es6">supports a lot of ES6</a>. Just restricting myself to that quite large subset gives me a great set of features to work with, without losing the development flow I like. Every six weeks I get more features to play with as a new Chrome release launches. When I want to deploy to older browsers I can transpile (<a href="https://github.com/google/closure-compiler/wiki/ECMAScript6">Closure Compiler</a> is great) and <a href="https://github.com/inexorabletash/polyfill">polyfill</a>, but it&#8217;s part of the release / deployment flow rather than obstructing development.</p>
<p>So what am I using? Mostly:</p>
<ul>
<li>Classes</li>
<li>Arrow functions</li>
<li>let and const</li>
<li>New collection types &#8211; Map, Set, etc</li>
</ul>
<p>It&#8217;s pretty nice.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Australia Days</title>
		<link>https://ianloic.com/2016/01/26/australia-days/</link>
		
		<dc:creator><![CDATA[Ian McKellar]]></dc:creator>
		<pubDate>Tue, 26 Jan 2016 17:46:38 +0000</pubDate>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[australia]]></category>
		<category><![CDATA[politics]]></category>
		<guid isPermaLink="false">http://ianloic.com/?p=533</guid>

					<description><![CDATA[Photo credit: Finn Pröpper I really like Australia. I was born there, I grew up there, my parents brothers and sisters all live there. I don&#8217;t have a single national identity, but &#8216;Australian&#8217; is the one I put above the others. It&#8217;s a physically beautiful and inspiring country. At their best its people are generous, &#8230; <p class="link-more"><a href="https://ianloic.com/2016/01/26/australia-days/" class="more-link">Continue reading<span class="screen-reader-text"> "Australia Days"</span></a></p>]]></description>
										<content:encoded><![CDATA[<p><a title="Cape Leveque" href="https://www.flickr.com/photos/fraggy/8944672990/" data-flickr-embed="true"><img fetchpriority="high" decoding="async" src="https://farm3.staticflickr.com/2857/8944672990_6a4aa02ea9_b.jpg" alt="Cape Leveque" width="1024" height="768" /><br />
<em><small>Photo credit: Finn Pröpper</small></em></a></p>
<p>I really like Australia. I was born there, I grew up there, my parents brothers and sisters all live there. I don&#8217;t have a single national identity, but &#8216;Australian&#8217; is the one I put above the others. It&#8217;s a physically beautiful and inspiring country. At their best its people are generous, open, welcoming, relaxed and funny. At its strongest Australian nationalism is self-critical. The story of the first European settlers arriving as British criminals  and founding a free nation is inspiring.</p>
<p>On the other hand, our country was founded on the lie of <em><a href="https://en.wikipedia.org/wiki/Terra_nullius#Australia">terra nullius</a></em> which continues to pervert many Australians&#8217; understanding of their country. Indigenous Australians suffer incarceration and ill health at rates that are hard to comprehend, relative to the prosperous, free image we have of ourselves. Explicit genocide, dispossession, unequal treatment and paternalism has been replaced by active neglect and disrespect. Stan Gran&#8217;s speech is a must-watch:</p>
<p><iframe title="IQ2 Racism Debate: Stan Grant" width="640" height="360" src="https://www.youtube.com/embed/uEOssW1rw0I?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></p>
<p>Australia&#8217;s attitude to immigration has been troubled for a long time. A <a href="https://en.wikipedia.org/wiki/White_Australia_policy">set of White Australia policies</a> restricted non-European immigration persisted into the 1960s. Even then, non-English Europeans, especially Catholics were looked down on and politically and economically marginalized. During the Second World War, unlike the United States, we interned not only Japanese Australians, but Australians of Italian and German descent &#8211; as I like to say, &#8220;our racism was colourblind&#8221;. Subsequent waves of Southern European, East Asian, and now South Asian and Middle Eastern immigrants are attacked verbally by politicians and physically by thugs.</p>
<p>Finally in the treatment of asylum seekers by Australia since the 1990s has been a stain on our reputation and our moral standing. Governments of all parties have imprisoned men, women and children, in awful conditions, exposing them to horrible abuse &#8211; simply for arriving in Australia after escaping persecution &#8211; but without their paperwork in order. It&#8217;s a continuation and escalation of our history of xenophobic immigration policies.</p>
<p>So January 26th doesn&#8217;t get me that excited, but it does make me reflect. I&#8217;m glad my employer <a href="https://newmatilda.com/2016/01/26/the-worlds-most-popular-website-just-ripped-the-rug-out-from-under-australia-day/">decided to use our home page</a> the occasion to highlight the historic oppression of our indigenous brothers and sisters. In four months time there will be <a href="https://en.wikipedia.org/wiki/National_Sorry_Day">National Sorry Day</a>, a national day of atonement and reconciliation. That recognizes where we&#8217;ve come from, how far we have to go to achieve the standards we set ourselves. That celebrates the aspects of Australian culture that I most identify with.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
