<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Hacker News Personal Blogs 2015 | All Blog Posts</title><link>https://hn-blogs.kronis.dev/feed.xml</link><description>A collection of blog posts from users of Hacker News, based on RSS feeds.</description><language>en-US</language><lastBuildDate>Sat, 13 Jun 2026 04:03:20 GMT</lastBuildDate><generator>rfeed v1.1.1</generator><docs>https://github.com/svpino/rfeed/blob/master/README.md</docs><item><title>Play2: Switching from specs2 to ScalaTest</title><link>https://manuel.kiessling.net/2015/12/31/play2-switching-from-specs2-to-scalatest/</link><description>The following applies to Play 2.4 projects for Scala 2.11.  When setting up a Play2 Scala project, two test case files are created automatically: test/ApplicationSpec.scala and test/IntegrationSpec.scala. The testcases therein are based on specs2. If you prefer to write your test cases using ScalaTest (I certainly do), then you need to proceed as follow:  Change the libraryDependencies in file build.sbt from:  libraryDependencies ++= Seq( jdbc, cache, ws, specs2 % Test )</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Thu, 31 Dec 2015 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2015/12/31/play2-switching-from-specs2-to-scalatest/</guid></item><item><title>Ten noteworthy books I read in 2015</title><link>https://bastian.rieck.me/blog/2015/noteworthy_books/</link><description>&lt;p&gt;Since getting a Kindle last Christmas, I have started reading even more. This is my personal list of
noteworthy books I read in 2015. In no particular order, we have:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Seveneves&lt;/em&gt;, by Neal Stephenson: A truly epic tale of the near-extinction and re-birth of
humanity. In some ways, this book even rivals the love I feel towards Stephenson’s
&lt;em&gt;Cryptonomicon&lt;/em&gt;. Read this if you are even slightly interested in science or space.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;The Psychology of Invention in the Mathematical Field&lt;/em&gt;, by Jacques Hadamard: I was overjoyed to
find this in the bargain bin of a bookshop. Hadamard studies nothing less than the way
mathematicians invent (or discover) mathematics. The result is an engaging work
with (unfortunately) vague answers that are not generally applicable. Still, it rekindled my
interest in these topics and I look forward to reading more formalized works from this area.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Effective Modern C++&lt;/em&gt;, by Scott Meyers: Meyers continues to amaze me with his in-depth knowledge
of this most peculiar programming language (…as majestic as troops with
banners…). If you want to do serious work with C++11 or C++14, read this book. No excuses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Embassytown&lt;/em&gt;, by China Miéville: A captivating story about humanity’s contact with a
&lt;em&gt;truly&lt;/em&gt; alien race and their unique language. If you ever wondered about what a species would
live like if the (discredited) &lt;em&gt;Sapir-Whorf hypothesis&lt;/em&gt; was fully true, you will enjoy this
book as much as I did.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Parable of the Sower&lt;/em&gt;, by Octavia E. Butler: Set in a failing world that is not much unlike our
own, Butler describes the tale of a young woman and her struggle for survival. In contrast to
many other books describing an apocalyptic event, this one really hit a spot because the reader
can &lt;em&gt;feel&lt;/em&gt; the world crumble while reading—and the fall is not preceded by loud bangs but
rather by quiet whispers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;The Opposite of Loneliness: Essays and Stories&lt;/em&gt;, by Marina Keegan: Published posthumously after
the untimely death of this young writer, this is a collection of her work. At times, it was
painful to read with the knowledge that the spark of a great writer that is easily glimpsed
in the book would never mature. The stories speak of a hunger for life, of possibilities, of
uncertainty, and of fear. If you read only one essay, read &lt;a href="http://yaledailynews.com/blog/2011/09/30/even-artichokes-have-doubts"&gt;&lt;em&gt;Even Artichokes have
Doubts&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Goddess of the Market&lt;/em&gt;, by Jennifer Burns: After reading this biography of Ayn Rand, I may
finally re-read her books with more sympathy and more appreciation. Read this if you think that
&lt;em&gt;Atlas Shrugged&lt;/em&gt; is “not a book to be tossed away lightly—it should be hurled with
great forced”. At the very least, you may understand the thought patterns of political
conservatives and libertarians better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;After the Fall, Before the Fall, During the Fall&lt;/em&gt;, by Nancy Kress: In my ongoing quest to read
more books written by women, I had already encountered the writings of Nancy Kress. Although this
was &lt;em&gt;also&lt;/em&gt; a book about the apocalypse, I enjoyed the way Kress intertwined multiple perspectives
about &lt;em&gt;The Fall&lt;/em&gt;. Although the resolution of the novel is slightly campy, this is still a
gripping tale.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Muse of Fire&lt;/em&gt;, by Dan Simmons: Shakespeare in space—what’s not to love? After
Simmons wrote himself into my heart with his extremely intelligent &lt;em&gt;Hyperion Cantos&lt;/em&gt; and the epic
&lt;em&gt;Ilium/Olympos&lt;/em&gt; books, &lt;em&gt;Muse of Fire&lt;/em&gt; was another formidable book in the genre of “literary
science fiction”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Visualization Analysis and Design&lt;/em&gt;, by Tamara Munzner: A must-read in my profession. Munzner
gives us a flexible framework that helps us think in a more structured manner about doing
visualization.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;According to &lt;a href="http://www.goodreads.com"&gt;goodreads&lt;/a&gt;, I read 63 books this year, with a total of 19131
pages. The shortest book I read had 60 pages, while the longest had 880. The average number of pages
was 314. I initially wanted to read 25 books this years but got somewhat carried away.&lt;/p&gt;
&lt;p&gt;Good reading for 2016!&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Thu, 31 Dec 2015 15:36:57 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/noteworthy_books/</guid></item><item><title>Gene Regulatory Networks</title><link>https://trigonaminima.github.io/2015/12/grn/</link><description>Here goes the documentation of the work I did during my summer internship. Yeah, I know, this is coming quite, quite late, but hey! Better late than never! All the coding was done in R (check out the repo). There will also be another post which will talk about the technical (basically, R code) details.</description><author>Playground</author><pubDate>Thu, 31 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2015/12/grn/</guid></item><item><title>Private data for JS classes with WeakMap</title><link>https://qubyte.codes/blog/private-data-for-js-classes-with-weakmap</link><description>&lt;p&gt;Private data has always been awkward in JavaScript. It's particularly difficult when it comes to
constructors, and with ES2015 recently published, classes too. Let's say we have an example class,
exported by an ES2015 module:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;export&lt;/span&gt; &lt;span class="hljs-keyword"&gt;default&lt;/span&gt; &lt;span class="hljs-keyword"&gt;class&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Example&lt;/span&gt; {
  &lt;span class="hljs-title function_"&gt;constructor&lt;/span&gt;(&lt;span class="hljs-params"&gt;&lt;/span&gt;) {
    &lt;span class="hljs-variable language_"&gt;this&lt;/span&gt;.&lt;span class="hljs-property"&gt;_privateDatum&lt;/span&gt; = &lt;span class="hljs-title class_"&gt;Math&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;random&lt;/span&gt;();
  }

  &lt;span class="hljs-title function_"&gt;log&lt;/span&gt;(&lt;span class="hljs-params"&gt;&lt;/span&gt;) {
    &lt;span class="hljs-variable language_"&gt;console&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;log&lt;/span&gt;(&lt;span class="hljs-variable language_"&gt;this&lt;/span&gt;.&lt;span class="hljs-property"&gt;_privateDatum&lt;/span&gt;);
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In the constructor, a field with some private data, &lt;code&gt;_privateDatum&lt;/code&gt; is appended (the value is a
placeholder for illustration). The initial underscore in the name is a common convention and is
meant to tell developers using the class that they shouldn't touch or look at that field. Why should
this be private? Private stuff is subject to change without your users needing to know about it.
This field could be renamed or go away completely if you refactor, without affecting the public API.
So what's the problem?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;You can't trust your users!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This isn't meant as an insult. Your users are cunning, and if they can solve a problem without
filing an issue or raising a pull request, they probably will. They have deadlines after all... If
your class gets very popular, it becomes inevitable that someone is going to use your
private-by-convention field to hack together a solution to a problem they're having, and you'll
break their code when you change it. Changes to your public API should be clearly indicated by
changes to the version number and updated documentation. The inner workings of your code on the
other hand, including private data, are subject to dramatic change at any time.&lt;/p&gt;
&lt;p&gt;The solution is to hide the private data, removing the temptation. You can do this using a
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures"&gt;&lt;em&gt;closure&lt;/em&gt;&lt;/a&gt;. Consider:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;export&lt;/span&gt; &lt;span class="hljs-keyword"&gt;default&lt;/span&gt; &lt;span class="hljs-keyword"&gt;class&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Example&lt;/span&gt; {
  &lt;span class="hljs-title function_"&gt;constructor&lt;/span&gt;(&lt;span class="hljs-params"&gt;&lt;/span&gt;) {
    &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; privateDatum = &lt;span class="hljs-title class_"&gt;Math&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;random&lt;/span&gt;();

    &lt;span class="hljs-variable language_"&gt;this&lt;/span&gt;.&lt;span class="hljs-property"&gt;log&lt;/span&gt; = &lt;span class="hljs-keyword"&gt;function&lt;/span&gt; (&lt;span class="hljs-params"&gt;&lt;/span&gt;) {
      &lt;span class="hljs-variable language_"&gt;console&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;log&lt;/span&gt;(privateDatum);
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In this example, the private data is now assigned to a variable in the constructor. Since the
variable is not returned, nothing outside the constructor will have access to it. The pain now is
that the &lt;code&gt;log&lt;/code&gt; method has to be attached to the instance inside the constructor, so that it can have
access to the variable. It's a real shame to lose the nice method syntax. It also make an individual
&lt;code&gt;log&lt;/code&gt; method for each instance, which means objects will each use more memory.&lt;/p&gt;
&lt;p&gt;This is where
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap"&gt;&lt;code&gt;WeakMap&lt;/code&gt;&lt;/a&gt;
comes in. An instance of &lt;code&gt;WeakMap&lt;/code&gt; has keys which are objects of some kind, and values which can be
whatever you like. &lt;code&gt;WeakMap&lt;/code&gt; instances are especially good, since if they are the last thing to hold
a reference to an object (as a key), then the JS engine is allowed to garbage collect it. This means
the risk of memory leaks is lessened. You &lt;em&gt;could&lt;/em&gt; simulate most aspects of &lt;code&gt;WeakMap&lt;/code&gt; using existing
structures like arrays, but that would always result in a memory leak, since the garbage collector
thinks those objects are in use and cannot clear them up. The final example below shows what this
looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; privateDatum = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;WeakMap&lt;/span&gt;();

&lt;span class="hljs-keyword"&gt;export&lt;/span&gt; &lt;span class="hljs-keyword"&gt;default&lt;/span&gt; &lt;span class="hljs-keyword"&gt;class&lt;/span&gt; &lt;span class="hljs-title class_"&gt;Example&lt;/span&gt; {
  &lt;span class="hljs-title function_"&gt;constructor&lt;/span&gt;(&lt;span class="hljs-params"&gt;&lt;/span&gt;) {
    privateDatum.&lt;span class="hljs-title function_"&gt;set&lt;/span&gt;(&lt;span class="hljs-variable language_"&gt;this&lt;/span&gt;, &lt;span class="hljs-title class_"&gt;Math&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;random&lt;/span&gt;());
  }

  &lt;span class="hljs-title function_"&gt;log&lt;/span&gt;(&lt;span class="hljs-params"&gt;&lt;/span&gt;) {
    &lt;span class="hljs-variable language_"&gt;console&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;log&lt;/span&gt;(privateDatum.&lt;span class="hljs-title function_"&gt;get&lt;/span&gt;(&lt;span class="hljs-variable language_"&gt;this&lt;/span&gt;));
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The keys of &lt;code&gt;privateDatum&lt;/code&gt; are the instances of the example class. If nothing else holds a reference
to an instance of the example class, the garbage collector doesn't count the reference in
&lt;code&gt;privateDatum&lt;/code&gt; and can clear it up! Since the instances are keys, &lt;code&gt;this&lt;/code&gt; can be used in any method
to access the private data. The &lt;code&gt;privateDatum&lt;/code&gt; variable hidden by the module, so the user will have
no access to it!&lt;/p&gt;
&lt;p&gt;This approach can be used with constructor functions and methods appended to the prototype too. The
following constructor produces objects with similar behaviour to those produced by the class in the
previous example:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-javascript"&gt;&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; privateDatum = &lt;span class="hljs-keyword"&gt;new&lt;/span&gt; &lt;span class="hljs-title class_"&gt;WeakMap&lt;/span&gt;();

&lt;span class="hljs-keyword"&gt;export&lt;/span&gt; &lt;span class="hljs-keyword"&gt;default&lt;/span&gt; &lt;span class="hljs-keyword"&gt;function&lt;/span&gt; &lt;span class="hljs-title function_"&gt;Example&lt;/span&gt;(&lt;span class="hljs-params"&gt;&lt;/span&gt;) {
  privateDatum.&lt;span class="hljs-title function_"&gt;set&lt;/span&gt;(&lt;span class="hljs-variable language_"&gt;this&lt;/span&gt;, &lt;span class="hljs-title class_"&gt;Math&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;random&lt;/span&gt;());
}

&lt;span class="hljs-title class_"&gt;Example&lt;/span&gt;.&lt;span class="hljs-property"&gt;&lt;span class="hljs-keyword"&gt;prototype&lt;/span&gt;&lt;/span&gt;.&lt;span class="hljs-property"&gt;log&lt;/span&gt; = &lt;span class="hljs-keyword"&gt;function&lt;/span&gt; (&lt;span class="hljs-params"&gt;&lt;/span&gt;) {
  &lt;span class="hljs-variable language_"&gt;console&lt;/span&gt;.&lt;span class="hljs-title function_"&gt;log&lt;/span&gt;(privateDatum.&lt;span class="hljs-title function_"&gt;get&lt;/span&gt;(&lt;span class="hljs-variable language_"&gt;this&lt;/span&gt;));
};
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The good news is that &lt;code&gt;WeakMap&lt;/code&gt; is one of the most well supported features of ES2015. With the
exception of IE Mobile and Opera Mobile, all current versions of major browsers support the
functionality in this post. See the
&lt;a href="http://kangax.github.io/compat-table/es6/#test-WeakMap"&gt;compatibility table&lt;/a&gt;. If you're using a
maintained version of Node, you're good to go!&lt;/p&gt;
&lt;h3 id="addendum"&gt;Addendum&lt;/h3&gt;
&lt;p&gt;It's still possible to gain access to private data stored in a WeakMap by patching
&lt;code&gt;WeakMap.prototype.set&lt;/code&gt; or &lt;code&gt;WeakMap.prototype.get&lt;/code&gt;. This should &lt;em&gt;absolutely never be done!&lt;/em&gt; Along
with the usual reasons to not modify the prototype of a built in constructor, modifying WeakMap
risks undoing the whole reason for using it in the first place. By monitoring objects used as the
keys of a WeakMap, references can be created and the garbage collector may not be able to clean up
after you. That said, patching can be done. If you want to avoid that risk, you can &lt;code&gt;Object.freeze&lt;/code&gt;
both &lt;code&gt;WeakMap&lt;/code&gt; and &lt;code&gt;WeakMap.prototype&lt;/code&gt; before any other code runs.&lt;/p&gt;</description><author>Qubyte Codes</author><pubDate>Wed, 30 Dec 2015 16:35:00 GMT</pubDate><guid isPermaLink="true">https://qubyte.codes/blog/private-data-for-js-classes-with-weakmap</guid></item><item><title>Find in \$PATH with type and which</title><link>https://xenodium.com/find-in-path-with-type-and-which</link><description>&lt;p&gt;I typically use &lt;em&gt;which&lt;/em&gt; to figure out the first binary found in $PATH:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;which -a emacsclient
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;/Users/user/homebrew/bin/emacsclient
/usr/bin/emacsclient
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I always forget about &lt;em&gt;type&lt;/em&gt; though:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;type -a emacsclient
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;emacsclient is /Users/user/homebrew/bin/emacsclient
emacsclient is /usr/bin/emacsclient
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 30 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/find-in-path-with-type-and-which</guid></item><item><title>npm basics</title><link>https://xenodium.com/npm-basics</link><description>&lt;h2&gt;Global vs local package installation location&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;{prefix}/lib/node_modules&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;vs&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;path/to/project/node_modules&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;View npm config&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;npm config list
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;; cli configs
user-agent = &amp;quot;npm/2.14.2 node/v4.0.0 darwin x64&amp;quot;

; node bin location = /Users/user/.nvm/versions/node/v4.0.0/bin/node
; cwd = /Users/user/stuff/active/blog
; HOME = /Users/user
; 'npm config ls -l' to show all defaults.

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Get config value&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;npm config get prefix
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;/Users/user/.nvm/versions/node/v4.0.0
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Set config value&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;npm config set prefix=$HOME/some/location
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Install package globally&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;node install --global &amp;lt;package-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;node install -g &amp;lt;package-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;List global packages&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;npm list --global
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can also use –depth=0 to make less verbose.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;/Users/user/.nvm/versions/node/v4.0.0/lib
├─┬ babel-eslint@4.1.3
│ ├── acorn-to-esprima@1.0.4
│ ├─┬ babel-core@5.8.25
│ │ ├── babel-plugin-constant-folding@1.0.1
│ │ ├── babel-plugin-dead-code-elimination@1.0.2
...
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Install local package&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;npm install &amp;lt;package-name&amp;gt; --save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;–save will add &amp;lt;package-name&amp;gt; dependency to your package.json.&lt;/p&gt;
&lt;h2&gt;package.json&lt;/h2&gt;
&lt;p&gt;See &lt;a href="https://docs.npmjs.com/getting-started/using-a-package.json"&gt;using a package.json&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Uninstall package&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;npm uninstall &amp;lt;package-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Install package at version&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;npm install &amp;lt;package-name&amp;gt;@1.7.0
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Search packages&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;npm search linter
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Online documentation&lt;/h2&gt;
&lt;p&gt;Online documentation is great so far. More at &lt;a href="https://docs.npmjs.com"&gt;docs.npmjs.com&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 30 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/npm-basics</guid></item><item><title>Crowd Surfing</title><link>https://justingarrison.com/blog/2015-12-30-crowd-surfing/</link><description>&lt;p&gt;&lt;img alt="Me in the hospital with a broken arm" src="https://justingarrison.com/img/crowd-surfing.jpeg" /&gt;&lt;/p&gt;
&lt;p&gt;An injury from 1999 that still affects me today.&lt;/p&gt;</description><author>Justin Garrison's Homepage</author><pubDate>Wed, 30 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2015-12-30-crowd-surfing/</guid></item><item><title>iPhone vs. Android vs. webOS: A Counterpoint</title><link>https://justingarrison.com/blog/2015-12-30-iphone-vs-android-vs-webos-a-counterpoint/</link><description>Earlier this week, we compared the iPhone and Android in a knockdown showdown of features that matter to us.</description><author>Justin Garrison's Homepage</author><pubDate>Wed, 30 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2015-12-30-iphone-vs-android-vs-webos-a-counterpoint/</guid></item><item><title>2015 in review</title><link>https://jasoneckert.github.io/myblog/2015-in-review/</link><description>&lt;p&gt;&lt;img alt="2015a" src="2015a.png#center" title="2015a" /&gt;
&lt;img alt="2015b" src="2015b.jpg#right" title="2015b" /&gt;&lt;/p&gt;
&lt;p&gt;2015 was an interesting year, and one that I really enjoyed!&lt;/p&gt;
&lt;p&gt;I spent a lot of time getting/restoring/playing the last few arcade machines that I’ve wanted in my arcade collection - I just love the retro arcade hobby!  As a result, I won’t be getting or restoring any more in 2016 at all (I have a few arcades that I want to work on to upgrade, but that’s about it).  I’ll be spending most of my time playing them!&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Wed, 30 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/2015-in-review/</guid></item><item><title>My top 10 Postgres features and tips for 2016</title><link>/2015/12/29/My-top-10-Postgres-features-and-tips-for-2016/</link><description>&lt;p&gt;I find during the holiday season many pick up &lt;a href="http://www.amazon.com/Hard-Thing-About-Things-Building/dp/0062273205/ref=sr_1_1?ie=UTF8&amp;amp;qid=1451407536&amp;amp;sr=8-1&amp;amp;keywords=hard+thing+about&amp;amp;tag=mypred-20"&gt;new books&lt;/a&gt;, learn a &lt;a href="http://crystal-lang.org/"&gt;new language&lt;/a&gt;, or brush up on some other skill in general. Here&amp;rsquo;s my contribution to hopefully giving you a few new things to learn about Postgres and ideally utilize in the new year. It&amp;rsquo;s not in a top 10 list as much as 10 tips and tricks you should be aware of as when you need them they become incredibly handy. But, first a shameless plug if you find any of the following helpful, consider subscribing to &lt;a href="http://www.postgresweekly.com"&gt;Postgres weekly&lt;/a&gt; a weekly newsletter with interesting Postgres content.&lt;/p&gt;
&lt;h3 id="1-ctes---common-table-expressions"&gt;
&lt;div&gt;
1. CTEs - Common Table Expressions
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;CTEs allow you to do crazy awesome things like recursive queries but even the most simple form of them I don&amp;rsquo;t go a day without using. Think of a CTE or commonly known as with clause as a view inside the time that query is running. This lets you more easily create readable query. Any query that&amp;rsquo;s constructed that&amp;rsquo;s even &lt;a href="/2013/11/18/best-postgres-feature-youre-not-using/"&gt;100 lines long&lt;/a&gt;, but with 4-5 CTEs is undoubtedly going to be easier for someone new to come in and understand than a 20 line query that does the same thing. A few people like writing SQL, but no one likes reading someone else&amp;rsquo;s so do them a favor and read up on CTEs.&lt;/p&gt;
&lt;h3 id="2-setup-a-psqlrc"&gt;
&lt;div&gt;
2. Setup a .psqlrc
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;You setup a bashrc, vimrc, etc. Why not do the same for Postgres. Some of the great things you can do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Setup pretty formatting by default with &lt;code&gt;\x auto&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Set nulls to actually look like something &lt;code&gt;\pset null ¤&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Turn timing on by default &lt;code&gt;\timing on&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Customize your prompt &lt;code&gt;\set PROMPT1 '%[%033[33;1m%]%x%[%033[0m%]%[%033[1m%]%/%[%033[0m%]%R%# '&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Save commonly run queries that you can run by name&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s an example of my own &lt;code&gt;psqlrc&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\set QUIET 1
\pset null '¤'
-- Customize prompts
\set PROMPT1 '%[%033[1m%][%/] # '
\set PROMPT2 '... # '
-- Show how long each query takes to execute
\timing
-- Use best available output format
\x auto
\set VERBOSITY verbose
\set HISTFILE ~/.psql_history- :DBNAME
\set HISTCONTROL ignoredups
\set COMP_KEYWORD_CASE upper
\unset QUIET
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="3-pg_stat_statements-for-where-to-index"&gt;
&lt;div&gt;
3. pg_stat_statements for where to index
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pg_stat_statements&lt;/code&gt; is probably the single most valuable tool for improving performance on your database. Once enabled (with &lt;code&gt;create extension pg_stat_statements&lt;/code&gt;) it automatically records all queries run against your database and records often and how long they took. This allows you to then go and find areas you can optimize to get overall time back with one simple query:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT
(total_time / 1000 / 60) as total_minutes,
(total_time/calls) as average_time,
query
FROM pg_stat_statements
ORDER BY 1 DESC
LIMIT 100;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Yes, there is some performance cost to leaving this always on, but it&amp;rsquo;s pretty small. I&amp;rsquo;ve found it&amp;rsquo;s far more useful to be on and get major performance wins vs. the small cost of it always recording.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You can read much more on Postgres performance on a &lt;a href="http://www.craigkerstiens.com/2013/01/10/more-on-postgres-performance/"&gt;previous post&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="4-slow-down-with-etl-use-fdws"&gt;
&lt;div&gt;
4. Slow down with ETL, use FDWs
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If you have a lot of &lt;em&gt;microservices&lt;/em&gt; or different apps then you likely have a lot of different databases backing them. The default for about anything you want to do is do create some data warehouse and ETL it all together. This often goes a bit too far to the extreme of aggregating &lt;strong&gt;everything&lt;/strong&gt; together.&lt;/p&gt;
&lt;p&gt;For the times you just need to pull something together once or on rare occasion &lt;a href="http://www.craigkerstiens.com/2013/08/05/a-look-at-FDWs/"&gt;foreign data wrappers&lt;/a&gt; will let you query from one Postgres database to another, or potentially from Postgres to anything else such as &lt;a href="https://github.com/citusdata/mongo_fdw"&gt;Mongo&lt;/a&gt; or Redis.&lt;/p&gt;
&lt;h3 id="5-array-and-array_agg"&gt;
&lt;div&gt;
5. array and array_agg
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s little chance if you&amp;rsquo;re building an app you&amp;rsquo;re not using arrays somewhere within it. There&amp;rsquo;s no reason you shouldn&amp;rsquo;t be doing the same within your database as well. Arrays can be just another datatype within Postgres and have some great use cases like tags for blog posts directly in a single column.&lt;/p&gt;
&lt;p&gt;But, even if you&amp;rsquo;re not using arrays as a datatype there&amp;rsquo;s often a time when you want to rollup something like an array in a query then comma separate it. Something similar to the following could allow you to easily roll up a comma separated list of projects per user:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT
users.email,
array_to_string(array_agg(projects.name), ',')) as projects
FROM
projects,
tasks,
users
WHERE projects.id = tasks.project_id
AND tasks.due_at &amp;gt; tasks.completed_at
AND tasks.due_at &amp;gt; now()
AND users.id = projects.user_id
GROUP BY
users.email
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="6-use-materialized-views-cautiously"&gt;
&lt;div&gt;
6. Use materialized views cautiously
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re not familiar with materialized view they&amp;rsquo;re a query that has been actually created as a table. So it&amp;rsquo;s a materialized or basically snapshotted version of some query or &amp;ldquo;view&amp;rdquo;. In their initial version materialized versions, which were long requested in Postgres, were entirely unusuable because when you it was a locking transaction which could hold up other reads and acticities avainst that view.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;ve since gotten much better, but there&amp;rsquo;s no tooling for refreshing them out of the box. This means you have to setup some scheduler job or cron job to regularly refresh your materialized views. If you&amp;rsquo;re building some reporting or BI app you may undoubtedly need them, but their usability could still be advanced so that Postgres knew how to more automatically refresh them.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you&amp;rsquo;re on Postgres 9.3, the above caveats about preventing reads still does exist&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="7-window-functions"&gt;
&lt;div&gt;
7. Window functions
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Window functions are perhaps still one of the more complex things of SQL to understand. In short they let you order the results of a query, then compute something from one row to the next, something generally hard to do without procedural SQL. You can do some very basic things with them such as rank where &lt;a href="http://postgresguide.com/sql/window.html"&gt;each result appears&lt;/a&gt; ordered by some value, or something more complex like compute &lt;a href="http://www.craigkerstiens.com/2014/02/26/Tracking-MoM-growth-in-SQL/"&gt;MoM growth directly in SQL&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="8-a-simpler-method-for-pivot-tables"&gt;
&lt;div&gt;
8. A simpler method for pivot tables
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Table_func is often referenced as the way to compute a pivot table in Postgres. Sadly though it&amp;rsquo;s pretty difficult to use, and the more basic method would be to just do it with raw SQL. This will get much better with &lt;a href="http://www.craigkerstiens.com/2015/12/27/postgres-9-5-feature-rundown/"&gt;Postgres 9.5&lt;/a&gt;, but until then something where you sum up each condition where it&amp;rsquo;s true or false and then totals is much simpler to reason about:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;select date,
sum(case when type = 'OSX' then val end) as osx,
sum(case when type = 'Windows' then val end) as windows,
sum(case when type = 'Linux' then val end) as linux
from daily_visits_per_os
group by date
order by date
limit 4;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Example query courtesy of &lt;a href="http://www.twitter.com/tapoueh"&gt;Dimitri Fontaine&lt;/a&gt; and &lt;a href="http://tapoueh.org/blog/2013/07/04-Simple-case-for-pivoting"&gt;his blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="9-postgis"&gt;
&lt;div&gt;
9. PostGIS
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Sadly on this one I&amp;rsquo;m far from an expert. PostGIS is arguably the best option of any GIS database options. The fact that you get all of the standard Postgres benefits with it makes it even more powerful–a great example of this is GiST indexes which came to Postgres in recent years and offers great performance gains for PostGIS.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re doing something with geospatial data and need something more than the easy to use &lt;code&gt;earth_distance&lt;/code&gt; extension then crack open PostGIS.&lt;/p&gt;
&lt;h3 id="10-jsonb"&gt;
&lt;div&gt;
10. JSONB
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I almost debated leaving this one off the list, ever since Postgres 9.2 JSON has been at least one of the marquees in each Postgres release. JSON arrived with much hype, and JSONB fulfilled on the initial hype of Postgres starting to truly compete as a document database. JSONB only continues to become more powerful with &lt;a href="http://www.craigkerstiens.com/2015/12/08/massive-json/"&gt;better libraries&lt;/a&gt; for taking advantage of it, and it&amp;rsquo;s &lt;a href="https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.5#JSONB-modifying_operators_and_functions"&gt;functions improving&lt;/a&gt; with each release.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re doing anything with JSON or playing with another document database and ignoring JSONB you&amp;rsquo;re missing out, of course don&amp;rsquo;t forget the GIN and GiST indexes to really get the benefits of it.&lt;/p&gt;
&lt;h3 id="the-year-ahead"&gt;
&lt;div&gt;
The year ahead
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Postgres 9.5/9.6 should continue to improve and bring many new features in the years ahead, what&amp;rsquo;s your preference for something that doesn&amp;rsquo;t exist yet but you do want to see land in Postgres. Let me know &lt;a href="http://www.twitter.com/craigkerstiens"&gt;@craigkerstiens&lt;/a&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Tue, 29 Dec 2015 22:55:56 GMT</pubDate><guid isPermaLink="true">/2015/12/29/My-top-10-Postgres-features-and-tips-for-2016/</guid></item><item><title>searchcode server</title><link>https://boyter.org/2015/12/searchcode-server/</link><description>&lt;p&gt;A month or so ago I started collection emails on searchcode.com to determine if there was enough interest in a downloadable version of searchcode. The results were overwhelmingly positive. The email list grew far beyond what I would have expected, and this was in the first month. As such I have been working in this downloadable version of searchcode which will probably be called searchcode server.&lt;/p&gt;
&lt;p&gt;Progress has been reasonably straight forward consider that searchcode.com is written using mostly Python and searchcode server is mostly Java. The main reason for choosing Java is that I really wanted searchcode server to be a self contained application which could be downloaded and run without the configuration and setup of additional services.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 29 Dec 2015 04:17:42 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/12/searchcode-server/</guid></item><item><title>Kettle, my personal dashboard app</title><link>https://benovermyer.com/blog/2015/12/kettle-my-personal-dashboard-app/</link><description>&lt;p&gt;Not too long ago, I got fed up with having to use a ton of different apps to do various things online. Also, having to deal with apps that almost-but-not-quite fit the bill for what I was trying to do was a bit frustrating. So, I set out to write my own personal dashboard web app to handle… well, everything. I'm calling it Kettle, mostly because that was the first noun that popped into my head that sounded vaguely appropriate. Does it make sense? Not really. It just sounds right, much like J.R.R. Tolkien loved the sound of the phrase “cellar door.” At the time of this posting, I've just finished the first iteration of the note-taking part of the app. It doesn't yet allow searching or deleting notes, but other than that, it's perfectly usable. You can check it out at the &lt;a href="https://github.com/BenOvermyer/kettle-dashboard" rel="external"&gt;Kettle repository on GitHub&lt;/a&gt;.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Tue, 29 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/12/kettle-my-personal-dashboard-app/</guid></item><item><title>Windows vs. Linux Hardware Support</title><link>https://justingarrison.com/blog/2015-12-29-windows-vs-linux-hardware-support/</link><description>&lt;p&gt;&lt;img alt="1_BU1Gv_81bQiByW1m8Ee05g.jpeg" src="https://justingarrison.com/img/1_BU1Gv_81bQiByW1m8Ee05g.jpeg" /&gt;&lt;/p&gt;</description><author>Justin Garrison's Homepage</author><pubDate>Tue, 29 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2015-12-29-windows-vs-linux-hardware-support/</guid></item><item><title>Ludum Dare 34 Postmortem</title><link>https://etodd.io/2015/12/28/ludum-dare-34-postmortem/</link><description>&lt;h3&gt;Friday 21:15&lt;/h3&gt;
&lt;p&gt;
Fifteen minutes after the theme announcement, my friend Ben Homan walks through
my front door. Not really &lt;em&gt;my&lt;/em&gt; front door, I'm just a subletter.
But this is a first. Normally he ignores our instructions to walk in without
knocking. The first time, he texted me from the driveway.
&lt;/p&gt;
&lt;h3&gt;21:30&lt;/h3&gt;
&lt;p&gt;
Jesse Kooner walks in, also unannounced, bearing frozen pizza. Before he can
even kick his shoes off, I loudly explain the theme: a never-before-seen tie
between "growing" and "two-button controls".
&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Mon, 28 Dec 2015 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/12/28/ludum-dare-34-postmortem/</guid></item><item><title>Trying out Ceph with Oh-My-Vagrant</title><link>https://purpleidea.com/blog/2015/12/28/trying-out-ceph-with-oh-my-vagrant/</link><description>&lt;p&gt;&lt;a href="https://www.berrange.com/posts/2015/12/21/ceph-single-node-deployment-on-fedora-23/"&gt;Daniel P. Berrangé wrote about trying out a single node ceph cluster.&lt;/a&gt; I decided to take his article and turn it into an Oh-My-Vagrant &lt;code&gt;omv.yaml&lt;/code&gt; file. It took me about two minutes to do so, and two hours to debug a problem caused by something I had broken on my laptop.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like to replicate his article in less than 5 minutes, pull down the &lt;a href="https://github.com/purpleidea/oh-my-vagrant/blob/master/examples/ceph-deploy.yaml"&gt;omv.yaml&lt;/a&gt; file that I&amp;rsquo;ve just published and run &lt;code&gt;omv up&lt;/code&gt;. Here&amp;rsquo;s the full terminal output of my session:&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 28 Dec 2015 16:59:23 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/12/28/trying-out-ceph-with-oh-my-vagrant/</guid></item><item><title>App Use: Chordion</title><link>https://rjp.is/blogging/posts/app-use-chordion-2/</link><description>Chordion is a combination arpeggiator / drum sequencer that supposedly &amp;ldquo;is a fun new way to make music on the iPad.&amp;rdquo;
I think I&amp;rsquo;ve proven their &amp;ldquo;never hit a wrong note!&amp;rdquo; wrong.
Maybe a few more practice runs will help.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Mon, 28 Dec 2015 16:34:20 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-chordion-2/</guid></item><item><title>Java volatile vs atomic variables</title><link>https://studiofreya.org/java/java-volatile-vs-atomic-variables/</link><description>&lt;p&gt;Volatile and atomic variables are an important feature in Java language. Especially when dealing with &lt;a href="http://studiofreya.com/java/java-parallel-streams-api/" target="_blank"&gt;multi threading&lt;/a&gt;. A simple incrementation algorithm works fine in a single threaded program, but won’t work as expected in a multi threaded system:&lt;/p&gt;
&lt;pre class="brush: java; title: ; notranslate" title=""&gt;private int counter = 0;

public int increment(int i) {
   return i++;
}
&lt;/pre&gt;
&lt;p&gt;This code will work correctly in a single threaded program, but will give incorrect results in case of a multi threaded execution. How do we fix it? With the help of Java volatile and atomic variables.&lt;/p&gt;</description><author>Studiofreya SSG Site</author><pubDate>Mon, 28 Dec 2015 01:15:36 GMT</pubDate><guid isPermaLink="true">https://studiofreya.org/java/java-volatile-vs-atomic-variables/</guid></item><item><title>Postgres 9.5 - The feature rundown</title><link>/2015/12/27/Postgres-9.5-The-feature-rundown/</link><description>&lt;p&gt;The headline of Postgres 9.5 is undoubtedly: Insert&amp;hellip; on conflict do nothing/update or more commonly known as Upsert or Merge. This removes one of the last remaining features which other databases had over Postgres. Sure we&amp;rsquo;ll take a look at it, but first let&amp;rsquo;s browse through some of the other features you can look forward to when Postgres 9.5 lands:&lt;/p&gt;
&lt;h3 id="grouping-sets-cube-rollup"&gt;
&lt;div&gt;
Grouping sets, cube, rollup
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Pivoting in Postgres has &lt;a href="http://www.craigkerstiens.com/2013/06/27/Pivoting-in-Postgres/"&gt;sort of been possible&lt;/a&gt; as has rolling up data, but it required you to know what those values and what you were projecting to, to be known. With the new functionality to allow you to group various sets together rollups as you&amp;rsquo;d normally expect to do in something like Excel become trivial.&lt;/p&gt;
&lt;p&gt;So now instead you simply add the grouping type just as you would on a normal group by:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT department, role, gender, count(*)
FROM employees
GROUP BY your_grouping_type_here;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By simply selecting the type of rollup you want to do Postgres will do the hard work for you. Let&amp;rsquo;s take a look at the given example of department, role, gender:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grouping sets&lt;/code&gt; will project out the count for each specific key. As a result you&amp;rsquo;d get each department key, with other keys as null, and the count for each that met that department.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cube&lt;/code&gt; will give you the same values as above, but also the rollups of every individual combination. So in addition to the total for each department, you&amp;rsquo;d get breakups by the department and gender, and department and role, and department and role and gender.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rollup&lt;/code&gt; will give you a slightly similar version to cube but only give you the detailed groupings in the order they&amp;rsquo;re presented. So if you specified &lt;code&gt;roll (department, role, gender)&lt;/code&gt; you&amp;rsquo;d have no rollup for department and gender alone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Check the what&amp;rsquo;s new wiki for a bit more clarity on &lt;a href="https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.5#GROUPING_SETS.2C_CUBE_and_ROLLUP"&gt;examples and output&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="import-foreign--schemas"&gt;
&lt;div&gt;
Import foreign schemas
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I only use foreign tables about once a month, but when I do use them they&amp;rsquo;ve inevitably saved many hours of creating a one off ETL process. Even still the effort to setup new foreign tables has shown a bit of their infancy in Postgres. Now once you&amp;rsquo;ve setup your foreign database, you can import the schema, either all of it or specific tables you prefer.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s as simple as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IMPORT FOREIGN SCHEMA public
FROM SERVER some_other_db INTO reference_to_other_db;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="pg_rewind"&gt;
&lt;div&gt;
pg_rewind
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re managing your own Postgres instance for some reason and running HA, pg_rewind could become especially handy. Typically to spin up replication you have to first download the physical, also known as base, backup. Then you have to replay the Write-Ahead-Log or WAL–so it&amp;rsquo;s up to date then you actually flip on replication.&lt;/p&gt;
&lt;p&gt;Typically with databases when you fail over you shoot the other node in the head or &lt;a href="https://en.wikipedia.org/wiki/STONITH"&gt;STONITH&lt;/a&gt;. This means just get rid of it, completely throw it out. This is still a good practice, so bring it offline, make it inactive, but from there now you could then flip it into a mode and use pg_rewind. This could save you pulling down lots and lots of data to get a replica back up once you have failed over.&lt;/p&gt;
&lt;h3 id="upsert"&gt;
&lt;div&gt;
Upsert
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Upsert of course will be the highlight of Postgres 9.5. I already talked about it some when &lt;a href="http://www.craigkerstiens.com/2015/05/08/upsert-lands-in-postgres-9.5/"&gt;it initially landed&lt;/a&gt;. The short of it is, if you&amp;rsquo;re inserting a record and there&amp;rsquo;s a conflict, you can choose to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do nothing&lt;/li&gt;
&lt;li&gt;Do some form of update&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Essentially this will let you have the typically experience of create or update that most frameworks provide but without a potential race condition of incorrect data.&lt;/p&gt;
&lt;h3 id="jsonb-pretty"&gt;
&lt;div&gt;
JSONB pretty
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s a few updates &lt;a href="https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.5#JSONB-modifying_operators_and_functions"&gt;to JSONB&lt;/a&gt;. The one I&amp;rsquo;m most excited about is making JSONB output in psql read much more legibly.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve got a JSONB field just give it a try with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT jsonb_pretty(jsonb_column)
FROM foo;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="give-it-a-try"&gt;
&lt;div&gt;
Give it a try
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Just in time for the new year &lt;a href="http://www.postgresql.org/about/news/1631/"&gt;the RC is ready&lt;/a&gt; and you can get hands on with it. Give it a try, and if there&amp;rsquo;s more you&amp;rsquo;d like to hear about Postgres please feel free to drop me a note &lt;a href="mailto:craig.kerstiens@gmail.com"&gt;craig.kerstiens@gmail.com&lt;/a&gt;.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Sun, 27 Dec 2015 22:55:56 GMT</pubDate><guid isPermaLink="true">/2015/12/27/Postgres-9.5-The-feature-rundown/</guid></item><item><title>Joel Califa: Product Design Lead at Digital Ocean</title><link>https://solomon.io/joel-califa-product-design-lead-at-digital-ocean/</link><description>How can companies build great design teams and what do those teams look like?</description><author>Sam Solomon</author><pubDate>Sun, 27 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/joel-califa-product-design-lead-at-digital-ocean/</guid></item><item><title>Going from blog posts to full launches</title><link>/2015/12/26/Going-from-blog-posts-to-full-launches/</link><description>&lt;p&gt;I recall extremely early stage where you&amp;rsquo;d build a feature, realize it was awesome, then the next day write a blog post for it. At some point you start to move from that to more coordinated launches. A larger coordinated launch allows you to reach a bigger audience, can lead to bigger deals, and help expand your overall market. But perhaps more importantly by the time you hit full launch you&amp;rsquo;ve message tested and ensured it&amp;rsquo;s going to resonate in the way you expect.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The process itself will both help amplify and validate/refine your message&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is often a more gradual process than a sudden single change, you&amp;rsquo;ll introduce new parts of this in time. And for many what an entire launch process looks like comes by trial an error, to help shorten that learning curve here&amp;rsquo;s key areas I pay attention for a launch and process followed by a rough timeline.&lt;/p&gt;
&lt;h3 id="product-first"&gt;
&lt;div&gt;
Product first
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Making sure the product is in the right shape is key to any big launch. You don&amp;rsquo;t get a second shot and if the product isn&amp;rsquo;t in shape customers often won&amp;rsquo;t take a second look at it later. For this reason I strongly prefer to have your product locked and loaded before you even start talking launch times, or at least be in the bug clean up phase. This means you&amp;rsquo;ve built a feature, validated with alpha users or private beta, and are ready to open it up to the world.&lt;/p&gt;
&lt;p&gt;If you have to set a launch date without the product or feature being already done allow padding. Sometimes it&amp;rsquo;s good for the team to know the padding, sometimes it isn&amp;rsquo;t. When you have extra time it&amp;rsquo;s not uncommon for your development to magically consume exactly that amount of time and still result in a small scramble towards the end.&lt;/p&gt;
&lt;p&gt;A good driver I&amp;rsquo;ve found is needing to have it fully like to demo a few weeks out from the launch itself, such as during &lt;a href=""&gt;analyst pre-briefings&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="crafting-your-message"&gt;
&lt;div&gt;
Crafting your message
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Every launch is an opportunity to tell your core message and value prop. If you miss this opportunity for focusing on a single narrow feature you&amp;rsquo;ve missed the biggest opportunity you had in a launch. You can&amp;rsquo;t relaunch your full product every time though–you do need some big improvements or feature that you can highlight, but you should still hit your core message.&lt;/p&gt;
&lt;p&gt;First you should know that your feature solves some specific problem, you should know this from the alpha/beta testing and if it doesn&amp;rsquo;t solve this problem &lt;a href="/2014/08/13/when-to-ship-when-to-kill/"&gt;you&amp;rsquo;re not ready to launch&lt;/a&gt;. Yes, some people will launch a product before the product is completely there–this is common in a marketing driven company as opposed to a product/engineering driven company.&lt;/p&gt;
&lt;p&gt;Your message should lead with the problem you&amp;rsquo;re solving, not the laundry list of features. The best launches lead with some broader thematic message, even better if it&amp;rsquo;s an altruistic world changing one. A rough example of this:&lt;/p&gt;
&lt;p&gt;To the point to the product, and probably over generalized as boring:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connectify brings a new way of taking your dumb devices at home and turning them into intelligent connected devices.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In contrast, broad thematic message, followed lightly by the product.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We live in a connected world, and with new connected devices there&amp;rsquo;s the opportunity not just give you more data but help you improve how you live your life. Connectify helps you at bringing the devices that matter together with ease.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="testing-your-message"&gt;
&lt;div&gt;
Testing your message
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;You should treat your message just like a product, testing it gradually along the way. Once you&amp;rsquo;ve got some initial framing of it, test it internally, then with friendly customers or community members. Leading up to the launch I usually have a timeline and get all the content and communication rolling about 3 weeks out. I&amp;rsquo;ll give a bit of a timeline below but first some more around message testing&lt;/p&gt;
&lt;h4 id="analysts"&gt;
&lt;div&gt;
Analysts
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;If you regularly use &lt;a href="/2015/07/25/A-guide-to-analyst-relations-for-startups/"&gt;any analysts&lt;/a&gt; you should absolutely use them to help with a launch. Several weeks out is a great time to test key messages with them, get feedback, and if you&amp;rsquo;re lucky you may even get them to provide a quote for the launch.&lt;/p&gt;
&lt;p&gt;Keep in mind here a inquiry is an opportunity to test your message and get feedback. You should talk roughly half of the time here, they should be talking the other half. In contrast briefings before launch you should have your message fully baked and should simply be pitching your message and possibly demo-ing.&lt;/p&gt;
&lt;h4 id="friendlies"&gt;
&lt;div&gt;
Friendlies
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;This may be more contentious, but at least at early stage sharing drafts with friendly community members is a great way to get feedback and refine your message. Here you should be especially concious of the request of their time and expect to have some delay before they get back to you. Being top secret about your message ahead of time won&amp;rsquo;t add much value to it being a home run, where as better ensuring it resonates will help it to be more successful.&lt;/p&gt;
&lt;h4 id="customers"&gt;
&lt;div&gt;
Customers
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Customers I call out as a separate bucket. Customers have less incentive to leak your news than friendlies, but also fall somewhere on the other spectrum of analysts. A key piece about customers is there is an opportunity for them to be a launch partner. And so on to that topic:&lt;/p&gt;
&lt;h3 id="launch-partners"&gt;
&lt;div&gt;
Launch partners
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Press and others like seeing and knowing you have external validation. Similarly many see the benefit of being part of a launch, after all it&amp;rsquo;s more free press for them. For a launch partner there are various levels, though for most providing some quote is a pretty common level.&lt;/p&gt;
&lt;p&gt;The best way to do this is talk to them about what they like about the feature/product and take a first stab at the quote for them from their feedback. Some may very much want to wordsmith their own which is fine, but minimizing the work required of them while–trying to hit something they&amp;rsquo;d say as well–as a message that flows can best be done by you taking a first pass.&lt;/p&gt;
&lt;p&gt;Further there&amp;rsquo;s varying levels of value with quotes and references. In descending order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Customers&lt;/li&gt;
&lt;li&gt;Analysts&lt;/li&gt;
&lt;li&gt;Community Members&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="the-other-details"&gt;
&lt;div&gt;
The other details
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;During launch week I mostly want to be dotting i&amp;rsquo;s and crossing t&amp;rsquo;s, meaning: I want the product done. I want documentation done. I want the blog post finalized. I want to be in the mode of send internal announcements, prep internal teams, talk to media.&lt;/p&gt;
&lt;h4 id="prepping-internal-teams"&gt;
&lt;div&gt;
Prepping internal teams
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Obviously the engineering and product people involved will be in the loop. But you need to notify many others some of which should have been in the loop already, some less so:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support - There&amp;rsquo;s a new product surface area, support should be top of your list so they can field the tickets and questions that come in&lt;/li&gt;
&lt;li&gt;Sales - Even if there is no price change or impact, new features allow sales to communicate value to customers&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="timeline"&gt;
&lt;div&gt;
Timeline
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Finally what&amp;rsquo;s the end to end timeline look like with all the little details. Here&amp;rsquo;s a rough one that&amp;rsquo;s fully built out. IF you&amp;rsquo;re smaller and don&amp;rsquo;t have a regular cadence of analysts in hand then just expect that doesn&amp;rsquo;t apply. IF your support team is the product and engineers maybe that&amp;rsquo;s lighter weight. Basically feel free to take out parts, but expect your process to grow to something of this size.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 weeks out - Outline of blog post with key messages&lt;/li&gt;
&lt;li&gt;Test that outline internally&lt;/li&gt;
&lt;li&gt;3 weeks out - Start to get a rough draft in place&lt;/li&gt;
&lt;li&gt;3 weeks out - Share internally and with friendlies. At this point you&amp;rsquo;re explicitely looking for message feedback. Tell people to not waste time on nitpicks of words or grammar, it will be 98% re-written by the time you&amp;rsquo;re done&lt;/li&gt;
&lt;li&gt;2.5 weeks out - Analyst inquiries for message testing&lt;/li&gt;
&lt;li&gt;2.5 weeks out - Start putting together product demo&lt;/li&gt;
&lt;li&gt;2 weeks out - Start putting together documentation&lt;/li&gt;
&lt;li&gt;2 weeks out - Start nailing down blog post for final messages&lt;/li&gt;
&lt;li&gt;1 weeks out - Start to put final touches on blog post for grammar&lt;/li&gt;
&lt;li&gt;1 week out - Analyst briefings&lt;/li&gt;
&lt;li&gt;1 week out - Update support&lt;/li&gt;
&lt;li&gt;3-5 days out - Stage blog post&lt;/li&gt;
&lt;li&gt;3-5 days out - Stage new documentation&lt;/li&gt;
&lt;li&gt;2-4 days out - Make sure PRs are ready or feature flags, in short the switch is there or live but not public&lt;/li&gt;
&lt;li&gt;1-3 days out - Update sales&lt;/li&gt;
&lt;li&gt;1-3 days out - Interall communication to all@&lt;/li&gt;
&lt;li&gt;1-3 days out - Media briefings&lt;/li&gt;
&lt;li&gt;LAUNCH DAY - Sit in a room and watch all the things, engage with twitter/HN/etc.&lt;/li&gt;
&lt;/ul&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Sat, 26 Dec 2015 22:55:56 GMT</pubDate><guid isPermaLink="true">/2015/12/26/Going-from-blog-posts-to-full-launches/</guid></item><item><title>App Use: Keezy Drummer</title><link>https://rjp.is/blogging/posts/app-use-keezy-drummer-2/</link><description>A quick noodle with Keezy Drummer recorded into the Zoom H4n, exported to Fission, then piped through Audio Hijack with the right channel duplicated into the left before saving to MP3.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 17:47:08 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-keezy-drummer-2/</guid></item><item><title>Janathon, Dryathlon, Jamathon</title><link>https://rjp.is/blogging/posts/janathon-dryathon-jamathon-2-2/</link><description>And a partridge in a pear tree. Signed up for Janathon (updates will probably be here).
Signed up for Dryathlon (Sponsor me!).
Decided to do an ad-hoc Jamathon (&amp;ldquo;Make and upload some musical output every day using one or two mobile apps&amp;rdquo;).
(Yes, I&amp;rsquo;m going to be insufferable all month.)</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 16:04:49 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/janathon-dryathon-jamathon-2-2/</guid></item><item><title>Monty Python and the Holy Grail</title><link>https://olshansky.info/movie/monty_python_and_the_holy_grail/</link><description>Olshansky's review of Monty Python and the Holy Grail</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 26 Dec 2015 13:55:24 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/monty_python_and_the_holy_grail/</guid></item><item><title>App Use: Audioshare</title><link>https://rjp.is/blogging/posts/app-use-audioshare-2/</link><description>Not strictly a music-making app, [Audioshare] gets used for almost all of the things I upload to Soundcloud.
But since I managed to accidentally make some &amp;ldquo;music&amp;rdquo; with it, I might as well blog about it (and steal the description from Soundcloud).
There I was, playing something I&amp;rsquo;d just made in Soundscaper through Audioshare via Audiobus into Gliderverb when I had the urge to record what was happening since it was sounding ok.</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 13:36:41 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-audioshare-2/</guid></item><item><title>App Use: TC-Performer</title><link>https://rjp.is/blogging/posts/app-use-tc-performer-2/</link><description>Like a 2D theremin on acid, TC-Performer has a bunch of instruments (all digitally synthed by TC-11 - which is on the wishlist) controlled by multi-touch, movement, etc.
Bit tricky to do coherent tunes but excellent for making this kind of swoopy droney chimey kind of space music.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 13:33:27 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-tc-performer-2/</guid></item><item><title>App Use: Poly</title><link>https://rjp.is/blogging/posts/app-use-poly-2/</link><description>Some learning-curve twiddling with Poly. Should be good for generating driving rhythms as underlying texture.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 13:29:35 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-poly-2/</guid></item><item><title>App Use: Fieldscaper</title><link>https://rjp.is/blogging/posts/app-use-fieldscaper-2/</link><description>Recorded 1:45 of tap filling a bath using Fieldscaper. Chopped out a decent 45s segment and mangled it three different ways to make a kind of weird Dr Who 1970s sci-fi noisefest.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 13:25:31 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-fieldscaper-2/</guid></item><item><title>Insomniac Art</title><link>https://rjp.is/blogging/posts/insomniac-art-2/</link><description>Or &amp;ldquo;half an hour spent twiddling with various graphics apps on an iPhone whilst unable to sleep&amp;rdquo;.
(Lots of 512x512 images make this a big post.)
The original image Southwark Park, 2015-12-19, near the south-east gate, looking south-west.
Waterlogue &amp;ldquo;Vibrant, medium, Auto&amp;rdquo;.
BLACK &amp;ldquo;P400, Tura expired 2002&amp;rdquo;
BLACK plus Waterlogue Combination of the last two.
Decim8 These were all done via the random settings button.
Etchings plus Union plus Pixlr Etchings was used to create a few variants of the BLACK version which where then combined in Union before being tweaked in Pixlr.</description><author>infrequent oscillations</author><pubDate>Sat, 26 Dec 2015 13:06:09 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/insomniac-art-2/</guid></item><item><title>Pi-Hole for Ubuntu 14.04</title><link>https://boyter.org/2015/12/pi-hole-ubuntu-14-04/</link><description>&lt;p&gt;Because of the fact that I personally work for an ad supported company and that searchcode.com is currently supported via third party advertising I tend to keep an eye on the state of ad blockers on the web.&lt;/p&gt;
&lt;p&gt;Most people probably know about adblockplus and other browser extensions however there are other ways to block ad&amp;rsquo;s on ones network. One that I had previously read about was setting up your own Bind9 server on a server and adding custom rules to block them at a DNS level. Other the last week I had been playing around with this but since I am not a bind expert I was unable to get it working in a satisfactory way.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sat, 26 Dec 2015 04:24:32 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/12/pi-hole-ubuntu-14-04/</guid></item><item><title>Indian startups ecosystem: Fear of failure grounds our success story</title><link>https://nadh.in/blog/fear-of-success-grounds-failure/</link><description>&lt;p&gt;The Indian startup ecosystem has taken shape and exploded in the last few years, and so have the countless stories surrounding them. Unsurprisingly, lessons of unsuccessful ideas and attempts haven’t gotten as much precedence as successful counterparts.&lt;/p&gt;</description><author>Blog on Kailash Nadh / Personal homepage</author><pubDate>Sat, 26 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nadh.in/blog/fear-of-success-grounds-failure/</guid></item><item><title>Clojure bookmarks</title><link>https://xenodium.com/clojure-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch"&gt; Clojure in Emacs from absolute zero &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://swannodette.github.io/2015/12/23/year-in-review/"&gt;2015 in review&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.clojurestacks.com/misc/2018/05/06/a-call-for-clojure-stacks.html"&gt;A call for Clojure stacks · Clojure Stacks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nrepl/nrepl"&gt;GitHub - nrepl/nrepl: A Clojure network REPL that provides a server and client, along with some common APIs of use to IDEs and other tools that may need to evaluate Clojure code in remote environments&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whatacold.io/blog/2024-12-22-getting-started-with-cider/"&gt;Getting Started with Cider for Clojure Programming - Blog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 25 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/clojure-bookmarks</guid></item><item><title>William Channer: Host of DRT, Founder of Panda</title><link>https://solomon.io/william-channer-host-of-drt-founder-of-panda/</link><description>William Channer is a partner at the Panda Network, and the host of Dorm Room Tycoon.</description><author>Sam Solomon</author><pubDate>Fri, 25 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/william-channer-host-of-drt-founder-of-panda/</guid></item><item><title>Shine a Spotlight On Those Photos</title><link>https://blog.nawaz.org/posts/2015/Dec/shine-a-spotlight-on-those-photos/</link><description>&lt;p&gt;A nearby photography club has annual county wide competitions. The judges
select their favorite photos and display them in a mall for a&amp;nbsp;month.&lt;/p&gt;
&lt;p&gt;Several years ago, I took a friend to the mall to show him the
photos. We had only a few minutes until closing time, and they …&lt;/p&gt;</description><author>Beetle Space</author><pubDate>Thu, 24 Dec 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.nawaz.org/posts/2015/Dec/shine-a-spotlight-on-those-photos/</guid></item><item><title>Baby steps with `libclang`: Walking an abstract syntax tree</title><link>https://bastian.rieck.me/blog/2015/baby_steps_libclang_ast/</link><description>&lt;p&gt;Recently, I wanted to parse some C++ code to collect some information
about my coding style. As always with C++, this turned out to require
more effort than I had originally anticipated. Apparently, C++ is so
complex that you require more or less a compiler to parse it. The great
folks at the LLVM project had already done the work—a stroke of
luck for me.&lt;/p&gt;
&lt;p&gt;So I set out to use &lt;code&gt;clang&lt;/code&gt; for parsing C++ code. &lt;a href="http://clang.llvm.org/docs/Tooling.html"&gt;The official
documentation&lt;/a&gt; lists multiple
options here. While &lt;code&gt;LibTooling&lt;/code&gt;, a C++ interface to &lt;code&gt;clang&lt;/code&gt;, would
arguably have been the more appropriate choice, I settled for
&lt;code&gt;libclang&lt;/code&gt;, a C interface. Its main advantage is its &lt;em&gt;stability&lt;/em&gt;. The
LLVM developers are very reluctant to introduce breakages
here (although they have been known to happen). The disadvantage of
&lt;code&gt;libclang&lt;/code&gt; is that we do not get full control over the abstract syntax
tree (AST) of the program. I can live with that, I guess.&lt;/p&gt;
&lt;p&gt;In this post, I only want to briefly introduce some basic concepts of
&lt;code&gt;libclang&lt;/code&gt;. I hope to show off more features in subsequent posts.&lt;/p&gt;
&lt;h1 id="dumping-an-ast"&gt;Dumping an AST&lt;/h1&gt;
&lt;p&gt;Suppose you have the following simple C++ snippet:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Just like any compiler, &lt;code&gt;clang&lt;/code&gt; creates an &lt;em&gt;abstract syntax tree&lt;/em&gt; that
represents the code we want to compile. The syntax of this AST resembles
the written code very closely, which makes this a very interesting view
on your code.&lt;/p&gt;
&lt;p&gt;To show the AST of the previous snippet, we can &lt;code&gt;clang&lt;/code&gt; with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;clang -Xclang -ast-dump -fsyntax-only foo.cc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This results in the following output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TranslationUnitDecl 0x2fef1b0 &amp;lt;&amp;lt;invalid sloc&amp;gt;&amp;gt; &amp;lt;invalid sloc&amp;gt;
|-TypedefDecl 0x2fef6f0 &amp;lt;&amp;lt;invalid sloc&amp;gt;&amp;gt; &amp;lt;invalid sloc&amp;gt; implicit __int128_t '__int128'
|-TypedefDecl 0x2fef750 &amp;lt;&amp;lt;invalid sloc&amp;gt;&amp;gt; &amp;lt;invalid sloc&amp;gt; implicit __uint128_t 'unsigned __int128'
|-TypedefDecl 0x2fefb10 &amp;lt;&amp;lt;invalid sloc&amp;gt;&amp;gt; &amp;lt;invalid sloc&amp;gt; implicit __builtin_va_list '__va_list_tag [1]'
`-FunctionTemplateDecl 0x2fefdc0 &amp;lt;foo.cc:1:1, line:4:1&amp;gt; line:1:25 f
  |-TemplateTypeParmDecl 0x2fefb60 &amp;lt;col:11, col:17&amp;gt; col:17 referenced class T
  `-FunctionDecl 0x2fefd20 &amp;lt;col:20, line:4:1&amp;gt; line:1:25 f '_Bool (T)'
    |-ParmVarDecl 0x2fefc20 &amp;lt;col:28, col:30&amp;gt; col:30 referenced x 'T'
    `-CompoundStmt 0x2fefea0 &amp;lt;line:2:1, line:4:1&amp;gt;
      `-ReturnStmt 0x2fefe80 &amp;lt;line:3:3, col:14&amp;gt;
        `-BinaryOperator 0x2fefe58 &amp;lt;col:10, col:14&amp;gt; '&amp;lt;dependent type&amp;gt;' '%'
          |-DeclRefExpr 0x2fefe10 &amp;lt;col:10&amp;gt; 'T' lvalue ParmVar 0x2fefc20 'x' 'T'
          `-IntegerLiteral 0x2fefe38 &amp;lt;col:14&amp;gt; 'int' 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The important thing to note is that we have a &lt;code&gt;FunctionTemplateDecl&lt;/code&gt;
node that contains, among others, the body of the
function (starting from the &lt;code&gt;CompoundStmt&lt;/code&gt; node).&lt;/p&gt;
&lt;p&gt;To familiarize ourselves with &lt;code&gt;libclang&lt;/code&gt;, let’s try to reproduce
parts of this AST ourselves. I propose writing a program that walks the
AST and prints out node names.&lt;/p&gt;
&lt;p&gt;First, we need to get &lt;code&gt;clang&lt;/code&gt; to emit the AST in a binary format so that
we traverse it later:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;clang++ -emit-ast foo.cc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This should result in a file &lt;code&gt;foo.ast&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id="reading-an-ast-with-libclang"&gt;Reading an AST with &lt;code&gt;libclang&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;Understanding &lt;code&gt;libclang&lt;/code&gt; requires reading copious amounts of
&lt;a href="http://clang.llvm.org/doxygen/group__CINDEX.html"&gt;documentation&lt;/a&gt;.
I cannot claim in good conscience that I have fully understood and
memorized every detail, so the code that follows may actually be very
stupid.&lt;/p&gt;
&lt;p&gt;One of the core functions of &lt;code&gt;libclang&lt;/code&gt; is the creation of an &lt;em&gt;index&lt;/em&gt;.
This data structure contains multiple translation units, e.g. source
files, that make up an executable. Given an index, a new &lt;em&gt;translation
unit&lt;/em&gt; can be created. There are various ways of doing this. It it
possible to parse source code directly. For now, I will only present
a way of parsing a dumped AST. Last, we need a &lt;em&gt;cursor&lt;/em&gt;, which is the
&lt;code&gt;libclang&lt;/code&gt; term for &lt;em&gt;a thing that keeps track of where we are in the
AST&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The following snippet will create the required things for us and permit
further parsing (for the hasty: scroll to the bottom for the
complete example code):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;clang-c/Index.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXIndex&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_createIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXTranslationUnit&lt;/span&gt; &lt;span class="n"&gt;tu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_createTranslationUnit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;tu&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXCursor&lt;/span&gt; &lt;span class="n"&gt;rootCursor&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getTranslationUnitCursor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;tu&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_disposeTranslationUnit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;tu&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_disposeIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This program will attempt to load a translation unit from an &lt;code&gt;.ast&lt;/code&gt;
file, get a cursor to the root node, and exit. The only noteworthy thing
are the two &lt;code&gt;_dispose&lt;/code&gt; calls at the end of the function. This is due to
&lt;code&gt;libclang&lt;/code&gt; being a C library—we actually need to think about
memory management here. Darn.&lt;/p&gt;
&lt;h1 id="visiting-nodes"&gt;Visiting nodes&lt;/h1&gt;
&lt;p&gt;To make the example application marginally more useful, we need to make
use of the &lt;a href="https://en.wikipedia.org/wiki/Visitor_pattern"&gt;&amp;ldquo;visitor pattern&amp;rdquo;&lt;/a&gt;.
&lt;code&gt;libclang&lt;/code&gt; requires us to specify a sort of callback function that is
called whenever we reach a node in the AST.&lt;/p&gt;
&lt;p&gt;The function needs to have the following signature:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CXChildVisitResult visitor( CXCursor cursor, CXCursor parent, CXClientData clientData )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The result of the function decides how the traversal is being continued.
Possibilities include &lt;code&gt;CXChildVisit_Break&lt;/code&gt; to stop traversal,
&lt;code&gt;CXChildVisit_Continue&lt;/code&gt; to continue traversing the siblings of the
current cursor without visiting its children, or &lt;code&gt;CXChildVisit_Recurse&lt;/code&gt;
to visit the children of the current cursor first. &lt;code&gt;cursor&lt;/code&gt; refers to
the current position in the tree. &lt;code&gt;parent&lt;/code&gt; is the parent node in the
tree. Last, &lt;code&gt;CXClientData&lt;/code&gt; is a typedef for &amp;lsquo;&lt;code&gt;void*&lt;/code&gt; (a,
don’t you love C as much as I do?) and permits passing additional
information for each traversal. We will soon figure out a way of using
this to our advantage.&lt;/p&gt;
&lt;p&gt;The main entry point for visiting nodes is the &lt;code&gt;clang_visitChildren&lt;/code&gt;
function. Assuming that we have set up a function &lt;code&gt;visitor&lt;/code&gt; with the proper prototype, we may add the following lines after &lt;code&gt;rootCursor&lt;/code&gt; has been assigned:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;treeLevel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;clang_visitChildren&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;rootCursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                     &lt;span class="n"&gt;visitor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                     &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;treeLevel&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will call our visitor function with client data that initially
refers to the upper-most level in the tree. A potential implementation for &lt;code&gt;visitor&lt;/code&gt; could look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CXChildVisitResult&lt;/span&gt; &lt;span class="nf"&gt;visitor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;CXCursor&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CXCursor&lt;/span&gt; &lt;span class="cm"&gt;/* parent */&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CXClientData&lt;/span&gt; &lt;span class="n"&gt;clientData&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXSourceLocation&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;clang_Location_isFromMainFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;CXChildVisit_Continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXCursorKind&lt;/span&gt; &lt;span class="n"&gt;cursorKind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorKind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;curLevel&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;clientData&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;nextLevel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curLevel&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;curLevel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'-'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;getCursorKindName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;cursorKind&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" ("&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;getCursorSpelling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;")&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_visitChildren&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                       &lt;span class="n"&gt;visitor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                       &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;nextLevel&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;CXChildVisit_Continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The visitor uses some interesting functions. First, we use
&lt;code&gt;clang_getCursorLocation()&lt;/code&gt; to get the location of the cursor with
respect to the source file. This permits mapping a cursor, i.e. a region
in a tree, to a region in the source file. We use it for a far simpler
purpose, though. By calling &lt;code&gt;clang_Location_isFromMainFile()&lt;/code&gt;, we can
check whether a node is part of the source file we are analysing or
not. This is extremely helpful for skipping over nodes that are not
interesting for us because they appear in the AST after an &lt;code&gt;#include&lt;/code&gt;,
for example. As you can see, we skip over the subtree rooted at the
current cursor when such a node has been reached.&lt;/p&gt;
&lt;p&gt;The next interesting thing is the &lt;code&gt;clang_getCursorKind&lt;/code&gt;. This yields the
&lt;em&gt;type&lt;/em&gt; of the cursor, giving us information about whether it refers to
a statement, a function declaration, or what have you. To see all
types (or rather &lt;em&gt;kinds&lt;/em&gt;) that are available, please take a look at
the &lt;code&gt;Index.h&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Having obtained information about the type of the cursor, we get
information about our current level, using a &lt;code&gt;reinterpret_cast&lt;/code&gt;. We then
call two auxiliary functions that give us the &lt;em&gt;name&lt;/em&gt; and &lt;em&gt;spelling&lt;/em&gt; of
the cursor (see below for whole code). By &lt;em&gt;spelling&lt;/em&gt;, &lt;code&gt;libclang&lt;/code&gt;
means the name of the entity the cursor refers to. When positioned at
the root node of a function declaration, the cursor spelling will be the
name of the function, for example. Not all entities have
a spelling—for some, we need to &lt;em&gt;tokenize&lt;/em&gt; the node first. For
reasons of simplicity, I am going to cover this in a later post, though.&lt;/p&gt;
&lt;p&gt;The last interesting thing is the continued traversal within the visitor
function. We call &lt;code&gt;clang_visitChildren&lt;/code&gt; on the current cursor, with the
updated level information. Thus, all children of the current cursor will
eventually be visited. Last, we return &lt;code&gt;CXChildVisit_Continue&lt;/code&gt;. This
ensures that we do not visit the children of a particular node twice.&lt;/p&gt;
&lt;p&gt;The output of this simple program when being applied to &lt;code&gt;foo.ast&lt;/code&gt; is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; FunctionTemplate (f)
- TemplateTypeParameter (T)
- ParmDecl (x)
-- TypeRef (T)
- CompoundStmt ()
-- ReturnStmt ()
--- BinaryOperator ()
---- DeclRefExpr (x)
---- IntegerLiteral ()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Which is nice for just about 50 lines of code in total. As promised, not
all entities have names here, but the ones that do seem to make sense.&lt;/p&gt;
&lt;h1 id="the-complete-code"&gt;The complete code&lt;/h1&gt;
&lt;p&gt;Here’s the complete code of this example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;clang-c/Index.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;getCursorKindName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;CXCursorKind&lt;/span&gt; &lt;span class="n"&gt;cursorKind&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXString&lt;/span&gt; &lt;span class="n"&gt;kindName&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorKindSpelling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursorKind&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;kindName&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_disposeString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;kindName&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;getCursorSpelling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;CXCursor&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXString&lt;/span&gt; &lt;span class="n"&gt;cursorSpelling&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorSpelling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursorSpelling&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_disposeString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursorSpelling&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CXChildVisitResult&lt;/span&gt; &lt;span class="nf"&gt;visitor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;CXCursor&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CXCursor&lt;/span&gt; &lt;span class="cm"&gt;/* parent */&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CXClientData&lt;/span&gt; &lt;span class="n"&gt;clientData&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXSourceLocation&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;clang_Location_isFromMainFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;CXChildVisit_Continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXCursorKind&lt;/span&gt; &lt;span class="n"&gt;cursorKind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getCursorKind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;curLevel&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;clientData&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;nextLevel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;curLevel&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;curLevel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'-'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;getCursorKindName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;cursorKind&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" ("&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;getCursorSpelling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;")&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_visitChildren&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                       &lt;span class="n"&gt;visitor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                       &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;nextLevel&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;CXChildVisit_Continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXIndex&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_createIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXTranslationUnit&lt;/span&gt; &lt;span class="n"&gt;tu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_createTranslationUnit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;tu&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;CXCursor&lt;/span&gt; &lt;span class="n"&gt;rootCursor&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clang_getTranslationUnitCursor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;tu&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;treeLevel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_visitChildren&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;rootCursor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;visitor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;treeLevel&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_disposeTranslationUnit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;tu&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clang_disposeIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I am releasing the code into the public domain. Don’t forget to
link against &lt;code&gt;libclang&lt;/code&gt; when compiling it (subsequent posts will
provide a find module for &lt;code&gt;CMake&lt;/code&gt;). Should you consider this code
useful, it would give me enormous pleasure if you were to drop me an
e-mail.&lt;/p&gt;
&lt;p&gt;To show that this would be worth your while, I am pointing out an
interesting part in the code above: In the &lt;code&gt;getCursorKindName()&lt;/code&gt;
function, we use &lt;code&gt;clang_getCursorKindSpelling()&lt;/code&gt; to obtain the name of
the type the current cursor refers to. This is a &lt;code&gt;CXString&lt;/code&gt;, which needs
to be disposed later on with &lt;code&gt;clang_disposeString()&lt;/code&gt; so as not to cause
any memory leaks. To use the string as a regular C++ string, we need to
call the helper function &lt;code&gt;clang_getCString&lt;/code&gt;, which returns
a null-terminated C string (i.e. a &lt;code&gt;const char*&lt;/code&gt;, which we may
finally assign to an &lt;code&gt;std::string&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Wishing you a happy tree traversal! Maybe &lt;code&gt;clang&lt;/code&gt; hides some gifts in the AST…&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Wed, 23 Dec 2015 19:04:29 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/baby_steps_libclang_ast/</guid></item><item><title>Surprises with Java packages</title><link>https://danielpecos.com/2015/12/23/surprises-with-java-packages/</link><description>&lt;p&gt;Packages in Java is a quite simple and straightforward concept of the language. It’s there from the beginning and it’s commonly used by every Java programmer. In a few words, these are the rules you have to follow to create a class inside a package (spoiler: which are not completely true, as we’ll see later):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Package statement must be the first one specified in a java class file&lt;/li&gt;
&lt;li&gt;A package namespace must match the physical path of the file, i.e a class defined with a package &lt;code class="highlighter-rouge"&gt;a.b.c&lt;/code&gt; must be placed in a path &lt;code class="highlighter-rouge"&gt;a/b/c/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Easy right? Let’s check…&lt;/p&gt;
&lt;p&gt;Turns out that the second rule is not mandatory but a recommendation (a good one, BTW), but Eclipse IDE enforces it to the point that if you don’t follow it, it throws a compilation error. Let’s open the following class in Eclipse:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;package a.b.c;

public class HelloWorld {
 public static void main(String[] args) {
   System.out.println("Hello world!");
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And you’ll get the following error:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Eclipse error with package statement" src="https://danielpecos.com/assets/2015/12/eclipse_error.png" /&gt;&lt;/p&gt;
&lt;p&gt;But as I said, it’s not a restriction of the language but from the IDE itself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=16209"&gt;https://bugs.eclipse.org/bugs/show_bug.cgi?id=16209&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/8395916/package-name-is-different-than-the-folder-structure-but-still-java-code-compiles"&gt;http://stackoverflow.com/questions/8395916/package-name-is-different-than-the-folder-structure-but-still-java-code-compiles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In fact, turns out that manually compiling this class works perfectly fine (also tried maven and worked flawesly):&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ javac src/HelloWorld.java -d bin

$ java -cp bin a.b.c.HelloWorld
Hello world!

$ tree bin/
bin/
└── a
    └── b
        └── c
            └── HelloWorld.class
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Corollary: if you’re a programmer, don’t trust even the most basic and accepted statement you could think of. Even if you’re absolutely right at this very moment, it will eventually be modified and surprise you.&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Wed, 23 Dec 2015 17:30:00 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2015/12/23/surprises-with-java-packages/</guid></item><item><title>App Use: Soundscaper</title><link>https://rjp.is/blogging/posts/app-use-soundscaper-2/</link><description>The samples from Disquiet Junto 0207 soundscaped using the excellent SoundScaper (mostly) controlled by a KORG nanoKONTROL2.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Wed, 23 Dec 2015 11:30:52 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-soundscaper-2/</guid></item><item><title>App Use: Phase Rings, Dedalus</title><link>https://rjp.is/blogging/posts/app-use-phase-rings-dedalus-2/</link><description>A simple bit of noodling in Phase Rings (I think it was a Mixolydian scale but I can&amp;rsquo;t remember now - Always Takes Notes At The Time, Kids) through Dedalus for some texture.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Wed, 23 Dec 2015 11:25:31 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-phase-rings-dedalus-2/</guid></item><item><title>App Use: Patterning, Dedalus</title><link>https://rjp.is/blogging/posts/app-use-patterning-dedalus-2/</link><description>A simple drum loop in Patterning filtered through Dedalus whilst I scrub through the various options to see what kind of aural mess I can make (hint: &amp;ldquo;A big one&amp;rdquo;). Good learning experience though.
Listen on Soundcloud</description><author>infrequent oscillations</author><pubDate>Wed, 23 Dec 2015 11:18:45 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-patterning-dedalus-2/</guid></item><item><title>Links - December 22nd, 2015</title><link>https://faingezicht.com/links/2015/12/22/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 22 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/12/22/links/</guid></item><item><title>Luigi review</title><link>https://bytepawn.com/luigi.html</link><description>&lt;p&gt;I review Luigi, an execution framework for writing data pipes in Python code. It supports task-task dependencies, it has a simple central scheduler with an HTTP API and an extensive library of helpers for building data pipes for Hadoop, AWS, Mysql etc. It was written by Spotify for internal use and open sourced in 2012. A number of companies use it, such as Foursquare, Stripe, Asana.&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Tue, 22 Dec 2015 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/luigi.html</guid></item><item><title>Cargo Cult Data</title><link>https://bytepawn.com/cargo-cult-data.html</link><description>&lt;p&gt;Cargo cult data is when you're collecting and looking at data when making decisions, but you're only following the forms and outside appearances of scientific investigation and missing the essentials, so it doesn't work. &lt;br /&gt;&lt;br /&gt;&lt;img alt="Cargo cult data" src="/images/cargo_cult_data.jpg" style="width: 400px;" /&gt;&lt;/p&gt;</description><author>Bytepawn - Marton Trencseni</author><pubDate>Tue, 22 Dec 2015 01:00:00 GMT</pubDate><guid isPermaLink="true">https://bytepawn.com/cargo-cult-data.html</guid></item><item><title>The brain scope is growing: BrainHub, BrainRunners, Brains</title><link>https://liza.io/the-brain-scope-is-growing-brainhub-brainrunners-brains/</link><description>&lt;p&gt;I&amp;rsquo;ve been MIA for a while, I know. I haven&amp;rsquo;t stopped working on SnailLife - I just wanted to get to some sort of completion with the brain refactoring phase before talking about it. Now, however, I realize there won&amp;rsquo;t be any completion for a long while and I may as well post an update.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Mon, 21 Dec 2015 20:17:06 GMT</pubDate><guid isPermaLink="true">https://liza.io/the-brain-scope-is-growing-brainhub-brainrunners-brains/</guid></item><item><title>List of Awesomeness #4</title><link>https://rohitjha.com/blog/list-of-awesomeness-4/</link><description>&lt;p&gt;In this installation I won&amp;#x2019;t be providing any book or paper suggestions. Instead I will summarize some of my thoughts on the &lt;a href="http://web.archive.org/web/20181009085401/http://rohitjha.com/blog/list-of-awesomeness-3/"&gt;previous list&lt;/a&gt;.&lt;/p&gt;&lt;h1 id="papers"&gt;&lt;strong&gt;Papers&lt;/strong&gt;&lt;/h1&gt;&lt;p&gt;Not adding a new serious paper this week in order to give time to those who are still on Mr. Einstein&amp;#x2019;s&lt;/p&gt;</description><author>THINK@RJ</author><pubDate>Mon, 21 Dec 2015 17:07:00 GMT</pubDate><guid isPermaLink="true">https://rohitjha.com/blog/list-of-awesomeness-4/</guid></item><item><title>Disquiet Junto #207</title><link>https://rjp.is/blogging/posts/disquiet-junto-207-2/</link><description>Screenshots of my effort for the Disquiet Junto #207 challenge.
&amp;ldquo;M1 arpeggiated&amp;rdquo; - the underlying heavy drums &amp;ldquo;M2 bowed&amp;rdquo; - the gentle machine-like throbbing &amp;ldquo;M3 bowed&amp;rdquo; - the occasional background swell &amp;ldquo;M1 taped&amp;rdquo; - the initial drum-style intro &amp;ldquo;M2 arpeggiated&amp;rdquo; - extra texture &amp;ldquo;M3 shuffled&amp;rdquo; - the rolling trill (cf 2:40, 3:35)</description><author>infrequent oscillations</author><pubDate>Mon, 21 Dec 2015 14:30:15 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/disquiet-junto-207-2/</guid></item><item><title>Mac OS X tips backlog</title><link>https://xenodium.com/mac-os-x-tips-backlog</link><description>&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://tracesof.net/uebersicht/"&gt;Uebersicht: Keep an eye on what is happening on your machine and in the World&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://github.com/koekeishiya/kwm"&gt;Kwm: Tiling window manager with focus follows mouse for OSX&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;cp ~/homebrew/Cellar/kwm/1.1.3/homebrew.mxcl.kwm.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.kwm.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[DONE]{.done .DONE} Turn off shadows with &lt;a href="https://github.com/ocodo/ShadowToggle"&gt;ShadowToggle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://www.derlien.com"&gt;Disk Inventory X&lt;/a&gt;: disk usage utility for Mac.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 21 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/mac-os-x-tips-backlog</guid></item><item><title>Links - December 21st, 2015</title><link>https://faingezicht.com/links/2015/12/21/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 21 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/12/21/links/</guid></item><item><title>Search bash history with Emacs helm</title><link>https://xenodium.com/search-bash-history-with-emacs-helm</link><description>&lt;p&gt;Following up from &lt;a href="#change-emacs-shells-cwd-with-helm-projectile"&gt;changing CWD with helm projectile&lt;/a&gt;, here's a way to search your bash history with helm:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/search-bash-history-with-emacs-helm/helm-bash-history.gif" /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(defun ar/helm-helm (title candidates on-select-function)
  &amp;quot;Helm with TITLE CANDIDATES and ON-SELECT-FUNCTION.&amp;quot;
  (helm :sources `((name . ,title)
                   (candidates . ,candidates)
                   (action . ,on-select-function))
        :buffer &amp;quot;*helm-exec*&amp;quot;
        :candidate-number-limit 10000))

(defun ar/shell-send-command (command)
  &amp;quot;Send COMMAND to shell mode.&amp;quot;
  (assert (string-equal mode-name &amp;quot;Shell&amp;quot;) nil &amp;quot;Not in Shell mode&amp;quot;)
  (goto-char (point-max))
  (comint-kill-input)
  (insert command)
  (comint-send-input))

(defun ar/helm-shell-search-history ()
  &amp;quot;Narrow down bash history with helm.&amp;quot;
  (interactive)
  (assert (string-equal mode-name &amp;quot;Shell&amp;quot;) nil &amp;quot;Not in Shell mode&amp;quot;)
  (ar/helm-helm &amp;quot;bash history&amp;quot;
                (with-temp-buffer
                  (insert-file-contents &amp;quot;~/.bash_history&amp;quot;)
                  (reverse
                   (delete-dups
                    (split-string (buffer-string) &amp;quot;\n&amp;quot;))))
                #'ar/shell-send-command))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bonus: Replace existing M-r binding to use ar/helm-shell-search-history.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(bind-key &amp;quot;M-r&amp;quot; #'ar/helm-shell-search-history shell-mode-map)
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 20 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/search-bash-history-with-emacs-helm</guid></item><item><title>Medicine bookmarks</title><link>https://xenodium.com/medicine-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sciencebasedmedicine.org/"&gt;Science-Based Medicine – Exploring issues and controversies in science and technology&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 19 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/medicine-bookmarks</guid></item><item><title>View DICOM files from your X-ray</title><link>https://xenodium.com/view-dicom-files-from-your-x-ray</link><description>&lt;p&gt;Got a CD with my chest X-ray from the hospital. Was expecting a pdf or an image of sorts, but the CD content was rather different. For starters, it was targeted at Windows users (AUTORUN.INF, MediaViewerLauncher.EXE and a bunch of DLLs):&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-text"&gt;$ find . -exec file --mime-type '{}' \;

./AUTORUN.INF: text/plain
./DICOMDIR: application/dicom
./MediaViewerLauncher.EXE: application/octet-stream
...
./Libraries/BASEPRINTER.DLL: application/octet-stream
./Libraries/CDDATABURNER.DLL: application/octet-stream
./Libraries/COM.DLL: application/octet-stream
...
./Libraries/ACE.DLL: application/octet-stream
./Libraries/ACE_SSL.DLL: application/octet-stream
./Libraries/ATL90.DLL: application/octet-stream
...
./DICOM/PAT_0000: application/x-directory
./DICOM/PAT_0000/STD_0000/SER_0000/OBJ_0001/IM_0001: application/dicom
./DICOM/PAT_0000/STD_0000/SER_0001/OBJ_0001/ED_0001: application/dicom
./DICOM/PAT_0000/STD_0000/SER_0002/OBJ_0001/ED_0001: application/dicom
./Worklist/ClinicalInfo/067eccde-b299-e511-9114-005056ad3afe.mht: text/html
./Worklist/Report/067eccde-b299-e511-9114-005056ad3afe.mht: text/html
./Worklist/Worklist.wl: application/octet-stream
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I'm on a Mac, so most of these files were not useful to me. The more interesting files were IM_0001 and ED_0001 with &amp;quot;application/dicom&amp;quot; MIME type. &lt;a href="https://en.wikipedia.org/wiki/DICOM"&gt;DICOM&lt;/a&gt; files stand for Digital Imaging and Communications in Medicine. How to view these on a Mac? &lt;a href="http://www.osirix-viewer.com/Downloads.html"&gt;OsiriX viewer&lt;/a&gt; is an option. OsiriX, though on the heavy side (100.7MB download), it rendered the X-ray successfully.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/view-dicom-files-from-your-x-ray/2015-12-03-osirix-x-ray-small.png" /&gt;&lt;/p&gt;
&lt;p&gt;Unsurprisingly, ImageMagick's &lt;a href="http://www.imagemagick.org/script/convert.php"&gt;convert&lt;/a&gt; utility also handles DICOM files. Converting to PNG worked well.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ convert ./DICOM/PAT_0000/STD_0000/SER_0001/OBJ_0001/ED_0001 ED_0001.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/view-dicom-files-from-your-x-ray/2015-12-03-imagemagick-x-ray-small.png" /&gt;&lt;/p&gt;
&lt;p&gt;DICOM files also hold patient's metadata and optional reports. The file format is &lt;a href="http://cabiatl.com/mricro/dicom/index.html"&gt;well known&lt;/a&gt;. OsiriX gives you access to it, but a few lines of python can also extract it for you. First install the &lt;a href="https://github.com/darcymason/pydicom"&gt;pydicom&lt;/a&gt; package:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ sudo pip install pydicom
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Running the python interpreter is enough to peek at the metadata:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-python"&gt;&amp;gt;&amp;gt;&amp;gt; import dicom
&amp;gt;&amp;gt;&amp;gt; ds = dicom.read_file(&amp;quot;./DICOM/PAT_0000/STD_0000/SER_0000/OBJ_0001/IM_0001&amp;quot;)
&amp;gt;&amp;gt;&amp;gt; ds
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-text"&gt;(0008, 0000) Group Length                        UL: 400
(0008, 0005) Specific Character Set              CS: 'ISO_IR 100'
(0008, 0016) SOP Class UID                       UI: Computed Radiography Image Storage
(0008, 0020) Study Date                          DA: '20151203'
(0008, 0021) Series Date                         DA: '20151203'
(0008, 0023) Content Date                        DA: '20151203'
(0008, 0030) Study Time                          TM: '120519.000000'
(0008, 0031) Series Time                         TM: '120520.000000'
(0008, 0033) Content Time                        TM: '120643.000000'
(0008, 0060) Modality                            CS: 'CR'
(0008, 0070) Manufacturer                        LO: 'Canon Inc.'
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There were other DICOM files with a report:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-python"&gt;&amp;gt;&amp;gt;&amp;gt; import dicom
&amp;gt;&amp;gt;&amp;gt; ds = dicom.read_file(&amp;quot;./DICOM/PAT_0000/STD_0000/SER_0001/OBJ_0001/ED_0001&amp;quot;)
&amp;gt;&amp;gt;&amp;gt; ds
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-text"&gt;(0008, 0005) Specific Character Set              CS: 'ISO_IR 100'
(0008, 0016) SOP Class UID                       UI: Encapsulated PDF Storage
...
(0042, 0012) MIME Type of Encapsulated Document  LO: 'application/pdf'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://dcmtk.org/dcmtk.php.en"&gt;DCMTK&lt;/a&gt; is another alternative tool to extract DICOM metadata. The source is available and can be built:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ tar xf dcmtk-3.6.0.tar.gz
$ cd dcmtk-3.6.0
$ cmake .
$ make
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or installed via homebrew:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ brew install dcmtk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DCMTK includes dcmdump. You can use it to dump DICOM files:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ dcmdata/apps/dcmdump DICOM/PAT_0000/STD_0000/SER_0000/OBJ_0001/IM_0001
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-text"&gt;# Dicom-File-Format

# Dicom-Meta-Information-Header
# Used TransferSyntax: Little Endian Explicit
(0002,0000) UL 192                                      #   4, 1 FileMetaInformationGroupLength
(0002,0001) OB 01\00                                    #   2, 1 FileMetaInformationVersion
(0002,0002) UI =ComputedRadiographyImageStorage         #  26, 1 MediaStorageSOPClassUID
(0002,0003) UI [1.2.392.200046.100.2.1.1.42667.20151203120519.1.1.1] #  52, 1 MediaStorageSOPInstanceUID
(0002,0010) UI =LittleEndianExplicit                    #  20, 1 TransferSyntaxUID
(0002,0012) UI [1.3.46.670589.42.1.4.4.5]               #  24, 1 ImplementationClassUID
(0002,0013) SH [PhilipsISPACS445]                       #  16, 1 ImplementationVersionName
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Of interest, David Clunie's &lt;a href="http://www.dclunie.com/"&gt;Medical Image Format Site&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 19 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/view-dicom-files-from-your-x-ray</guid></item><item><title>App Use: Samplr #2, Addictive Synth</title><link>https://rjp.is/blogging/posts/app-use-samplr-2-addictive-synth-2/</link><description>App Use, Track 3 is more experimentation with Samplr.
&amp;ldquo;Sherlock Holmes and the Voice Of Terror&amp;rdquo; provided the samples, Fission chopped them up, and Addictive Synth provided the arpeggiation samples.
This was pretty tricky. (There was an earlier attempt at this but it was a fair old disaster. Even more repetitive and far too &amp;ldquo;chunky&amp;rdquo;.)
It took many attempts to get the first sample working right - Samplr loops the sample when recording in Tape Mode and cutting it off whilst keeping within the beat of a bar was a nightmare.</description><author>infrequent oscillations</author><pubDate>Fri, 18 Dec 2015 14:05:27 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-samplr-2-addictive-synth-2/</guid></item><item><title>App Use: Portable Dandy, Loopy</title><link>https://rjp.is/blogging/posts/app-use-portable-dandy-loopr-2/</link><description>Portable Dandy is a collection of samples you play in a virtual tape loop with a trio of effects. Quite fun but it has a proper problem as you can hear in thesoundtestroom review - certain sample and effect combinations will trigger horrible glitching.
In an attempt to avoid this horror, I recorded the samples into [LPR][Loopy] and then sequenced them there.
Where I discovered that Loopy is a right old bugger to work for this kind of thing.</description><author>infrequent oscillations</author><pubDate>Fri, 18 Dec 2015 13:48:46 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-use-portable-dandy-loopr-2/</guid></item><item><title>App Use: Samplr, #1</title><link>https://rjp.is/blogging/posts/app-1-samplr-2/</link><description>Samplr is a wizard&amp;rsquo;s toolbox of magical sound manipulation. In the hands of a master, it can produce some good stuff - &amp;ldquo;Do It Again&amp;rdquo;, &amp;ldquo;jamming with Samplr&amp;rdquo;, &amp;ldquo;SAMPLR - have some fun&amp;rdquo;.
In the hands of a bumbling amateur, it makes &amp;hellip; something?
App Use, Track 1 is just a bunch of stock Samplr samples being randomly noodled through the various modes to see how it all works. It works as a mostly ambient track, I think.</description><author>infrequent oscillations</author><pubDate>Fri, 18 Dec 2015 13:23:42 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/app-1-samplr-2/</guid></item><item><title>Pay Down Mortgage or Invest?</title><link>https://blog.nawaz.org/posts/2015/Dec/pay-down-mortgage-or-invest/</link><description>&lt;p&gt;The following scenarios are ones many of us run in&amp;nbsp;to:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;strong&gt;Lumped Sum:&lt;/strong&gt; I suddenly got $30,000. Should I put the money
towards my mortgage, or should I invest&amp;nbsp;it?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Periodic Payments:&lt;/strong&gt; After all my monthly bills, I have $500 left
over. Should I put it all towards my …&lt;/li&gt;&lt;/ol&gt;</description><author>Beetle Space</author><pubDate>Fri, 18 Dec 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.nawaz.org/posts/2015/Dec/pay-down-mortgage-or-invest/</guid></item><item><title>Tip: GOOGLETRANSLATE your Spreadsheet</title><link>https://xenodium.com/tip-googletranslate-your-spreadsheet</link><description>&lt;p&gt;Examples from &lt;a href="https://support.google.com/docs/answer/3093331"&gt;reference&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-text"&gt;=GOOGLETRANSLATE(&amp;quot;Hello World\n&amp;quot;,&amp;quot;en\n&amp;quot;,&amp;quot;es&amp;quot;)
=GOOGLETRANSLATE(A2,B2,C2)
=GOOGLETRANSLATE(A2)
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 18 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/tip-googletranslate-your-spreadsheet</guid></item><item><title>Organize your data with camlistore</title><link>https://xenodium.com/organize-your-data-with-camlistore</link><description>&lt;p&gt;Checking out &lt;a href="https://camlistore.org"&gt;camlistore&lt;/a&gt; to organize all sorts of data. &lt;a href="https://www.scaleway.com/imagehub/camlistore/"&gt;Scaleway&lt;/a&gt; enables you to deploy camlistore servers.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 18 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/organize-your-data-with-camlistore</guid></item><item><title>Links - December 18th, 2015</title><link>https://faingezicht.com/links/2015/12/18/links/</link><description/><author>Avy Faingezicht</author><pubDate>Fri, 18 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/12/18/links/</guid></item><item><title>Working with large files in Python</title><link>https://www.umarniz.com/working-with-large-files-in-python/</link><description>Recently I started on a pet project to explore a large data-set (32 million users) which was leaked to explore performance in Python. This…</description><author>Umar Nizamani | RSS Feed</author><pubDate>Thu, 17 Dec 2015 18:57:05 GMT</pubDate><guid isPermaLink="true">https://www.umarniz.com/working-with-large-files-in-python/</guid></item><item><title>Maps dev bookmarks</title><link>https://xenodium.com/maps-dev-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=26918259"&gt;A new way to make maps with OpenStreetMap | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mapzen.com/data/borders/"&gt;borders: Country, region and city boundary data from OpenStreetMap, served monthly (mapzen.com)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.inderapotheke.de/blog/farewell-google-maps"&gt;Farewell, Google Maps (In der Apotheke)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hamberg.no/erlend/posts/2015-10-22-geocoding.html"&gt;Fast, Offline, Reverse Geocoding; or, in Which Polygon am I?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22252330"&gt;Free OpenStreetMap tile library: watercolor, black and white, terrain&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ue4plugins/StreetMap/blob/master/README.md"&gt;Import OpenStreetMap XML data into your Unreal Engine 4&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.locationtech.org"&gt;Location Tech&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.openstreetmap.org/wiki/Map_Features#Amenity"&gt;Map's POI categories&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mapbox.com/"&gt;Mapbox&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://maperitive.net/"&gt;Maperitive (offline maps)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mapzen.com"&gt;Mapzen&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/tag/mapping"&gt;Medium's mapping tag&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18390425"&gt;Migrating away from Google Maps and cutting costs by 99% (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openaddresses.io/"&gt;Open Addresses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openstreetcam.org/map/"&gt;OpenStreetCam&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=23722133"&gt;Openstreetmap, a global map for worldwide insight | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.openstreetmap.org/user/mvexel/diary/39274"&gt;OpenStreetMap: Introducing OpenStreetView&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=27543012"&gt;Organicmaps: Android and iOS offline maps app for travelers, tourists, hikers…&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wiki.openstreetmap.org/wiki/Planet.osm"&gt;OSM data in one file&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wiki.openstreetmap.org/wiki/OSM_on_Paper"&gt;OSM on paper&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://download.osmand.net/rawindexes/"&gt;OSM raw indices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17952361"&gt;Pigeon Maps – Maps in React with no external dependencies (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://news.spatialdev.com/portable-open-street-map/"&gt;Portable OSM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=27781895"&gt;Show HN: Tilemaker – DIY vector tiles from OpenStreetMap data | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mapquest.com/documentation/static-map-api/v5/"&gt;Static Map API - Overview | MapQuest API Documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mostlymaths.net/2015/06/using-qgis-to-create-custom-map.html"&gt;Using QGIS to create a custom map&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=25615394"&gt;Why Openstreetmap’s product fails to compete with Google Maps | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thematicmapping.org/downloads/world_borders.php"&gt;World Borders Dataset (thematicmapping.org)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 17 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/maps-dev-bookmarks</guid></item><item><title>Use ImageMagick to convert image to grayscale</title><link>https://xenodium.com/use-imagemagick-to-convert-image-to-grayscale</link><description>&lt;p&gt;Another ImageMagick one-liner I'll likely forget.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;mogrify -type Grayscale image.png
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 17 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/use-imagemagick-to-convert-image-to-grayscale</guid></item><item><title>Links - December 17th, 2015</title><link>https://faingezicht.com/links/2015/12/17/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 17 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/12/17/links/</guid></item><item><title>Ok, ok, I have a problem</title><link>https://rjp.is/blogging/posts/ok-ok-i-have-a-problem-2/</link><description>I already had a bunch of apps for making noises/musics but #november lead to - let&amp;rsquo;s be honest - a splurge.
Which means it&amp;rsquo;s intervention time.
The rule I&amp;rsquo;m not allowed to buy any more music/noise apps until I&amp;rsquo;ve made (and posted) something which each one. Since some of them are essentially filters or DAWs, combinations are allowed but should be minimal.
Previously created content does not count for the purposes of this intervention.</description><author>infrequent oscillations</author><pubDate>Thu, 17 Dec 2015 00:07:17 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/ok-ok-i-have-a-problem-2/</guid></item><item><title>Personally, I think we’re entering an era where acquisitions will be more common than IPOs.</title><link>https://olshansky.info/posts/2015-12-15-personally-i-think-were-entering-an-era-where-acquisitions-will-be-more-common-than-ipos/</link><description>The bubble is not bursting, but it's not growing at the same rate as it used to, and there's not much more air to fill it. VC money is…</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 16 Dec 2015 02:01:46 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/posts/2015-12-15-personally-i-think-were-entering-an-era-where-acquisitions-will-be-more-common-than-ipos/</guid></item><item><title>Links - December 16th, 2015</title><link>https://faingezicht.com/links/2015/12/16/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 16 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/12/16/links/</guid></item><item><title>Lolita</title><link>https://olshansky.info/book/lolita/</link><description>Olshansky's review of Lolita by Vladimir Nabokov</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 16 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/lolita/</guid></item><item><title>YouCompleteMe and CMake</title><link>https://bastian.rieck.me/blog/2015/ycm_cmake/</link><description>&lt;p&gt;I recently updated my &lt;code&gt;vim&lt;/code&gt; configuration to include the fine &lt;a href="https://github.com/Valloric/YouCompleteMe"&gt;&lt;code&gt;YouCompleteMe&lt;/code&gt;&lt;/a&gt;
plugin for C++ development. Since the software project I am mostly working on during my PhD project
uses &lt;code&gt;CMake&lt;/code&gt;, configuring YCM turned out to require some additional steps.&lt;/p&gt;
&lt;p&gt;First, I added&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SET( CMAKE_EXPORT_COMPILE_COMMANDS ON )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to the main &lt;code&gt;CMakeLists.txt&lt;/code&gt; file of our project. This ensures that &lt;code&gt;CMake&lt;/code&gt; creates the file
&lt;code&gt;compile_commands.json&lt;/code&gt; in the build directory of the project. Next, we need &lt;code&gt;CMake&lt;/code&gt; to provision
the file properly:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IF( EXISTS &amp;quot;${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json&amp;quot; )
  EXECUTE_PROCESS( COMMAND ${CMAKE_COMMAND} -E copy_if_different
    ${CMAKE_CURRENT_BINARY_DIR}/compile_commands.json
    ${CMAKE_CURRENT_SOURCE_DIR}/compile_commands.json
  )
ENDIF()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This places the file in the source directory, permitting us to place a single configuration file
for YCM there. I have to add that I am not very happen with this solution yet. For one, this removes
the ability to have a debug build in some location and a release build somewhere else because the
build that is configured &lt;em&gt;last&lt;/em&gt; gets to copy its compile commands—which of course tend to
differ with different configuration options. Another reason why this solution is not entirely smart
is that the copy is usually performed &lt;em&gt;prior&lt;/em&gt; to &lt;code&gt;CMake&lt;/code&gt; updating the &lt;code&gt;compile_commands.json&lt;/code&gt; file.
If you change many compile options for different files, you will thus have to manually run the
&lt;code&gt;cmake&lt;/code&gt; binary twice.&lt;/p&gt;
&lt;p&gt;Even with all these quirks, it’s &lt;em&gt;still&lt;/em&gt; worth it—YCM is just so amazing to have. Being
a previous user of the &lt;a href="http://www.qt.io/ide"&gt;QtCreator IDE&lt;/a&gt;, I am blown away by the speed with
which the plugin manages to perform its duties.&lt;/p&gt;
&lt;p&gt;As a last step, we need to place a &lt;code&gt;.ycm_extra_conf.py&lt;/code&gt; configuration file in the project folder. By
default, YCM will use a pre-defined list of compilation flags to apply to all files. This is of
course insufficient for most larger projects, so we need to teach it to use the
&lt;code&gt;compile_commands.json&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;This is easily achieved with the following configuration file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;ycm_core&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;clang_helpers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PrepareClangFlags&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;DirectoryOfThisScript&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abspath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# This is the single most important line in this script. Everything else is just nice to have but&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# not strictly necessary.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;compilation_database_folder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DirectoryOfThisScript&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# This provides a safe fall-back if no compilation commands are available. You could also add a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# includes relative to your project directory, for example.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;'-Wall'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;'-std=c++11'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;'-stdlib=libc++'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;'-x'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;'c++'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;'-I'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;'-isystem'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/usr/local/include'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;'-isystem'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/usr/include'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;'-I.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;compilation_database_folder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ycm_core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompilationDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compilation_database_folder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SOURCE_EXTENSIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s1"&gt;'.cpp'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.cxx'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.cc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.c'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.m'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.mm'&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;MakeRelativePathsInFlagsAbsolute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;working_directory&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;working_directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;new_flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;make_next_absolute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;path_flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s1"&gt;'-isystem'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'-I'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'-iquote'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'--sysroot='&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;new_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;make_next_absolute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;make_next_absolute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;new_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;working_directory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;path_flag&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;path_flags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;path_flag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;make_next_absolute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;path_flag&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;path_flag&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;new_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path_flag&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;working_directory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;new_flag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;new_flags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;new_flag&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new_flags&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;IsHeaderFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;extension&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splitext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="p"&gt;)[&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s1"&gt;'.h'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.hxx'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.hpp'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.hh'&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;GetCompilationInfoForFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="c1"&gt;# The compilation_commands.json file generated by CMake does not have entries&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="c1"&gt;# for header files. So we do our best by asking the db for flags for a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="c1"&gt;# corresponding source file, if any. If one exists, the flags for that file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="c1"&gt;# should be good enough.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;IsHeaderFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;basename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splitext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="p"&gt;)[&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;SOURCE_EXTENSIONS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;replacement_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;basename&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;replacement_file&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;compilation_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetCompilationInfoForFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;          &lt;span class="n"&gt;replacement_file&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;compilation_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compiler_flags_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;compilation_info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetCompilationInfoForFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;FlagsForFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt; &lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="c1"&gt;# Bear in mind that compilation_info.compiler_flags_ does NOT return a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="c1"&gt;# python list, but a "list-like" StringVec object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;compilation_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetCompilationInfoForFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;compilation_info&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;final_flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MakeRelativePathsInFlagsAbsolute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;compilation_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compiler_flags_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;compilation_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compiler_working_dir_&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;relative_to&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DirectoryOfThisScript&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;final_flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MakeRelativePathsInFlagsAbsolute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relative_to&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;'flags'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;final_flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="s1"&gt;'do_cache'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The single most important line of this script is where you specify the compilation commands data
base, &lt;code&gt;compilation_database_folder = DirectoryOfThisScript()&lt;/code&gt;.
Apart from the that, the script is a modified version of the &lt;a href="https://github.com/Valloric/ycmd/blob/master/cpp/ycm/.ycm_extra_conf.py"&gt;default YCM configuration
file&lt;/a&gt;, which the author
strongly suggests to modify.&lt;/p&gt;
&lt;p&gt;A last word of advice: Depending on your YCM configuration, you may want to add &lt;code&gt;let g:ycm_extra_conf_globlist   = [ '/path/to/your/project/*' ]&lt;/code&gt; to your &lt;code&gt;.vimrc&lt;/code&gt;. This ensures that YCM
will load the configuration file automatically and not let you confirm anything due to security
reasons.&lt;/p&gt;
&lt;p&gt;Happy code completing!&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Tue, 15 Dec 2015 21:16:05 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/ycm_cmake/</guid></item><item><title>2016 Adventures</title><link>https://rjp.is/blogging/posts/2016-adventures-2/</link><description>Things for 2016 {Preliminary list - will repost on 2016-01-01}
(Stretch goals / PBs) [Caveats / Requirements]
&amp;ldquo;unsupported&amp;rdquo; means carrying everything from the start - no refuelling from shops. Only rest stops are allowed.
Movementercisers Janathon Juneathon Survive a full 6 hour race [with at least 42km] (no walking) (&amp;ldquo;unsupported&amp;rdquo;) Run more than 45km (48km) (50km) (56km) (no walking) (&amp;ldquo;unsupported&amp;rdquo;) Finish an official marathon (5:15) (5:00) (4:45) Half PB (2:00) (1:55) (1:50) 10km PB (50:00) (47:30) (45:00) Walk BAR-KNG at least twice (9:45) (9:30) [at least once &amp;ldquo;unsupported&amp;rdquo;] Walk SGR-KNG (15:00) (&amp;ldquo;unsupported&amp;rdquo;) Run BAR-KNG (6:30) (6:00) 7 more parkruns (+3 new places) All of Regents Park 10km series RBR ranking under 16 (15) (14) Randomerisers inktober blogtober noisevember</description><author>infrequent oscillations</author><pubDate>Tue, 15 Dec 2015 15:29:00 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/2016-adventures-2/</guid></item><item><title>Internet Protocol Security (IPSec)</title><link>https://www.anardil.net/2015/internet-protocol-security-ipsec.html</link><description>&lt;p&gt;This document will describe the capabilities and mechanics of IPSec as outlined by the IETF&lt;/p&gt;</description><author>Anardil</author><pubDate>Tue, 15 Dec 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2015/internet-protocol-security-ipsec.html</guid></item><item><title>Links - December 15th, 2015</title><link>https://faingezicht.com/links/2015/12/15/links/</link><description>I have not actually read Feinstein's whole paper, but the abstract makes it seem like an amazing read:
&gt; In this paper we study the financial repercussions of the destruction of two fully armed and
operational moon-sized battle stations (“Death Stars”) in a 4-year period and the dissolution of
the galactic government in Star Wars. The emphasis of this work is to calibrate and simulate
a model of the banking and financial systems within the galaxy. Along these lines, we measure
the level of systemic risk that may have been generated by the death of Emperor Palpatine and
the destruction of the second Death Star. We conclude by finding the economic resources the
Rebel Alliance would need to have in reserve in order to prevent a financial crisis from gripping
the galaxy through an optimally allocated banking bailout.

Mind. Blown.</description><author>Avy Faingezicht</author><pubDate>Tue, 15 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/12/15/links/</guid></item><item><title>How to complain about Go</title><link>https://divan.dev/posts/go_complain_howto/</link><description>&lt;p&gt;Over the years of existence of Go programming language, the articles with its critique was always popular, bringing a lot of discussion from both sides. Recently, &lt;a href="https://github.com/ksimka"&gt;Maksim Kochkin&lt;/a&gt; even created GitHub repo with &lt;a href="https://github.com/ksimka/go-is-not-good"&gt;curated list&lt;/a&gt; of articles complaining about golang&amp;rsquo;s imperfection.&lt;/p&gt;
&lt;p&gt;So, is it true that ranting about Go flaws is a trend nowadays? With carefully gathered links in the repository above, we can check this! :) Unfortunately, there are only 17 articles in the list, which is a bit disappointing because it&amp;rsquo;s not enough for fine statistical analysis, but we can use this anyway.&lt;/p&gt;</description><author>divan's blog</author><pubDate>Mon, 14 Dec 2015 13:36:54 GMT</pubDate><guid isPermaLink="true">https://divan.dev/posts/go_complain_howto/</guid></item><item><title>Drill down Emacs dired with dired-subtree</title><link>https://xenodium.com/drill-down-emacs-dired-with-dired-subtree</link><description>&lt;p&gt;JCS, from &lt;a href="http://irreal.org/blog"&gt;Irreal&lt;/a&gt;, recently &lt;a href="http://irreal.org/blog/?p%3D4777"&gt;highlighted&lt;/a&gt; fuco's &lt;a href="https://github.com/Fuco1/dired-hacks"&gt;dired-hacks&lt;/a&gt;. &lt;a href="https://github.com/Fuco1/dired-hacks/blob/master/dired-subtree.el"&gt;dired-subtree&lt;/a&gt; is super handy for drilling subdirectories down. Bound &amp;lt;tab&amp;gt; and &amp;lt;backtab&amp;gt; to toggle and cycle subtrees.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(use-package dired-subtree :ensure t
  :after dired
  :config
  (bind-key &amp;quot;&amp;lt;tab&amp;gt;&amp;quot; #'dired-subtree-toggle dired-mode-map)
  (bind-key &amp;quot;&amp;lt;backtab&amp;gt;&amp;quot; #'dired-subtree-cycle dired-mode-map))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/drill-down-emacs-dired-with-dired-subtree/dired-subtree.gif" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 14 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/drill-down-emacs-dired-with-dired-subtree</guid></item><item><title>GPG (GnuPG) examples</title><link>https://xenodium.com/gpg-examples</link><description>&lt;h2&gt;Generate key&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;gpg --full-generate-key
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Export private key&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;gpg --export-secret-key -a &amp;lt;keyid&amp;gt; &amp;gt; &amp;lt;private.asc&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Import key&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;gpg --import &amp;lt; &amp;lt;private.asc&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Delete public key&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;gpg --delete-keys &amp;lt;keyid&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Delete private key&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;gpg --delete-secret-keys &amp;lt;keyid&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Edit key&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;gpg --edit-key &amp;lt;keyid&amp;gt;
gpg&amp;gt; uid (lists IDs)
gpg&amp;gt; uid 2 (marks ID)
gpg&amp;gt; deluid (deletes marked ID)
Really remove this user ID? (y/N) y
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Change passphrase of the secret key&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;gpg --edit-key Your-Key-ID-Here
gpg&amp;gt; passwd
gpg&amp;gt; save
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.ghostinthemachines.com/2015/03/01/how-to-use-gpg-command-line/"&gt;How To Use GPG on the Command Line (Ghost in the Machines)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cyberciti.biz/faq/linux-unix-gpg-change-passphrase-command/"&gt;GPG Change Passphrase Secret Key Password Command - nixCraft&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gnupg.org/gph/en/manual.html"&gt;The GNU Privacy handbook&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 14 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/gpg-examples</guid></item><item><title>CSS bookmarks</title><link>https://xenodium.com/css-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jrl.ninja/etc/1/"&gt;58 bytes of css to look great nearly everywhere&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://csslayout.io/"&gt;CSS Layout&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id%3D10731360"&gt;CSS Protips: A collection of tips to help take your CSS skills pro (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AllThingsSmitty/css-protips"&gt;CSS Protips: A collection of tips to help take your CSS skills pro&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cssguidelin.es"&gt;CSS style guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://css-tricks.com/"&gt;CSS-Tricks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jamztang/CSStickyHeaderFlowLayout"&gt;CSStickyHeaderFlowLayout&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dynamicsjs.com/"&gt;Dynamics.js: JavaScript library to create physics-based CSS animations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://flexboxfroggy.com/"&gt;Flexbox Froggy, a game for writing CSS code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id%3D9405284"&gt;Howtocenterincss.com (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://howtocenterincss.com/"&gt;Howtocenterincss.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery"&gt;Optimize CSS delivery (Google Developers)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jgthms.com/web-design-in-4-minutes/"&gt;Web Design in 4 minutes (minimal css rules)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 14 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/css-bookmarks</guid></item><item><title>Two Papers</title><link>https://faingezicht.com/articles/2015/12/14/two_papers/</link><description>This weekend I read two completely unrelated documents that have shaped, and in my opinion will continue to influence, the future of technology.

First, I read the &lt;a href="http://12factor.net"&gt;Twelve Factor App&lt;/a&gt;, by Adam Wiggins and the folks behind &lt;a href="https://www.heroku.com"&gt;Heroku&lt;/a&gt;. Given that the first dynamic application I deployed online was a Ruby on Rails app on Heroku (thanks &lt;a href="https://www.railstutorial.org/book"&gt;Michael Hartl&lt;/a&gt;!), a lot of the content seemed obvious to me. However after talking to some of my more experienced coworkers it was interesting to see how much of a paradigm shift cloud infrastructure has brought to the technology industry. This is reflected in company cultures, and in a way is discussed in the &lt;a href="http://firstround.com/review/the-right-way-to-ship-software/"&gt;First Round Review article&lt;/a&gt; posted in today's list of links.

Next, I read the &lt;a href="https://bitcoin.org/bitcoin.pdf"&gt;Bitcoin White Paper&lt;/a&gt; by the infamous &lt;a href="https://en.wikipedia.org/wiki/Satoshi_Nakamoto"&gt;Satoshi Nakamoto&lt;/a&gt;. The paper was much more accessible than I expected. It is a very interesting read, and it gives a concice high level view of the inner workings of BTC.

It is widely accepted that the release of this paper was a watershed moment in computer science and economics, as the mathematics backing the bitcoin network tackle big, previously unsolved, problems in  distributed systems, such as the &lt;a href="https://en.bitcoin.it/wiki/Double-spending"&gt;double spending problem&lt;/a&gt; and the &lt;a href="https://en.wikipedia.org/wiki/Byzantine_fault_tolerance"&gt;byzantine generals problem&lt;/a&gt;. On the economics side, the technology allows its users to skirt trusted middlemen and third parties (i.e., banks and payment processors), lowering overall transaction costs. However, its effects go beyond changing cost structure. Bitcoin's controlled supply takes the public's expectations out of the inflation equation, by making credible claims on future currency issuance, preventing &lt;a href="https://en.wikipedia.org/wiki/Seigniorage"&gt;seignorage&lt;/a&gt; and possibly providing new tools to improve &lt;a href="http://andolfatto.blogspot.com/2015/11/bitcoin-and-central-banking.html"&gt;monetary policy&lt;/a&gt;. Additionally, the crytographical blockchain technology pioneered by bitcoin has also sparked innovation in other fields that benefit from the decentralization provided blockchain technologies: &lt;a href="https://onename.com/"&gt;identity&lt;/a&gt;, &lt;a href="https://ripple.com/"&gt;settlements&lt;/a&gt; and &lt;a href="https://ethereum.org/"&gt;smart contracts&lt;/a&gt; are only a few. Its really not clear how this will &lt;a href="http://joel.mn/post/103546215249/the-blockchain-application-stack"&gt;play out&lt;/a&gt; long term.

After reading it, I have been playing with the idea of writing a simulation of the bitcoin network, stay tuned for that...

The two documents could not have less in common, but I am certain that both will heavily impact business and technology for years to come.

*Image: An afternoon at the Berlin Stock Exchange. H. Luders - Licensed under Public Domain via &lt;a href="https://commons.wikimedia.org/wiki/File:Die_Gartenlaube_(1875"&gt;Wikimedia Commons&lt;/a&gt;_b_456.jpg)*</description><author>Avy Faingezicht</author><pubDate>Mon, 14 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/articles/2015/12/14/two_papers/</guid></item><item><title>Links - December 14th, 2015</title><link>https://faingezicht.com/links/2015/12/14/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 14 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/12/14/links/</guid></item><item><title>iSCSI SCSI-ID / Serial Persistence</title><link>https://smcleod.net/2015/12/iscsi-scsi-id-/-serial-persistence/</link><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;&amp;ldquo;Having a SCSI ID is a f*cking idiotic thing to do.&amp;rdquo;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://yarchive.net/comp/linux/scsi_ids.html"&gt;- Linus Torvalds&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;hellip;and after the amount of time I&amp;rsquo;ve wasted getting XenServer to play nicely with LIO iSCSI failover I tend to agree.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://smcleod.net//img/san/sr_fail.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;One oddity of Xen / XenServer&amp;rsquo;s storage subsystem is that it identifies iSCSI storage repositories via a calculated SCSI ID rather than the iSCSI Serial - which would be the sane thing to do.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Mon, 14 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/12/iscsi-scsi-id-/-serial-persistence/</guid></item><item><title>Chesterton's Fence</title><link>https://ho.dges.online/words/commonplace/chestertons-fence/</link><description>&lt;p&gt;Chesterton&amp;rsquo;s fence is the principle that reforms should not be made until the reasoning behind the existing state of affairs is understood.&lt;br /&gt;
The quotation is from G. K. Chesterton&amp;rsquo;s 1929 book The Thing, in the chapter entitled &amp;ldquo;The Drift from Domesticity&amp;rdquo;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;In the matter of reforming things, as distinct from deforming them, there is one plain and simple principle; a principle which will probably be called a paradox. There exists in such a case a certain institution or law; let us say, for the sake of simplicity, a fence or gate erected across a road. The more modern type of reformer goes gaily up to it and says, &amp;ldquo;I don&amp;rsquo;t see the use of this; let us clear it away.&amp;rdquo; To which the more intelligent type of reformer will do well to answer: &amp;ldquo;If you don&amp;rsquo;t see the use of it, I certainly won&amp;rsquo;t let you  clear it away. Go away and think. Then, when you can come back and tell me that you do see the use of it, I may allow you to destroy it.&amp;rdquo;&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Mon, 14 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/chestertons-fence/</guid></item><item><title>Toward dynamic RADOS object class management</title><link>https://makedist.com/posts/2015/12/14/toward-dynamic-rados-object-class-management/</link><description>Persisting Lua-based RADOS object classes in Ceph.</description><author>Noah Watkins</author><pubDate>Mon, 14 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2015/12/14/toward-dynamic-rados-object-class-management/</guid></item><item><title>RocketJump: The Show: Season 1</title><link>https://olshansky.info/tv/rocketjump_the_show_season_1/</link><description>Olshansky's review of RocketJump: The Show: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 13 Dec 2015 10:33:03 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/rocketjump_the_show_season_1/</guid></item><item><title>The Dark Tower (The Dark Tower, #7)</title><link>https://apurva-shukla.me/bookshelf/the-dark-tower-the-dark-tower-7/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ A completely stunning ending to a sublimely fantastic epic saga! Completely loved it from the first book till the end, with King…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Sun, 13 Dec 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-dark-tower-the-dark-tower-7/</guid></item><item><title>Musical Impostor: I made a thing. And I like it.</title><link>https://joshuarogers.net/articles/2015-12/musical-imposter/</link><description>I wrote a song this morning. I feel really good about it.
I tend to record music, frown a little and then hide it far away from human ears. It isn't that I don't like it. I just don't want anyone else to realize how amateur it is and that I, by extension, must be an amateur. A fake. An imposter.
So, I'm doing the imposter syndrome post? About time, I suppose.</description><author>Joshua Rogers</author><pubDate>Sat, 12 Dec 2015 14:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2015-12/musical-imposter/</guid></item><item><title>Technology and Free Thought</title><link>https://www.anardil.net/2015/technology-and-free-thought.html</link><description>&lt;p&gt;None&lt;/p&gt;</description><author>Anardil</author><pubDate>Sat, 12 Dec 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2015/technology-and-free-thought.html</guid></item><item><title>Resume partial downloads with ssh and rsync</title><link>https://xenodium.com/resume-partial-downloads-with-ssh-and-rsync</link><description>&lt;pre&gt;&lt;code class="language-{.bash"&gt;rsync --rsync-path=/usr/local/bin/rsync \
      --partial \
      --progress \
      --rsh=ssh \
      john@host:/path/to/file \
      path/to/partial/file
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 12 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/resume-partial-downloads-with-ssh-and-rsync</guid></item><item><title>Emacs text faces</title><link>https://xenodium.com/emacs-text-faces</link><description>&lt;ul&gt;
&lt;li&gt;Text faces = Text styles.&lt;/li&gt;
&lt;li&gt;Face attributes: font, height, weight, slant, foreground/background color, and underlining or overlining.&lt;/li&gt;
&lt;li&gt;Font lock mode automatically assigns faces to text.&lt;/li&gt;
&lt;li&gt;M-x list-faces-display: Shows faces defined.&lt;/li&gt;
&lt;li&gt;M-x helm-colors: Also handy.&lt;/li&gt;
&lt;li&gt;Unspecified attributes are taken from 'default' face.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 12 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-text-faces</guid></item><item><title>Simple ssh tunnel</title><link>https://xenodium.com/simple-ssh-tunnel</link><description>&lt;p&gt;Via &lt;a href="https://twitter.com/climagic/status/674688454526136320?refsrc%3Demail&amp;amp;s%3D11"&gt;@climagic&lt;/a&gt;, connections to tcp localhost:9909 will be made to 192.168.1.1:80 via SSH tunnel to home.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;ssh -L 9909:192.168.1.1:80 home
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 12 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/simple-ssh-tunnel</guid></item><item><title>Links - December 11th, 2015</title><link>https://faingezicht.com/links/2015/12/11/links/</link><description>Well, I finished the first season of Startup, and then, I got bored... Take note Alex Blumberg! The reasons why I was enjoying it so much were the SV outsider tone, the feeling of surprise when lingo had to be explained, and, perhaps most importantly, the fact that I listened to a whole season of Reply All before I started with StartUp. To me, Gimlet is just a more interesting business to learn about than Dating Ring (sorry matchmaker aficionados).

Now, since I always _NeedMoreContent™_, I started a &lt;a href="https://class.coursera.org/nand2tetris1-001"&gt;class on coursera&lt;/a&gt; and it has been awesome to learn about the low level pieces that make up a computer. It's been less than a week since I started, and I am already halfway through week 4 of the course. The class is aimed at people with 0 engineering background, and I would definitely recommend it if you are interested in computing.</description><author>Avy Faingezicht</author><pubDate>Fri, 11 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/12/11/links/</guid></item><item><title>painless publishing of android libraries</title><link>https://zserge.com/posts/jitpack/</link><description>Libraries are only good when it&amp;rsquo;s easy to share them. Android has done this wrong for a very long time.
Node.js has npm and a new library can be published in a couple of minutes, usage is as simple as adding library name to package.json.
Go has no package manager at all and publishing a library is as simple as &amp;ldquo;git push&amp;rdquo; and using is as simple as &amp;ldquo;import github.com/user/library&amp;rdquo;.</description><author>zserge's blog</author><pubDate>Fri, 11 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/jitpack/</guid></item><item><title>Spacemacs for atom - a few weeks later</title><link>https://david.coffee/spacemacs-for-atom-a-few-weeks-later/</link><description>&lt;p&gt;I recently &lt;a href="https://david.coffee/clojurescript/2015/11/27/spacemacs-for-atom.html"&gt;wrote&lt;/a&gt; about my attempt to bring spacemacs style editing to atom. A lot of stuff happened that I wanna tell you about!&lt;/p&gt;
&lt;p&gt;
&lt;img alt="showcase" class="img-fluid" src="./UmxjocD.gif" /&gt;

&lt;/p&gt;
&lt;h3 id="in-review"&gt;In review&lt;/h3&gt;
&lt;p&gt;Since the last post, &lt;a href="https://github.com/dvcrn/proton"&gt;proton&lt;/a&gt; acquired 72 stars, 13 watches and 4 forks. We now have 3 people that actively contribute changes.&lt;/p&gt;
&lt;p&gt;Proton became a good amount more stable, removed a lot of the ugly hacks it had in the beginning and added some really cool stuff on top. Let me give you a short overview:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We started creating a better default experience. The goal is that you just install proton, it reads your &lt;code&gt;~/.proton&lt;/code&gt; and bam! You have a superb editor experience. Since 0.1.2 we ship a better theme, a better font, better default settings and put a lot more power into the dotfile.&lt;/li&gt;
&lt;li&gt;Step by step we are trying to allow users to toggle the entire atom experience from within &lt;code&gt;~/.proton&lt;/code&gt; or through the &lt;code&gt;&amp;lt;spc&amp;gt; t&lt;/code&gt; menu. We created the base for pulling stuff like &lt;code&gt;&amp;lt;spc&amp;gt; t n&lt;/code&gt; for relative line numbers off (which by the way is in a third party package and not part of atoms core) or &lt;code&gt;&amp;lt;spc&amp;gt; t t&lt;/code&gt; to disable the tab-bar (which &lt;strong&gt;is&lt;/strong&gt; a core package).&lt;/li&gt;
&lt;li&gt;You can swap-out components more easily. Say you like &lt;a href="http://nuclide.io/"&gt;nuclide&lt;/a&gt; and you want to use their quick-open tool instead of the default one. Now all you have to do is swap &lt;code&gt;proton.core.quickOpenProvider&lt;/code&gt; to &lt;code&gt;:nuclide&lt;/code&gt; and proton will replace it. Following this, adding different providers like swapping the file-tree with something else in the future will be no problem.&lt;/li&gt;
&lt;li&gt;We have context aware shortcuts and modes &lt;a href="https://github.com/dvcrn/proton/pull/27"&gt;on the way&lt;/a&gt;! This means that your &lt;code&gt;&amp;lt;spc&amp;gt;&lt;/code&gt; menu could change depending on what file you are editing. &lt;code&gt;&amp;lt;spc&amp;gt; m =&lt;/code&gt; in python could execute yapf while in javascript, it could use js-beautify. This would make proton a truly dynamic experience.&lt;/li&gt;
&lt;li&gt;We added a handful new &lt;a href="https://github.com/dvcrn/proton/tree/master/src/cljs/proton/layers"&gt;layers&lt;/a&gt; with more being added over time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The crazy thing is that proton already bypassed &lt;a href="https://github.com/dvcrn/sublimious"&gt;sublimious&lt;/a&gt; in popularity, functionality and features.&lt;/p&gt;
&lt;h3 id="live-reloading-inside-atom"&gt;Live reloading inside Atom&lt;/h3&gt;
&lt;p&gt;Thanks to the amazing &lt;a href="https://github.com/thheller"&gt;thheller&lt;/a&gt; we now even have full support for hot code reloading while developing proton. It goes even this far that we might even be one of the onlys plugin out there that was able to pull this off with full REPL integration! Even the guys at the &lt;a href="http://discuss.atom.io"&gt;atom forums&lt;/a&gt; couldn&amp;rsquo;t do that 😁&lt;/p&gt;
&lt;p&gt;With this new and even more stable build process, creating plugins in atom has never been this fun and easy! (&lt;a href="https://github.com/dvcrn/ajom"&gt;ajom&lt;/a&gt; has been updated with the latest changes.)&lt;/p&gt;
&lt;h3 id="the-future"&gt;The future&lt;/h3&gt;
&lt;p&gt;I am very impressed to see how proton is doing. As assumed, clojurescript is making atom such a powerful tool with a lot of unused potential. With &lt;a href="https://github.com/dvcrn/proton/pull/27"&gt;modes-ish&lt;/a&gt; stuff on the way, we could even see something similar to emacs&amp;rsquo;s modes in the future. Just imagine that, composing modes inside atom! (Just wondering when the atom API will become limiting&amp;hellip;)&lt;/p&gt;
&lt;p&gt;Proton is on a steady way to become your central gateway when interacting with atom. Leveraging clojure goodies and now even support for live reloading and REPL development - developing a atom extension has never been this fun.&lt;/p&gt;
&lt;p&gt;Now just to hope that more people adopt this and we might see more high quality and faster developed extensions on the way.&lt;/p&gt;
&lt;p&gt;Spacemacs, we are coming for you!&lt;/p&gt;</description><author>David Mohl</author><pubDate>Thu, 10 Dec 2015 13:59:23 GMT</pubDate><guid isPermaLink="true">https://david.coffee/spacemacs-for-atom-a-few-weeks-later/</guid></item><item><title>Tutorial: Dealing with Disk Space Errors in Linux</title><link>https://benovermyer.com/blog/2015/12/tutorial-dealing-with-disk-space-errors-in-linux/</link><description>&lt;p&gt;If you're seeing errors on a server (say, npm complaining about an ENOSPC error, or apt failing to install something) that suggest the hard disk is full, use this guide to resolve the issue.&lt;/p&gt;
&lt;h1 id="troubleshooting"&gt;Troubleshooting&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;All of the following commands assume you are logged in as a sudo user on a Linux machine. Some of the commands, like &lt;code&gt;df -hT&lt;/code&gt;, won't work exactly as advertised on something like, say, Solaris.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="checking-disk-space"&gt;Checking disk space&lt;/h2&gt;
&lt;p&gt;First, check the amount of available disk space.&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;df -hT&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If one of the available drives (such as &lt;code&gt;/dev/xvda1&lt;/code&gt;) shows as 100% full, then you'll need to clear some space. The first place to look is &lt;code&gt;/var/log/&lt;/code&gt;, especially if nginx is writing log files to disk. Clear out all old logs (anything with a .gz file extension is fair game for deletion). If that doesn't free up enough space, the next place to check is the application directory for whatever app is on the server. If there are more than 3 releases on the server, you can safely delete the oldest ones (until you have at least 2 remaining). You can also remove all the files in &lt;code&gt;/tmp/&lt;/code&gt;, although that should be a last resort.&lt;/p&gt;
&lt;h2 id="checking-inode-usage"&gt;Checking inode usage&lt;/h2&gt;
&lt;p&gt;If you've confirmed that the hard drive isn't full (or cleared enough space that it isn't), and you're still seeing “disk is full” type errors, then you almost certainly have too few inodes available on the server. This means, basically, that there are too many files on the server.&lt;/p&gt;
&lt;h3 id="checking-inode-usage-1"&gt;Checking inode usage&lt;/h3&gt;
&lt;p&gt;Run the following command to check inode usage:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;df -i&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You'll see something like the following:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;Filesystem     Inodes IUsed IFree IUse% Mounted on&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;udev             121K   409  120K    1% /dev&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;tmpfs            125K   479  124K    1% /run&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;/dev/vda1        1.9M  237K  1.7M   13% /&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;tmpfs            125K     2  125K    1% /dev/shm&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;tmpfs            125K     3  125K    1% /run/lock&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;tmpfs            125K    15  125K    1% /sys/fs/cgroup&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;tmpfs            125K     4  125K    1% /run/user/1000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;IUse%&lt;/code&gt; column is the one you're interested in. If &lt;code&gt;IUse%&lt;/code&gt; is at or near 100%, then you have an inode usage problem.&lt;/p&gt;
&lt;h3 id="delete-old-kernels"&gt;Delete old kernels&lt;/h3&gt;
&lt;p&gt;Often, you can free up a ton of inodes if you delete old kernels. This is done with a pretty simple command:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;sudo apt-get autoremove -y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Try that first. If that doesn't remove the old kernels, &lt;a href="http://markmcb.com/2013/02/04/cleanup-unused-linux-kernels-in-ubuntu/" rel="external"&gt;this page&lt;/a&gt; may help.&lt;/p&gt;
&lt;h3 id="script-to-check-for-directories-with-lots-of-files"&gt;Script to check for directories with lots of files&lt;/h3&gt;
&lt;p&gt;This script will help find directories with large numbers of files. Put the following into a file &lt;code&gt;list-files.sh&lt;/code&gt; in your home directory:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# count_em - count files in all subdirectories under current directory.&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;echo 'echo $(ls -a &amp;quot;$1&amp;quot; | wc -l) $1' &amp;gt;/tmp/count_em_$&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;chmod 700 /tmp/count_em_$&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;find . -mount -type d -print0 | xargs -0 -n1 /tmp/count_em_$ | sort -n&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then make the file executable:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;chmod +x ./list-files.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, go to the root directory on the server and run the script:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;cd /&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;~/list-files.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It may take a couple minutes to run, but it will present you with a list of all the directories with a number of files next to each, sorted in ascending order of number of files. Take a look at each of the high ones; that might give you an idea of what you need to clean up.&lt;/p&gt;
&lt;h3 id="some-notes-about-good-files-to-delete"&gt;Some notes about good files to delete&lt;/h3&gt;
&lt;p&gt;Log files are safe to delete. So are old releases. Also check the &lt;code&gt;/tmp/&lt;/code&gt; directory; it can often be a hiding place for tons of files.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Thu, 10 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/12/tutorial-dealing-with-disk-space-errors-in-linux/</guid></item><item><title>Disable OS X kernel_task throttling</title><link>https://www.davidschlachter.com/misc/kernel_task</link><description>How to disable kernel_task CPU throttling in OS X. Tested on OS X El Capitan.</description><author>David Schlachter</author><pubDate>Wed, 09 Dec 2015 19:00:00 GMT</pubDate><guid isPermaLink="true">https://www.davidschlachter.com/misc/kernel_task</guid></item><item><title>Adding a Play2 application as a sub-project to an existing sbt project</title><link>https://manuel.kiessling.net/2015/12/09/adding-a-play2-application-as-a-sub-project-to-an-existing-sbt-project/</link><description>About this post  Already working on an sbt-based Scala project with two sub-projects, I wanted to create a third sub-project, a Play2 application. The following describes what worked for me. Creating the sub-project structure  Before adding the third sub-project, my sbt project structure looked like this:  importer/ └ src/ ├ main/ └ test/ spark/ └ src/ ├ main/ └ test/ project/ └ plugins.sbt build.sbt 
 Within build.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Wed, 09 Dec 2015 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2015/12/09/adding-a-play2-application-as-a-sub-project-to-an-existing-sbt-project/</guid></item><item><title>Things by Fleur Adcock</title><link>https://ho.dges.online/words/commonplace/things-by-fleur-adcock/</link><description>&lt;p&gt;There are worse things than having behaved foolishly in public.&lt;br /&gt;
There are worse things than these miniature betrayals,&lt;br /&gt;
committed or endured or suspected; there are worse things&lt;br /&gt;
than not being able to sleep for thinking about them.&lt;br /&gt;
It is 5 a.m. All the worse things come stalking in&lt;br /&gt;
and stand icily about the bed looking worse and worse and worse.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Wed, 09 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/things-by-fleur-adcock/</guid></item><item><title>Postgres and Node - Hands on using Postgres as a Document Store with MassiveJS</title><link>/2015/12/08/Postgres-and-Node-Hands-on-using-Postgres-as-a-Document-Store-with-MassiveJS/</link><description>&lt;p&gt;JSONB in Postgres is absolutely awesome, but it&amp;rsquo;s taken a little while for libraries to come around to make it as useful as would be ideal. For those not following along with Postgres lately, here&amp;rsquo;s the quick catchup for it as a NoSQL database.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In Postgres 8.3 over 5 years ago Postgres received &lt;a href="http://www.craigkerstiens.com/2013/07/03/hstore-vs-json/"&gt;hstore a key/value&lt;/a&gt; store directly in Postgres. It&amp;rsquo;s big limitation was it was only for text&lt;/li&gt;
&lt;li&gt;In the years after it got GIN and GiST indexes to make queries over hstore extremely fast indexing the entire collection&lt;/li&gt;
&lt;li&gt;In Postgres 9.2 we got JSON&amp;hellip; sort of. Really this way only text validation, but allowed us to create some &lt;a href="http://www.craigkerstiens.com/2013/05/29/postgres-indexes-expression-or-functional-indexes/"&gt;functional indexes&lt;/a&gt; which were still nice.&lt;/li&gt;
&lt;li&gt;In Postgres 9.4 we got JSONB - the B stands for Better according to &lt;a href="http://www.twitter.com/leinweber"&gt;@leinweber&lt;/a&gt;. Essentially this is a full binary JSON on disk, which can perform as fast as other NoSQL databases using JSON.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is all great, but when it comes to using JSON you need a library that plays well here. As you might have guessed it from &lt;a href="http://www.craigkerstiens.com/2015/11/30/massive-node-postgres-an-overview-and-intro/"&gt;my previous post this is where MassiveJS comes in&lt;/a&gt;. Most ORMs take a more legacy approach to &lt;a href="http://www.craigkerstiens.com/2014/01/24/rethinking-limits-on-relational/"&gt;how they work with the database&lt;/a&gt;, in contrast the other side of the world believes in document only storage way is the future. In contrast Postgres believes there is a time and place for everything, just like Massive, except it believes Postgres is the path &lt;a href="http://www.craigkerstiens.com/2012/04/30/why-postgres/"&gt;just as I do&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Alright, enough context, let&amp;rsquo;s take a look.&lt;/p&gt;
&lt;h3 id="getting-all-setup"&gt;
&lt;div&gt;
Getting all setup
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;First go ahead and create a database, let&amp;rsquo;s call it massive, and then let&amp;rsquo;s connect to it and create our example table:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ createdb massive
$ psql massive
# create table posts (id serial primary key, body jsonb);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now that we&amp;rsquo;ve got our database setup let&amp;rsquo;s seed it with some data. If you want you can simple hop over to the github repo and pull it down then run &lt;code&gt;node load_json.js&lt;/code&gt; to load the example data. A quick look at it, given an &lt;code&gt;example.json&lt;/code&gt; file we&amp;rsquo;re going to iterate over it. For each record in there, we&amp;rsquo;re going to call saveDoc. Based on our table which has a unique id key and a body jsonb field it&amp;rsquo;ll simply save our JSON document into that table:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var parsedJSON = require('./example.json');
for(i = 0; i &amp;lt; parsedJSON.posts.length; i++) {
db.saveDoc(&amp;quot;posts&amp;quot;, parsedJSON.posts[1], function(err,res){});
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;If you want to just take a look at this &lt;a href="https://github.com/craigkerstiens/json_node_example"&gt;github repo&lt;/a&gt;, once you create a database you can run &lt;code&gt;node load_json.js&lt;/code&gt; to seed it.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="why-json-at-all"&gt;
&lt;div&gt;
Why JSON at all?
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;JSON data is all over the place, in many cases it&amp;rsquo;s fast and flexible and allows you to move more quickly. Yes, much of the time normalizing your data can be useful, but there is something to be said for expediency saving some data and querying across it. Querying across some giant document also used to be much more expensive, but now with JSONB and it&amp;rsquo;s indexes that can be extremely fast.&lt;/p&gt;
&lt;h3 id="querying"&gt;
&lt;div&gt;
Querying
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;So how do we go about querying? Well it&amp;rsquo;s pretty simple with Massive, they provide a nice &lt;code&gt;findDoc&lt;/code&gt; function to let you just search for contents of a specific key within the document. Let&amp;rsquo;s say I wanted to pull back all posts that are in the Postgres category, well it&amp;rsquo;s as simple as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;db.posts.findDoc({title : 'Postgres'}, function(err,docs){
console.log(docs);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The real beauty of this is if you added a GIN index (which will index the entire document) this query will be &lt;a href="http://obartunov.livejournal.com/175235.html"&gt;quite performant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Just make sure to add your GIN index&lt;/em&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CREATE INDEX idx_posts ON posts USING GIN(body jsonb_path_ops);
CREATE INDEX idx_posts_search ON posts USING GIN(search);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But even better, with Massive it&amp;rsquo;ll automatically add these for you if you just start saving docs. It will automatically create the table and appropriate indexes, just doing the correct thing out of the box.&lt;/p&gt;
&lt;h3 id="full-text-and-json"&gt;
&lt;div&gt;
Full text and JSON
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Cool, so you can do an exact look up. Which is great when you&amp;rsquo;re matching a category&amp;hellip; which could be easily normalized. It&amp;rsquo;s great when you&amp;rsquo;re matching numbers, which also could likely reside in their own column. But what about when you&amp;rsquo;re searching over a large document, or a set of keys within some document which may require several joins, or indeterminate data structure, well you may want to search for the presence of that string at all. As you may have guessed this is quite trivial.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;db.posts.searchDoc({
keys : [&amp;quot;title&amp;quot;, &amp;quot;category&amp;quot;],
term : [&amp;quot;Postgres&amp;quot;]
}, function(err,docs){
console.log(docs);
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hopefully it&amp;rsquo;s pretty straight forward, but to be very clear. Call out the document table you want to search, then the keys you&amp;rsquo;ll want to include in the search, then the term. This will search for any place the contents that string are found in matching values for those keys.&lt;/p&gt;
&lt;p&gt;Which will nicely yield the expected documents:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ { link: 'http://www.craigkerstiens.com/2015/05/08/upsert-lands-in-postgres-9.5/',
title: 'Upsert Lands in PostgreSQL 9.5 – a First Look',
category: 'Postgres',
comments: [ [Object] ],
id: 2 },
{ link: 'http://www.craigkerstiens.com/2015/11/30/massive-node-postgres-an-overview-and-intro/',
title: 'Node, Postgres, MassiveJS - a Better Database Experience',
id: 3 } ]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="in-conclusion"&gt;
&lt;div&gt;
In conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;While Massive isn&amp;rsquo;t perfect, its approach to storing queries in files, using the schema vs. having to define your models in code and the database, and it&amp;rsquo;s smooth document integration makes it a real contender as a better database library when working with Node. Give it a try and let me know your thoughts.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Tue, 08 Dec 2015 22:55:56 GMT</pubDate><guid isPermaLink="true">/2015/12/08/Postgres-and-Node-Hands-on-using-Postgres-as-a-Document-Store-with-MassiveJS/</guid></item><item><title>Apple Pay</title><link>https://rjp.is/blogging/posts/apple-pay-2/</link><description>http://time.com/money/4139330/apple-pay-unused/
Survey: Only 20% of those that can use Apple Pay have used it
Trustev surveyed 1,000 consumers who owned Apple Pay-compatible iPhones about their Apple Pay habits. (The iPhone 6, iPhone 6 Plus, iPhone 6s, and iPhone 6s Plus support Apple Pay, while older iPhones do not.) It found that about 80% had not used Apple Pay even once. Of the 20% who had, most (56%) only used it about once a week.</description><author>infrequent oscillations</author><pubDate>Tue, 08 Dec 2015 14:03:28 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/apple-pay-2/</guid></item><item><title>Preview HTML pages on github</title><link>https://xenodium.com/preview-html-pages-on-github</link><description>&lt;p&gt;Prepend with &lt;a href="http://htmlpreview.github.io/"&gt;http://htmlpreview.github.io/&lt;/a&gt;?. For example: &lt;a href="http://htmlpreview.github.io/?https://github.com/xenodium/xenodium.github.io/blob/master/index.html"&gt;http://htmlpreview.github.io/?https://github.com/xenodium/xenodium.github.io/blob/master/index.html&lt;/a&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 08 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/preview-html-pages-on-github</guid></item><item><title>Integration testing in Go using Docker</title><link>https://divan.dev/posts/integration_testing/</link><description>&lt;p&gt;&lt;em&gt;Note: this post was originally written for the &lt;a href="https://blog.gopheracademy.com/advent-2015/introduction/"&gt;Go Advent 2015&lt;/a&gt; series, but I discovered that a post with almost exactly the same subject (and even similar code!) already planned :) That&amp;rsquo;s amazing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Golang is often used for writing microservices and various backends. Often these type of software do some computation, read/write data on external storage and expose it&amp;rsquo;s API via http handlers. All this functionality is remarkably easy to implement in Go and, especially if you&amp;rsquo;re creating &lt;a href="http://12factor.net"&gt;12factor&lt;/a&gt;-compatible app, Go is your friend here.&lt;/p&gt;</description><author>divan's blog</author><pubDate>Mon, 07 Dec 2015 17:36:54 GMT</pubDate><guid isPermaLink="true">https://divan.dev/posts/integration_testing/</guid></item><item><title>Upgrading a Symfony project from 2.6 to 3.0</title><link>https://manuel.kiessling.net/2015/12/07/upgrading-a-symfony-project-from-2-6-to-3-0/</link><description>About this post  Symfony 3.0 has been released recently, and I wanted to upgrade my side project JourneyMonitor, which was still based on Symfony 2.6, as quickly as possible.  This post explains how I approached the upgrade, and shows which parts of the project structure and code had to be changed in order to get the project working again. Preparing the upgrade  The code base for the project – the CONTROL component of the JourneyMonitor project – lives at https://github.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Mon, 07 Dec 2015 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2015/12/07/upgrading-a-symfony-project-from-2-6-to-3-0/</guid></item><item><title>#noisevember</title><link>https://rjp.is/blogging/posts/noisevember-2/</link><description>The output In reverse order; unless otherwise indicated, things were created on iOS and recorded over Audiobus to Audioshare before exporting to Soundcloud.
https://soundcloud.com/zimpenfish/tidal-noisevember (Tidal through Audacity) https://soundcloud.com/zimpenfish/much-indulgent-very-soundscape (SoundScaper) https://soundcloud.com/zimpenfish/just-beatwave-drums (Beatwave) https://soundcloud.com/zimpenfish/coconut-latte (Figure); https://soundcloud.com/zimpenfish/finsbury-park-bonus (Figure) https://soundcloud.com/zimpenfish/beyond-mere-indulgence (SoundScaper) https://soundcloud.com/zimpenfish/more-self-indulgence (FieldScaper) created from https://soundcloud.com/zimpenfish/before-self-indulgence (PixiTracker) https://soundcloud.com/zimpenfish/i-honestly-have-no-idea (Fieldscaper) https://soundcloud.com/zimpenfish/bass-player-mangled (Fieldscaper, creating from a recording of someone practicing a bass riff in the office kitchen) https://soundcloud.com/zimpenfish/mildly-delayed (SoundScaper, using one of the Bitwiz library tracks) https://soundcloud.</description><author>infrequent oscillations</author><pubDate>Mon, 07 Dec 2015 14:50:26 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/noisevember-2/</guid></item><item><title>Are recent trends in company IPOs signaling an imminent recession?</title><link>https://olshansky.info/posts/2015-12-06-are-recent-trends-in-company-ipos-signaling-an-imminent-recession/</link><description>Commodities are tanking, the fed is still contemplating an increase in interest rates, and several countries are either in or on the verge…</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 07 Dec 2015 04:37:02 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/posts/2015-12-06-are-recent-trends-in-company-ipos-signaling-an-imminent-recession/</guid></item><item><title>Flutter setup</title><link>https://xenodium.com/flutter-setup</link><description>&lt;p&gt;Based on &lt;a href="http://flutter.io/getting-started/"&gt;Getting Started with Flutter&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ curl -O https://storage.googleapis.com/dart-archive/channels/stable/release/1.13.0/sdk/dartsdk-macos-x64-release.zip
$ unzip dartsdk-macos-x64-release.zip
$ export PATH=`pwd`/dart-sdk/bin:$PATH
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verify with:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ pub --version
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 07 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/flutter-setup</guid></item><item><title>Playing with Dart's analysis server</title><link>https://xenodium.com/playing-with-darts-analysis-server</link><description>&lt;p&gt;Dart SDK ships with an &lt;a href="https://github.com/dart-lang/sdk/tree/master/pkg/analysis_server"&gt;analysis server&lt;/a&gt;. Very handy if you'd like to write a completion plugin for your favorite editor. The API is well &lt;a href="http://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/doc/api.html"&gt;documented&lt;/a&gt;. Of interest, there's &lt;a href="https://github.com/tomsontom/dartedit/blob/master/bundles/at.bestsolution.dart.server.api/src-gen/at/bestsolution/dart/server/api/internal/local/LocalDartServer.java"&gt;LocalDartServer.java&lt;/a&gt;, part of &lt;a href="https://github.com/tomsontom/dartedit/blob/master/bundles/at.bestsolution.dart.server.api/src-gen/at/bestsolution/dart/server/api/internal/local/LocalDartServer.java"&gt;dartedit&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ dart path/to/bin/snapshots/analysis_server.dart.snapshot  --sdk=path/to/dart-sdk
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NOTE: The server reads requests from standard input. Either escape or execute the following as one-liner json requests.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-json"&gt;{
  &amp;quot;id&amp;quot;: &amp;quot;1\n&amp;quot;,
  &amp;quot;method&amp;quot;: &amp;quot;analysis.setAnalysisRoots\n&amp;quot;,
  &amp;quot;params&amp;quot;: {
    &amp;quot;included&amp;quot;: [
      &amp;quot;path/to/your/dart/project&amp;quot;
    ],
    &amp;quot;excluded&amp;quot;: []
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-json"&gt;{
  &amp;quot;id&amp;quot;: &amp;quot;3\n&amp;quot;,
  &amp;quot;method&amp;quot;: &amp;quot;completion.getSuggestions\n&amp;quot;,
  &amp;quot;params&amp;quot;: {
    &amp;quot;file&amp;quot;: &amp;quot;path/to/some/file.dart\n&amp;quot;,
    &amp;quot;offset&amp;quot;: 673
  }
}
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 07 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/playing-with-darts-analysis-server</guid></item><item><title>Dart bookmarks</title><link>https://xenodium.com/dart-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://tomsondev.bestsolution.at/2015/08/25/access-dart-analysis-server-from-java/"&gt;Access Dart Analysis server from Java&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/doc/api.html"&gt;Analysis server API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dartlang.org/tools/"&gt;Dart tools&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 07 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/dart-bookmarks</guid></item><item><title>Command Line: Newbie to Ninja</title><link>https://peterlyons.com/problog/2015/12/command-line:-newbie-to-ninja/</link><description>&lt;h2 id="part-one-bow-to-your-sensei"&gt;Part One: Bow to Your Sensei&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Bow to your Sensei" src="https://static1.1.sqspcdn.com/static/f/1209144/20265241/1347563118103/RexKwonDo2.jpg?token=mU%2Beslcb3UKPj3JU%2FUTKrbccAxI%3D" /&gt;&lt;/p&gt;
&lt;p&gt;These tips are the dojo ground rules you must learn before even the most basic command line work can get done. If you haven't got these down, everything is going to take much longer than it needs to. These are also definitely a prerequisite to any command line activity while pair programming if you don't want your pair to pull their hair out during the session.&lt;/p&gt;
&lt;h3 id="tab-completion"&gt;tab completion&lt;/h3&gt;
&lt;p&gt;The shell can help you out with typing long filesystem paths and avoiding typos in command names. It does this with a feature called "tab completion". Tab completion allows you to start entering just the first few characters of something then type the &lt;code&gt;&amp;lt;TAB&amp;gt;&lt;/code&gt; key and the shell will complete it for you. So for example, instead of typing &lt;code&gt;cd ./external/plugins&lt;/code&gt;, you could type &lt;code&gt;cd ./ex&amp;lt;TAB&amp;gt;&lt;/code&gt; and the shell would expand the rest of the directory name "external", allowing you to keep typing &lt;code&gt;pl&amp;lt;TAB&amp;gt;&lt;/code&gt; to expand plugins. This saves a lot of typing and prevents typos from ruining your day. Pretty much every experienced command line user I've paired with uses tab completion on nearly every command they run.&lt;/p&gt;
&lt;h3 id="navigating-command-history"&gt;navigating command history&lt;/h3&gt;
&lt;p&gt;Another glaring sign that it's your first day at the command line is re-typing a command you recently ran. The shell keeps a history of commands you ran and makes it easy to re-run a previous command because this is something that happens all the time in typical interactive shell usage. Here are some shell history basics that will keep you moving fast.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the up and down arrow keys to scroll back/forward through your history
&lt;ul&gt;
&lt;li&gt;CTRL-p (previous) and CTRL-n (next) do the same thing and touch typists may prefer these as your hands don't need to leave the home row&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And for something you remember running but it was far enough back that you'd need to hit the up arrow many times to find it, there is &lt;code&gt;CTRL-r&lt;/code&gt; for reverse interactive searching your history. Type &lt;code&gt;CTRL-r&lt;/code&gt; then any portion of the command you remember and the shell will search backward through your history for a match. Keep typing to find the exact match and hit &lt;code&gt;ENTER&lt;/code&gt; when you see it to re-run that command. If you need to edit it before running again to modify it slightly, use the arrow keys to move your cursor and the line will be loaded as your current command but not yet executed.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd &amp;#x2f;tmp
sudo restart nginx
ls &amp;#x2f;var&amp;#x2f;log
vi &amp;#x2f;tmp&amp;#x2f;some&amp;#x2f;file.txt
&amp;lt;CTRL-r&amp;gt;restart&amp;lt;ENTER&amp;gt; #&amp;lt;- quickly re-run the sudo restart nginx command
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="line-editing-keyboard-shortcuts"&gt;line editing keyboard shortcuts&lt;/h3&gt;
&lt;p&gt;Second only to re-typing previous commands in terms of obvious beginner indicators would be backspacing over most of a command to make an edit to the beginning of the command, then re-typing everything you deleted.&lt;/p&gt;
&lt;p&gt;Instead, use the shell's interactive line editing features. These are keyboard shortcuts taken from the 2 most popular command-line text editors: vi and emacs. Most shells support both of these. By default the bash shell loads the emacs keybindings. You can switch to vi bindings with &lt;code&gt;set -o vi&lt;/code&gt; and back to emacs with &lt;code&gt;set -o emacs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The most important ones for emacs are &lt;code&gt;CTRL-a&lt;/code&gt; to move the cursor to the beginning of the line and &lt;code&gt;CTRL-e&lt;/code&gt; to go to the end.&lt;/p&gt;
&lt;p&gt;If you use &lt;code&gt;vi&lt;/code&gt; for text editing, you'll love having all your favorite move/edit commands available.&lt;/p&gt;
&lt;h3 id="don-t-cd-for-one-off-commands"&gt;don't cd for one-off commands&lt;/h3&gt;
&lt;p&gt;Another common pattern I see with beginners at the command line is a tendency to &lt;code&gt;cd&lt;/code&gt; to a new directory for every command. Think of &lt;code&gt;cd&lt;/code&gt; like taking off your coat and staying a while. If you are just running a single command dealing with a different directory, there's no need to &lt;code&gt;cd&lt;/code&gt; to that directory first. &lt;code&gt;cd&lt;/code&gt; when you are going to stay in a single directory and run a bunch of commands for a while. This will keep your paths short since you can use relative paths and tab completion. But if you just want to create a directory in &lt;code&gt;/tmp&lt;/code&gt;, just run &lt;code&gt;mkdir /tmp/foo&lt;/code&gt; without &lt;code&gt;cd /tmp&lt;/code&gt; first.&lt;/p&gt;
&lt;p&gt;In particular, avoid the tendency to &lt;code&gt;cd&lt;/code&gt; every time you use the &lt;code&gt;ls&lt;/code&gt; command. It usually ends up causing you extra work to &lt;code&gt;cd&lt;/code&gt; back to your project directory. &lt;code&gt;ls&lt;/code&gt; can take the names of directories/files to list as command line arguments so instead of&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd &amp;#x2f;var&amp;#x2f;log
ls
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;just run&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ls &amp;#x2f;var&amp;#x2f;log
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="understand-space-delimited-args"&gt;understand space-delimited args&lt;/h3&gt;
&lt;p&gt;"Do I need to quote it?" is something beginners often ask. You may have heard that all the complex edge cases of bash quoting rules are complex and tricky, and that is indeed true. Here be dragons. However, for the basic cases, it's really simple. By default the command you enter is separated into distinct values on spaces. So if you enter &lt;code&gt;ls /tmp /home/me /var/log&lt;/code&gt; the shell is going to parse that as 4 distinct tokens with &lt;code&gt;ls&lt;/code&gt; being the program to run and each of the 3 directory paths as the arguments. So what that means is &lt;strong&gt;when a value you want to pass to a program contains a space, you need to quote it so the shell knows it is one value not several&lt;/strong&gt;. So if I have a file path with a space in it like &lt;code&gt;/tmp/uprade notes.txt&lt;/code&gt; and I want to pass that to the &lt;code&gt;wc&lt;/code&gt; program, I need to type &lt;code&gt;wc "/tmp/upgrade notes.txt"&lt;/code&gt; so the &lt;code&gt;wc&lt;/code&gt; program gets just 1 argument that is a valid filesystem path instead of 2 arguments: &lt;code&gt;/tmp/upgrade&lt;/code&gt; and &lt;code&gt;notes.txt&lt;/code&gt;, neither of which are valid. This rule applies to the shell entirely, and it doesn't matter which program is at the start of your command line command, the shell does the parsing before passing the values as arguments to the program being executed.&lt;/p&gt;
&lt;h2 id="part-two-breaking-boards"&gt;Part Two: Breaking Boards&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Breaking Boards" src="https://l7.alamy.com/zooms/94bc81f5d797471ebc5790c8ee4d90e7/female-breaking-boards-with-bare-fist-in-a-karate-demonstration-an0nnm.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Now that you've got the basics, let's add some intermediate skills and understanding that will make you more effective.&lt;/p&gt;
&lt;p&gt;Let's start with 2 issues that are a constant nuisance to beginners but once properly understood, immediately solvable every time for the intermediate developer.&lt;/p&gt;
&lt;h3 id="no-such-file-or-directory"&gt;no such file or directory&lt;/h3&gt;
&lt;p&gt;One of the core subsystem of every computer is a hierarchical data structure called the filesystem. Overall, it's pretty great. It's extremely general purpose and versatile while being pretty straightforward. However, it is pretty easy to get confused about filesystem paths and inadvertently ask the computer to read a file path that does not actually exist. Sadly, the common pattern for this is the bad path gets passed in from a high level application and the actual error doesn't occur until deep in the core of the OS where no context exists about who or what wants to read this file and for what purpose. So at the command line, the error message can often be entirely unhelpful "No such file or directory" with an unfamiliar path you've never heard of. This can be quite confusing and frustrating.&lt;/p&gt;
&lt;p&gt;However, once you understand the basics of the filesystem including importantly absolute paths, relative paths, &lt;code&gt;./&lt;/code&gt;, &lt;code&gt;../&lt;/code&gt;, symlinks, and the per-process current working directory, these errors suddenly all become trivial to solve.&lt;/p&gt;
&lt;p&gt;It's worth spending a few hours mastering this stuff so you can handle it properly once and for all.&lt;/p&gt;
&lt;h3 id="learn-how-command-lines-are-verbalized"&gt;learn how command lines are verbalized&lt;/h3&gt;
&lt;p&gt;When discussing things in person, on the phone, or over video chat, it helps to have a common understanding of how command line commands are verbalized so your coworker doesn't have to give you keystroke-by-keystroke instructions like your keyboard is the control panel of a Boeing 787.&lt;/p&gt;
&lt;p&gt;Pair up with someone and practice speaking command lines to each other and learn to parse what is a command name, which is a command line option, and how some of these odd unix/C abbreviations are pronounced.&lt;/p&gt;
&lt;p&gt;Here's a few examples to get you started:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"make dir dash P temp foo" = &lt;code&gt;mkdir -p /tmp/foo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;"L S  temp foo" = &lt;code&gt;ls /tmp/foo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;"vee eye etsy profile" = &lt;code&gt;vi /etc/profile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;"find dot dash name star dot text pipe to W C dash L" = &lt;code&gt;find . -name '*.txt' | wc -l&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="part-three-enter-the-dragon"&gt;Part Three: Enter the Dragon&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Enter the Dragon" src="https://latimesblogs.latimes.com/.a/6a00d8341c630a53ef0168e87fb4c5970c-600wi" /&gt;&lt;/p&gt;
&lt;p&gt;Here are a few more advanced techniques.&lt;/p&gt;
&lt;h3 id="learn-when-you-don-t-need-sudo"&gt;learn when you don't need sudo&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;sudo&lt;/code&gt; is a command that comes with some legacy baggage about what it is, why it is needed, and when to use it. I commonly see beginners try it at random when things don't work. Don't do this. &lt;code&gt;sudo&lt;/code&gt; let's you run an individual command with full root permissions. You need it when doing sysadmin type things like installing software system-wide, applying security patches, editing core OS configuration files, starting and stopping system services etc. You should NOT need it for doing normal user things like running read-only commands, managing files within your home directory, running programs that are already installed, etc. Read through an &lt;a href="https://www.linux.com/learn/tutorials/306766:linux-101-introduction-to-sudo"&gt;introduction to sudo&lt;/a&gt; and get clear on excatly when it is or is not necessary.&lt;/p&gt;
&lt;h3 id="osx-pbpaste-pbcopy"&gt;OSX pbpaste/pbcopy&lt;/h3&gt;
&lt;p&gt;If you work on OSX for development, the &lt;code&gt;pbpaste&lt;/code&gt; and &lt;code&gt;pbcopy&lt;/code&gt; commands are convenient bridges from the main OS clipboard ("pasteboard" is what the "pb" stands for) and the command line. For example, if you copy a bunch of text in your editor and want to see how many characters there are, you can run &lt;code&gt;pbpaste | wc -c&lt;/code&gt; on the command line. Similarly, if you want to copy a program's output you can pipe data into &lt;code&gt;pbcopy&lt;/code&gt;. For example, I might run something like &lt;code&gt;npm run lint | pbcopy&lt;/code&gt; if I know that is going to print out a bunch of errors that I want to work through one at a time. I'll then paste it into an empty buffer in my text editor so I can fix each item then delete it's line from my editor buffer until I'm done.&lt;/p&gt;
&lt;h3 id="use-short-lived-functions-and-aliases"&gt;use short-lived functions and aliases&lt;/h3&gt;
&lt;p&gt;Many advanced command line users learn to effectively define aliases and shell functions in their dotfiles to improve their productivity. This is a great idea and a programmer's dotfiles can serve as an essential tool as well as a source of pride and the occasional geek contest about whose dotfiles are more sophisticated/ridiculous.&lt;/p&gt;
&lt;p&gt;However, one practice I see less often but is also really useful is defining quick aliases or functions just for the current session. I often do this if I know I'll need to run a series of commands over and over in a sequence like edit some code, stop a service, copy new code into place, restart a service. I might quickly define an alias for all those steps like &lt;code&gt;alias r="cp ./src /deploy &amp;amp;&amp;amp; stop myapp &amp;amp;&amp;amp; start myapp"&lt;/code&gt;. This lets me focus on a rapid turnaround in my edit/test cycle and makes me more effective.&lt;/p&gt;
&lt;h3 id="share-your-dotfiles-on-github"&gt;share your dotfiles on github&lt;/h3&gt;
&lt;p&gt;The conventional name for the repo where your dotfiles live on github is just "dotfiles" and by searching around you can find and study how others use the shell. It feels a little bit like getting a tour of someone's workshop and you can readily see people's styles and preferences. Perhaps the most famous repo is &lt;a href="https://github.com/mathiasbynens/dotfiles"&gt;Mathias Bynens dotfiles&lt;/a&gt; with over 11K stars on github.&lt;/p&gt;
&lt;h3 id="use-long-options-in-shell-scripts-for-readability"&gt;use long options in shell scripts for readability&lt;/h3&gt;
&lt;p&gt;When typing interactive commands, brevity is good for speed and convenience. However, when you are writing a script that is getting checked into source code management as part of a project, consider using the long options. This will make it easier to read the script and understand what it does for the maintainers, who are unlikely to be as intimately familiar with every command your script runs as you were when you wrote it.&lt;/p&gt;
&lt;p&gt;So instead of:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -b &amp;#x27;active=1&amp;#x27; -D &amp;#x2f;tmp&amp;#x2f;foo \
  -e http:&amp;#x2f;&amp;#x2f;example.com -O http:&amp;#x2f;&amp;#x2f;example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Code it as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl \
  --cookie &amp;#x27;active=1&amp;#x27; \
  --dump-header &amp;#x2f;tmp&amp;#x2f;headers.txt \
  --referer http:&amp;#x2f;&amp;#x2f;example.com \
  --remote-name \
  http:&amp;#x2f;&amp;#x2f;example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The longer names will tend to be easier to understand without referring to the documentation. The backslash-continued lines also help with readability.&lt;/p&gt;
&lt;h2 id="references-and-further-reading"&gt;references and further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;My &lt;a href="https://github.com/focusaurus/dotfiles"&gt;dotfiles on github&lt;/a&gt;. Feel free to study and mine for snippets.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tpope/tpope"&gt;Tim Pope's dotfiles&lt;/a&gt;. Maybe yours would look like this if you had written a hundred vim plugins&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/search?o=desc&amp;amp;q=dotfiles&amp;amp;s=stars&amp;amp;type=Repositories&amp;amp;utf8=%E2%9C%93"&gt;Github dotfiles repos sorted by most stars&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.catonmat.net/download/readline-emacs-editing-mode-cheat-sheet.pdf"&gt;Bash Emacs Editing Mode Cheat Sheet&lt;/a&gt; by Peteris Krumins who writes &lt;a href="http://www.catonmat.net/"&gt;an outstanding blog with incredible unix expertise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://redsymbol.net/articles/unofficial-bash-strict-mode/"&gt;The Unofficial Bash Strict Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://quickleft.com/blog/tag/command-line/"&gt;Jessica Dillon's great command line tutorial series&lt;/a&gt; on the Quick Left Blog&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.shellcheck.net/"&gt;Shell Check&lt;/a&gt; shell script linter&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sstephenson/bats"&gt;Bash Automated Testing System&lt;/a&gt;
by Sam Stephenson&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/robbyrussell/oh-my-zsh"&gt;Oh My Zsh&lt;/a&gt; Popular plugin system for customizing zsh&lt;/li&gt;
&lt;/ul&gt;</description><author>Pete's Points</author><pubDate>Sun, 06 Dec 2015 19:52:52 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2015/12/command-line:-newbie-to-ninja/</guid></item><item><title>Study Notes In The Information Age</title><link>https://blog.nawaz.org/posts/2015/Dec/study-notes-in-the-information-age/</link><description>&lt;p&gt;It has been a long time since I was a college student. In those days I
took all my notes in the classroom with a notebook. One notebook for
each&amp;nbsp;course.&lt;/p&gt;
&lt;p&gt;Looking back at the experience, this had some down&amp;nbsp;sides:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Some of what I wrote down was &amp;#8220;useless&amp;#8221;. Things …&lt;/li&gt;&lt;/ol&gt;</description><author>Beetle Space</author><pubDate>Sun, 06 Dec 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.nawaz.org/posts/2015/Dec/study-notes-in-the-information-age/</guid></item><item><title>Flutter bookmarks</title><link>https://xenodium.com/flutter-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?list%3DPLOU2XLYxmsIIQorIS8gagUiMau9S84vZV&amp;amp;v%3DPnIWl33YMwA"&gt;Eric Seidel introduces Sky, Dart Developer Summit 2015 (YouTube)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.didierboelens.com/2019/01/futures---isolates---event-loop/"&gt;Flutter - Futures - Isolates - Event Loop&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18958747"&gt;Flutter: Futures, Isolates, Event Loop (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/asos-techblog/flutter-vs-react-native-for-ios-android-app-development-c41b4e038db9"&gt;Flutter: the good, the bad and the ugly – The ASOS Tech Blog – Medium&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 06 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/flutter-bookmarks</guid></item><item><title>Swift bookmarks</title><link>https://xenodium.com/swift-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.uraimo.com/2016/01/06/10-Swift-One-Liners-To-Impress-Your-Friends/"&gt;10 Swift One Liners To Impress Your Friends&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://binarapps.com/blog/5-secrets-of-swift-api-design"&gt;5 secrets of Swift API design&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.swiftbysundell.com/articles/5-small-but-significant-improvements-in-swift-5-1/"&gt;5 small but significant improvements in Swift 5.1 | Swift by Sundell&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://forums.swift.org/t/state-messing-with-initializer-flow/25276/10"&gt;@State messing with initializer flow - Using Swift - Swift Forums&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/CosmicMind/Material"&gt;A beautiful graphics framework for Material Design in Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/airbnb/MagazineLayout"&gt;A collection view layout capable of laying out views in vertically scrolling grids and lists (AirBnB)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wwdcbysundell.com/2019/diffable-data-sources-first-look/"&gt;A first look at the new diffable data sources for table views and collection view&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=20908452"&gt;A Technology Freelancer's Guide to Starting a Worker Cooperative&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@eneko/aes256-cbc-file-encryption-from-the-command-line-with-swift-cd1f88f2e1ec"&gt;AES256-CBC File Encryption from the Command Line with Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://talk.objc.io/episodes"&gt;All Episodes · Swift Talk · objc.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.objc.io/books/app-architecture/"&gt;App Architecture (objc.io)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.swiftbysundell.com/posts/asyncawait-in-swift-unit-tests"&gt;Async/await in Swift unit tests&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.swiftbysundell.com/articles/avoiding-race-conditions-in-swift/"&gt;Avoiding race conditions in Swift | Swift by Sundell&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Awesome-Server-Side-Swift/TheList"&gt;Awesome server side swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hsavit1/Awesome-Swift-Education"&gt;Awesome-Swift-Education&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.swiftbysundell.com/posts/building-dsls-in-swift"&gt;Building DSLs in Swift (Swift by Sundell)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://davedelong.com/blog/2018/07/25/conditional-compilation-in-swift-part-1/"&gt;Conditional Compilation in Swift, Part 1 (Dave DeLong)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.swiftbysundell.com/posts/constructing-urls-in-swift"&gt;Constructing URLs in Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackingwithswift.com/read/4/2/creating-a-simple-browser-with-wkwebview"&gt;Creating a simple browser with WKWebView in Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/danielmartin/swift-info"&gt;Curated Swift 5 documentation and reference in GNU Info format&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://forums.swift.org/t/debugging-sourcekit-lsp-using-lldb/28328/14"&gt;Debugging sourcekit-lsp using LLDB - LLDB - Swift Forums&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.swiftbysundell.com/articles/deciding-whether-to-adopt-new-swift-technologies/"&gt;Deciding whether to adopt new Swift technologies | Swift by Sundell&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theswiftdev.com/deep-dive-into-swift-frameworks/"&gt;Deep dive into Swift frameworks - The.Swift.Dev.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/krzysztofzablocki/Difference"&gt;Difference: diff between 2 Swift object instances&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.swiftbysundell.com/articles/encapsulating-configuration-code-in-swift/"&gt;Encapsulating configuration code in Swift | Swift by Sundell&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://talk.objc.io/episodes/S01E125-building-a-responsive-layout"&gt;Episode 125 – Building a Layout Library: Building a Responsive Layout · Swift Talk · objc.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swiftunboxed.com/protocols/equatable/"&gt;Equatable - Swift Unboxed&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nshipster.com/formatter/"&gt;Formatting everything in swift (lovation, dates, time)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.polpiella.dev/from-nsregular-expression-to-swift-regex"&gt;From NSRegularExpression to SwiftRegex&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mpangburn/FunctionKit/blob/master/README.md"&gt;FunctionKit/README.md at master · mpangburn/FunctionKit · GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rshankar.com/get-your-current-address-in-swift/"&gt;Get your current address in Swift – Ravi Shankar&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kinderas.com/technology/2014/6/7/getting-started-with-wkwebview-using-swift-in-ios-8"&gt;Getting started with WKWebView using Swift in iOS 8&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grokswift.com/uitextfield"&gt;Getting to know UITextField&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/almassapargali/LocationPicker"&gt;GitHub - almassapargali/LocationPicker (Swift)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anas-p/ImagePicker"&gt;GitHub - anas-p/ImagePicker: UIImagePickerController for camera and photo library&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/burczyk/XcodeSwiftSnippets"&gt;GitHub - burczyk/XcodeSwiftSnippets: Swift 4 code snippets for Xcode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/DevLiuSir/CircleProgressBar"&gt;GitHub - DevLiuSir/CircleProgressBar: This is a simple animation circle progress bar&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hyperoslo/Cache"&gt;GitHub - hyperoslo/Cache: Nothing but Cache.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/liuliu/dflat"&gt;GitHub - liuliu/dflat: Structured Data Store for Mobile&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/phynet/iOS-URL-Schemes"&gt;GitHub - phynet/iOS-URL-Schemes: iOS URL list schemes (Settings)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Raizlabs/BonMot"&gt;GitHub - Raizlabs/BonMot: Beautiful, easy attributed strings in Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raywenderlich/swift-algorithm-club"&gt;GitHub - raywenderlich/swift-algorithm-club: Swift Algorithm Club&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/saoudrizwan/Disk"&gt;GitHub - saoudrizwan/Disk: Delightful framework for iOS to easily persist strcts, images, and data&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/swift-embedded/swift-embedded"&gt;GitHub - swift-embedded/swift-embedded: Swift for Embedded Systems &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zhuorantan/LocationPicker"&gt;GitHub - zhuorantan/LocationPicke (Swift)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/better-programming/how-to-add-compiled-frameworks-in-swift-package-manager-f0cdbde84fc7"&gt;How to Add Compiled Frameworks in Swift Package Manager&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://browniefed.com/blog/2015/11/28/react-native-how-to-bridge-a-swift-view/"&gt;How to bridge a Swift View&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackingwithswift.com/example-code/cryptokit/how-to-calculate-the-sha-hash-of-a-string-or-data-instance"&gt;How to calculate the SHA hash of a String or Data instance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whatdidilearn.info/2018/07/29/how-to-capture-regex-group-values-in-swift.html"&gt;How to capture Regex group values in Swift | What did I learn&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackingwithswift.com/example-code/networking/how-to-check-for-internet-connectivity-using-nwpathmonitor"&gt;How to check for internet connectivity using NWPathMonitor&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackingwithswift.com/example-code/games/how-to-create-a-random-terrain-tile-map-using-sktilemapnode-and-gkperlinnoisesource"&gt;How to create a random terrain tile map using SKTileMapNode and GKPerlinNoiseSource&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackingwithswift.com/example-code/system/how-to-run-an-external-program-using-process"&gt;How to run an external program using Process&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.globalnerdy.com/2020/05/28/how-to-work-with-dates-and-times-in-swift-5-part-4-adding-swift-syntactic-magic/"&gt;How to work with dates and times in Swift 5, part 4: Adding Swift syntactic sugar&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/olebegemann/status/1004458683428950018?s=12"&gt;I made a “What’s new in Swift 4.2” playground&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/3554244/uiimagepngrepresentation-issues-images-rotated-by-90-degrees"&gt;iphone - UIImagePNGRepresentation issues? / Images rotated by 90 degrees&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bignerdranch.com/blog/it-looks-like-youre-still-trying-to-use-a-framework/"&gt;It Looks Like You're Still Trying to Use/Create a Swift Framework&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=XJreRR0cC3E"&gt;Jason Zurita - Compositional UI Styling in Swift - YouTube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://khanlou.com/2016/07/implementing-dictionary-in-swift/"&gt;Khanlou | Implementing Dictionary In Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@PavelGnatyuk/large-title-and-search-in-ios-11-514d5e020cee"&gt;Large Title and Search in iOS 11 – Pavel Gnatyuk – Medium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hyperoslo/Lightbox"&gt;Lightbox is a convenient and easy to use image viewer for your iOS app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zhuorantan/LocationPicker"&gt;Location picker: A ready for use and fully customizable location picker for your app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://steipete.com/posts/logging-in-swift/"&gt;Logging in Swift | steipete's blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raywenderlich.com/731-macos-development-for-beginners-part-1"&gt;macOS Swift Development for Beginners: Part 1&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/MartinLasek/status/1256349442472505344"&gt;Martin Lasek on Twitter: &amp;quot;Handling prices in Swift.&amp;quot;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://oleb.net/2018/objc-swift-transition/"&gt;Migrating an Objective-C class to Swift: a piecemeal approach – Ole Begemann&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theswiftdev.com/migrating-from-cocoapods-to-swift-package-manager/"&gt;Migrating from CocoaPods to Swift Package Manager - The.Swift.Dev.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/thecreateschool/migrating-from-swift-4-to-swift-5-2f425b99436b"&gt;Migrating from Swift 4 to Swift 5 – The Create School – Medium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ericasadun.com/2018/12/14/more-fun-with-swift-5-string-interpolation-radix-formatting/"&gt;More fun with Swift 5 String Interpolation: Radix (Erica Sadun)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/netguru/swift-style-guide"&gt;Netguru's Swift Style Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nshipster.com/never/"&gt;Never: Eliminating Impossible States in Swift Generic Types - NSHipster&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lukakerr.github.io/swift/nswindow-styles"&gt;NSWindow Styles | lukakerr.github.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/ios-os-x-development/optionals-in-swift-for-newbies-7199a30707d5"&gt;Optionals in Swift for newbies&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mxcl/Path.swift"&gt;Path.swift: Delightful, robust, cross-platform and chainable file-pathing functions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bignerdranch.com/blog/pro-pattern-matching-in-swift/"&gt;Pro Pattern-Matching in Swift - Digital product development agency | Big Nerd Ranch&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nshipster.com/swift-regular-expressions/"&gt;Regular Expressions in Swift (groups) - NSHipster&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zacwood.me/2018/09/09/simple-networking-swift/"&gt;Simple networking in Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.swiftbysundell.com/posts/slot-based-ui-development-in-swift"&gt;Slot-based UI development in Swift (Sundell)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.donnywals.com/splitting-a-json-object-into-an-enum-and-an-associated-object-with-codable/"&gt;Splitting a JSON object into an enum and an associated object with Codable&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swiftbysundell.com/articles/splitting-up-swift-types/"&gt;Splitting up Swift types | Swift by Sundell&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/seorenn/SRChoco"&gt;SRChoco: Seorenn's Development Libraries for OS X and iOS (github)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[[&lt;a href="https://twitter.com/steipete/status/1281578201165320192"&gt;https://twitter.com/steipete/status/1281578201165320192&lt;/a&gt;][String(string[currentIndex])]].&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/43797913/how-to-authenticate-a-grpc-call-for-the-assistant-sdk"&gt;Swift - How to authenticate a gRPC call for the Assistant SDK?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ericasadun.com/2018/12/16/swift-5-interpolation-part-3-dates-and-number-formatters/"&gt;Swift 5 Interpolation Part 3: Dates and Number Formatters (Erica Sadun)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nshipster.com/vscode/"&gt;Swift Development with Visual Studio Code - NSHipster&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.h4labs.com/dev/ios/swift.html"&gt;Swift Resources&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mxcl/swift-sh"&gt;swift sh adds automatic dependency loading in scripts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pragprog.com/book/esswift2/swift-style-second-edition"&gt;Swift Style, Second Edition: An Opinionated Guide to an Opinionated Language by Erica Sadun (The Pragmatic Bookshelf)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.objc.io/blog/2018/10/02/using-appkit-from-the-command-line/"&gt;Swift Tip: Using AppKit from the Command-line · objc.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swift.org/blog/argument-parser/"&gt;Swift.org - Announcing ArgumentParser&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swift.org/documentation/api-design-guidelines/"&gt;Swift.org - API Design Guidelines&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/apple/swift/blob/master/docs/ErrorHandlingRationale.rst"&gt;swift/ErrorHandlingRationale.rst at master · apple/swift · GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/LeonardoCardoso/SwiftLinkPreview"&gt;SwiftLinkPreview: Link Previewer for iOS, macOS, watchOS and tvOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://swiftmonthly.com/"&gt;SwiftMothly&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=44917450"&gt;TextKit 2 – The Promised Land | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackingwithswift.com/articles/136/the-complete-guide-to-optionals-in-swift"&gt;The Complete Guide to Optionals in Swift – Hacking with Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/TheSwiftLanguage"&gt;The Shift Language (YouTube)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swiftpm.co/"&gt;The SwiftPM Library, a place to find packages for Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/scottberrevoets/status/1151228835947401216"&gt;Today marks 4 years since shipping the first release of the rewrite of the Lyft app in Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://troz.net/"&gt;TrozWare blogs on Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/the-traveled-ios-developers-guide/uilayoutguide-6b3b552b1890"&gt;UILayoutGuide – The Traveled iOS Developer’s Guide – Medium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swiftrocks.com/understanding-dispatchqueues.html"&gt;Understanding DispatchQueues - SwiftRocks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackingwithswift.com/quick-start/understanding-swift"&gt;Understanding Swift - free quick start tutorials for Swift developers (hackingwithswift)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aozsky.com/swift/swift_ide"&gt;Use Neovim as Swift IDE - The Go Blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.swiftbysundell.com/posts/using-errors-as-control-flow-in-swift"&gt;Using errors as control flow in Swif (Sundell)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@PhiJay/why-swift-enums-with-associated-values-cannot-have-a-raw-value-21e41d5ec11"&gt;Why Swift Enums with Associated Values Cannot Have a Raw Value&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nshipster.com/wkwebview"&gt;WKWebView (NSHipster)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.slideshare.net/SommerPanage1/writing-your-app-swiftly/SommerPanage1/writing-your-app-swiftly"&gt;Writing Your App Swiftly&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 06 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/swift-bookmarks</guid></item><item><title>Load Lua RADOS classes from local file system</title><link>https://makedist.com/posts/2015/12/06/load-lua-rados-classes-from-local-file-system/</link><description>Supporting the &lt;em&gt;installation&lt;/em&gt; of Lua-based RADOS object classes.</description><author>Noah Watkins</author><pubDate>Sun, 06 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2015/12/06/load-lua-rados-classes-from-local-file-system/</guid></item><item><title>Overlay Network Performance of Docker</title><link>/posts/2015-12-05-docker-overlay-performance/</link><description>Since Docker 1.9, the multi-host networks can be used very easily. All you have to do is just setup your Swarm cluster and use docker network create -d mynet and voila: Your multi host network is ready. I want to do a benchmark of this new feature, however, the official multi host networking examples are in Virtualbox and local performance can be misleading. I created an image called mustafaakin/alpine-iperf just has the Alpine image plus iperf network benchmarking tool installed.</description><author>Mustafa Akın</author><pubDate>Sat, 05 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">/posts/2015-12-05-docker-overlay-performance/</guid></item><item><title>World of Commodore conference</title><link>https://jasoneckert.github.io/myblog/world-of-commodore-conference/</link><description>&lt;p&gt;&lt;img alt="WOC1" src="woc1.png#center" title="WOC1" /&gt;&lt;/p&gt;
&lt;p&gt;This is the first year that I’ve been to the World of Commodore event in Mississauga, Ontario. It&amp;rsquo;s a yearly gathering of Commodorks who create new software and hardware for vintage Commodore computers. I had no idea that it even existed until someone I knew told me about it. Since it’s relatively close to me, I just had to go. Plus, I have many Commodore computers in my vintage computer collection.&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Sat, 05 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/world-of-commodore-conference/</guid></item><item><title>[Computing] TLS and the Policy MitM Armageddon</title><link>https://www.devever.net/~hl/policymitm</link><description>&lt;p&gt;&lt;a href="http://telecom.kz/en/news/view/18729"&gt;Kazakhstan&lt;/a&gt; has announced that it will
be performing Man-in-the-Middle attacks on all HTTPS traffic from the beginning
of 2016. Users in Kazakhstan will be forced to install the CA certificate of a
rogue CA in order to allow their traffic to be intercepted.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Thu, 03 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/policymitm</guid></item><item><title>Creating a horizontal comparison bar chart using Tableau</title><link>https://blog.christoolivier.com/p/creating-a-horizontal-comparison-bar-chart-using-tableau</link><description>I have put together a screencast with some step by step instructions on how to create a horizontal comparison bar chart in Tableau.</description><author>Christo’s Blog</author><pubDate>Thu, 03 Dec 2015 01:02:38 GMT</pubDate><guid isPermaLink="true">https://blog.christoolivier.com/p/creating-a-horizontal-comparison-bar-chart-using-tableau</guid></item><item><title>Snow Leopard Server with Mavericks clients, and why to avoid Mac Server</title><link>https://jonathanchang.org/blog/snow-leopard-server-with-mavericks-clients/</link><description>&lt;p&gt;&lt;em&gt;Note: the below text was written in 2014 but never posted. I have kept the same tense since I don’t want to rewrite it.&lt;/em&gt;&lt;/p&gt;
  &lt;p&gt;Our lab has a setup where we have multiple workstation iMacs that connect to a Mac Mini server, with network accounts stored on the server. Previously, both server and clients were running Snow Leopard, but I’ve just upgraded two of the clients to Mavericks while keeping the server on Snow Leopard. (Upgrading to Mavericks server costs money). I’ve been running this setup for a few weeks now and nothing major seems to have broken. For details of our lab’s setup, and why you should avoid Mac Server, read on…&lt;/p&gt;
  &lt;p&gt;In 2011 my advisor purchased an expensive Mac Mini Snow Leopard server for the lab, to store data generated by the lab and do other things that only servers can do. The lab had several iMacs that served as workstations for lab members, as well as a Mac Pro used for data analysis. Data were originally stored on the Mac Pro as well, but with the new server we could separate those tasks and use the Mac Pro only for analysis work.&lt;/p&gt;
  &lt;p&gt;At the time, I didn’t do too much research into Mac Server and assumed that things would “just work” out of the box. I also figured that the best way to handle the “data storage” aspect was to store everything on the server, including user accounts. In essence, this means that user home directories were stored server-side and all home folder access and user authentication is done over the network.&lt;/p&gt;
  &lt;p&gt;The network account system has a couple of advantages. Every member of the lab could have their own account, files, and settings, that would work regardless of which computer they signed in on. It’s actually really cool to be able to just sign out of one computer and then sit down at another and keep going right where you left off. Central control of user data and user accounts also meant that backups were also centralized, hopefully insuring against data being lost because it was on an old machine that was rarely used.&lt;/p&gt;
  &lt;p&gt;However, the drawbacks are pretty significant. The major one is that the server is a single point of failure for every single person. Originally, if the file server was down, you couldn’t get access to the shared lab data, but your own data were still intact on your workstation. Now, if either the server or the network were down, you couldn’t login to your own computer, never mind access your files.&lt;/p&gt;
  &lt;p&gt;Other quality of life issues include:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Time Machine backups won’t work on the server due to bad interactions with Open Directory databases. We use rsnapshot to the other internal drive and CCC to an external drive.&lt;/li&gt;
    &lt;li&gt;Home directories served over AFP prevent multiple accounts being signed into the same workstation. This is because the first user signed in will mount the AFP share under /Users with their own permissions, so the second user will try to mount the same share, fail due to permission issues, and throw a cryptic error message confusing everyone.&lt;/li&gt;
    &lt;li&gt;Home directories served under NFS don’t play nice with many programs, especially ones that assume that all user directories on Macs is stored under /Users. I also encountered a bug with Dropbox not working since it was trying to acquire a file lock and failing (probably because Apple’s NFS implementation was bad, or perhaps that NFS in general is bad). To Dropbox’s credit, I emailed their support team and they eventually fixed the bug.&lt;/li&gt;
    &lt;li&gt;Every client computer’s DNS must point to the server computer. This actually isn’t necessary if your upstream DNS assigns a fixed hostname for your server. Ours does, but the problem is that I originally configured the server to have a different hostname than its actual name. Once past the initial setup, changing the server’s name is so onerous that most guides I consulted recommended doing a clean install of Mac Server with the correct hostname. By running your own DNS and pointing all client computers to your server, the server can lie to itself and its connecting clients about its own name and thus everyone is happy. Note that it’s actually possible to change the hostname: during initial setup I made a typo in one of the boxes that you must enter the hostname into and in doing so created a difficult to track down bug that caused client computers to sometimes stall during login for minutes at a time. Tracking down this one involved looking at a lot of log files and noticing attempts to connect to an incorrectly-spelled host. I fixed this one by looking through all the configuration files for the misspelled name and correcting it.&lt;/li&gt;
    &lt;li&gt;You will be terrified of restarting the server for updates. Every time I have updated the server, it refuses to work correctly in spectacular and exciting new ways. This one has probably shortened my life expectancy by a couple of years, at least.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;&lt;strong&gt;Update 2015&lt;/strong&gt;: Basically, I don’t think using OS X server is Worth It. Thankfully Apple seems to have scaled back their server offerings so hopefully no one else is falling into this trap. Our new setup uses a dedicated network appliance (Synology NAS) to serve files, combined with several (quite beefy) shared Linux workstations. All devices can connect to the Synology NAS over NFS. The issue of having shared desktops but personal accounts is no longer a problem, since all analyses are performed on the workstations, and everyone has their own personal laptop that they used to remotely login to the shared workstations. Although this is less secure in the sense that it’s possible for people to trample over each other’s files, in practice this hasn’t really been that big of an issue. There are separate horrors associated with accessing an NFS share on Linux systems with automount, but I’ll save that for a separate post.&lt;/p&gt;</description><author>Jonathan Chang</author><pubDate>Tue, 01 Dec 2015 08:54:08 GMT</pubDate><guid isPermaLink="true">https://jonathanchang.org/blog/snow-leopard-server-with-mavericks-clients/</guid></item><item><title>Denim Tablet Case</title><link>https://june.kim/tablet-case/</link><author>june.kim</author><pubDate>Tue, 01 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/tablet-case/</guid></item><item><title>Links - December 1st, 2015</title><link>https://faingezicht.com/links/2015/12/01/links/</link><description>I have been listening to &lt;a href="https://gimletmedia.com/show/startup/"&gt;Startup&lt;/a&gt; the past couple of days, so I have not been reading that much lately. It provides a view of the tech and startup world from an outsider's perspective, and when discussing concepts that I take as general knowledge it constantly makes me think "Wait, most people don't know that?" 

If you have not listened to it, you should.</description><author>Avy Faingezicht</author><pubDate>Tue, 01 Dec 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/12/01/links/</guid></item><item><title>Node, Postgres, MassiveJS - A better database experience</title><link>/2015/11/30/Node-Postgres-MassiveJS-A-better-database-experience/</link><description>&lt;p&gt;First some background–I&amp;rsquo;ve always had a bit of a love hate relationship with ORMs. ORMs are great for basic crud applications, which inevitably happens at some point for an app. The main two problems I have with ORMs is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;They treat all databases as equal (yes, this is a little overgeneralized but typically true). They claim to do this for database portability, but in reality an app still can&amp;rsquo;t just up and move from one to another.&lt;/li&gt;
&lt;li&gt;They don&amp;rsquo;t handle complex queries well at all. As someone that sees SQL as a very powerful language, taking away all the power just leaves me with pain.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Of course these aren&amp;rsquo;t the &lt;a href="https://kev.inburke.com/kevin/faster-correct-database-queries/"&gt;only issues&lt;/a&gt; with them, just the two ones I personally run into over and over.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In some playing with Node I was optimistic to explore &lt;a href="http://massive-js.readthedocs.org"&gt;Massive.JS&lt;/a&gt; as it seems to buck the trend of just imitating all other ORMs. My initial results–it makes me want to do more with Node just for this library. After all the power of a language is the ecosystem of libraries around it, not just the core language. So let&amp;rsquo;s take a quick tour through with a few highlights of what makes it really great.&lt;/p&gt;
&lt;h3 id="getting-setup"&gt;
&lt;div&gt;
Getting setup
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Without further adieu here&amp;rsquo;s a quick tour around it.&lt;/p&gt;
&lt;p&gt;First let&amp;rsquo;s pull down the example database from &lt;a href="http://postgresguide.com/setup/example.html"&gt;PostgresGuide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Then let&amp;rsquo;s setup out Node app:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ npm init
$ npm install massive --save
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="connecting-and-querying"&gt;
&lt;div&gt;
Connecting and querying
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Now let&amp;rsquo;s try to connect and say query a user from within our database. Create the following as an &lt;code&gt;index.js&lt;/code&gt; file, then run with &lt;code&gt;node index.js&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var massive = require(&amp;quot;massive&amp;quot;);
var connectionString = &amp;quot;postgres://ckerstiens:@localhost/example&amp;quot;;
var db = massive.connectSync({connectionString : connectionString});
db.users.find(1, function(err,res){
console.log(res);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Upon first run if you&amp;rsquo;re like me and use the &lt;a href="http://postgresguide.com/setup/example.html"&gt;PostgresGuide example database&lt;/a&gt; (which I now need to go back and tidy up), you&amp;rsquo;ll get the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;db.users.find(1, function(err,res){
^
TypeError: Cannot read property 'find' of undefined
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I can&amp;rsquo;t describe how awesome it is to see this. What&amp;rsquo;s happening is when Massive loads up it&amp;rsquo;s connecting to your database, checking what tables you have. In this case though because we don&amp;rsquo;t have a proper primary key defined it doesn&amp;rsquo;t load them. It could treat id as some magical field of course like Rails used to and ignore the need for an index, but instead it not only encourages a good database design but requires it.&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s go back and create our index in our database:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ psql example
$ alter table users add primary key (id);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alright now let&amp;rsquo;s run our script again with &lt;code&gt;node index.js&lt;/code&gt; and see what we have:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{ id: 1,
email: 'john.doe@gmail.com',
created_at: Thu Sep 24 2015 03:42:52 GMT-0700 (PDT),
deleted_at: null }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Perfect! Now we&amp;rsquo;re all connected and it even queried our database for us. Now let&amp;rsquo;s take a few more look at some of the operators.&lt;/p&gt;
&lt;h3 id="running-an-arbitrary-query"&gt;
&lt;div&gt;
Running an arbitrary query
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;db.run&lt;/code&gt; will let me run any arbritrary SQL. An example such as &lt;code&gt;db.run(&amp;quot;select 'hello'&amp;quot;)&lt;/code&gt; will produce [ { &amp;lsquo;?column?&amp;rsquo;: &amp;lsquo;hello&amp;rsquo; } ].&lt;/p&gt;
&lt;p&gt;This makes it nice and easier for us to break out of the standard ORM model and just run SQL.&lt;/p&gt;
&lt;h3 id="find-for-quick-look-ups"&gt;
&lt;div&gt;
Find for quick look ups
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Similar to so many other database tools &lt;code&gt;find&lt;/code&gt; will offer you the most common quick look ups:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ db.users.find({email: 'jane.doe@gmail.com'}, function(err, res){console.log(res)});
$ db.users.find({'created_at &amp;gt;': '2015-09-24'}, function(err, res){console.log(res)});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And of course there&amp;rsquo;s a where operator for multiple conditions.&lt;/p&gt;
&lt;h3 id="structuring-queries-in-your-application"&gt;
&lt;div&gt;
Structuring queries in your application
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;While in the next post I&amp;rsquo;ll dig in deep to JSON, this is perhaps my favorite feature of Massive&amp;hellip; It&amp;rsquo;s design for pulling out queries into individudal SQL files. Simply create a &lt;code&gt;db&lt;/code&gt; folder and put your SQL in there. Let&amp;rsquo;s take the most basic example of our user email lookup and put it in &lt;code&gt;user_lookup.sql&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT *
FROM users
WHERE email = $1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now back in our application we can run this and pass in a parameter to it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;db.user_lookup(['jane.doe@gmail.com'], function(err,res){
console.log(res);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This separation of our queries from our code makes it easier to track them, view diffs, and even more so &lt;a href="http://www.craigkerstiens.com/2012/11/17/how-i-write-sql/"&gt;create very readable SQL&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="up-next"&gt;
&lt;div&gt;
Up next
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;So sure, you can connect to a database, you can query some things. There were a couple of small but more novel things that we blew through in here. First is the fact I didn&amp;rsquo;t have to define all my schema, it just knew it as &lt;a href="http://www.craigkerstiens.com/2014/01/24/rethinking-limits-on-relational/"&gt;it really should&lt;/a&gt;. The separation of SQL queries you&amp;rsquo;ll custom write into files is simple, but will make for much more maintainable applications over the long term. And best of all is the JSON support, which I&amp;rsquo;ll get to soon&amp;hellip;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Mon, 30 Nov 2015 22:55:56 GMT</pubDate><guid isPermaLink="true">/2015/11/30/Node-Postgres-MassiveJS-A-better-database-experience/</guid></item><item><title>We Are Your Friends</title><link>https://olshansky.info/movie/we_are_your_friends/</link><description>Olshansky's review of We Are Your Friends</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 30 Nov 2015 09:30:25 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/we_are_your_friends/</guid></item><item><title>RAM is the new disk – and how to measure its performance – Part 3 – CPU Instructions &amp;amp; Cycles</title><link>https://tanelpoder.com/2015/11/30/ram-is-the-new-disk-and-how-to-measure-its-performance-part-3-cpu-instructions-cycles/</link><description>&lt;p&gt;&lt;em&gt;If you haven’t read the previous parts of this series yet, here are the links:&lt;/em&gt; [ &lt;a href="https://tanelpoder.com/2015/08/09/ram-is-the-new-disk-and-how-to-measure-its-performance-part-1/" target="_blank"&gt;Part 1&lt;/a&gt; | &lt;a href="https://tanelpoder.com/2015/09/21/ram-is-the-new-disk-and-how-to-measure-its-performance-part-2-tools/" target="_blank"&gt;Part 2&lt;/a&gt; ].&lt;/p&gt;
&lt;h3 id="a-refresher"&gt;A Refresher&lt;/h3&gt;
&lt;p&gt;In the &lt;a href="https://tanelpoder.com/2015/08/09/ram-is-the-new-disk-and-how-to-measure-its-performance-part-1/" target="_blank"&gt;first part&lt;/a&gt; of this series I said that RAM access is the slow component of a modern in-memory database engine and for performance you’d want to reduce RAM access as much as possible. Reduced memory traffic thanks to the new columnar data formats is the most important enabler for the awesome In-Memory processing performance and SIMD is just icing on the cake.&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://tanelpoder.com/2015/09/21/ram-is-the-new-disk-and-how-to-measure-its-performance-part-2-tools/" target="_blank"&gt;second part&lt;/a&gt; I also showed how to measure the CPU efficiency of your (Oracle) process using a Linux &lt;code&gt;perf stat&lt;/code&gt; command. How well your applications actually utilize your CPU execution units depends on many factors. The biggest factor is your process’es cache efficiency that depends on the CPU cache size and your application’s memory access patterns. Regardless of what the OS CPU accounting tools like &lt;code&gt;top&lt;/code&gt; or &lt;code&gt;vmstat&lt;/code&gt; may show you, your “100% busy” CPUs may actually spend a significant amount of their cycles internally idle, with a stalled pipeline, waiting for some event (like a memory line arrival from RAM) to happen.&lt;/p&gt;
&lt;p&gt;Luckily there are plenty of tools for measuring what’s actually going on inside the CPUs, thanks to modern processors having CPU Performance Counters (CPC) built in to them.&lt;/p&gt;
&lt;p&gt;A key derived metric for understanding CPU-efficiency is the &lt;strong&gt;IPC&lt;/strong&gt; (instructions per cycle). Years ago people were actually talking about the inverse metric &lt;strong&gt;CPI&lt;/strong&gt; (cycles per instruction) as on average it took more than one CPU cycle to complete an instruction’s execution (again, due to the abovementioned reasons like memory stalls). However, thanks to today’s superscalar processors with out-of-order execution on a modern CPU’s multiple execution units – and with large CPU caches – a well-optimized application can execute multiple instructions per a single CPU cycle, thus it’s more natural to use the IPC (instructions-per-cycle) metric. With IPC, higher is better.&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Mon, 30 Nov 2015 08:45:58 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2015/11/30/ram-is-the-new-disk-and-how-to-measure-its-performance-part-3-cpu-instructions-cycles/</guid></item><item><title>Installing Emacs spaceline</title><link>https://xenodium.com/installing-emacs-spaceline</link><description>&lt;p&gt;Gave &lt;a href="https://github.com/TheBB/spaceline/"&gt;Spaceline&lt;/a&gt; a try. &lt;a href="https://github.com/syl20bnr/spacemacs"&gt;Spacemacs&lt;/a&gt;'s powerline theme. Setup was super simple (Thanks &lt;a href="https://github.com/TheBB"&gt;Eivind Fonn&lt;/a&gt; and &lt;a href="https://github.com/syl20bnr/spacemacs"&gt;Sylvain Benner&lt;/a&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(use-package spaceline :ensure t
  :config
  (use-package spaceline-config
    :config
    (spaceline-toggle-minor-modes-off)
    (spaceline-toggle-buffer-encoding-off)
    (spaceline-toggle-buffer-encoding-abbrev-off)
    (setq powerline-default-separator 'rounded)
    (setq spaceline-highlight-face-func 'spaceline-highlight-face-evil-state)
    (spaceline-define-segment line-column
      &amp;quot;The current line and column numbers.&amp;quot;
      &amp;quot;l:%l c:%2c&amp;quot;)
    (spaceline-define-segment time
      &amp;quot;The current time.&amp;quot;
      (format-time-string &amp;quot;%H:%M&amp;quot;))
    (spaceline-define-segment date
      &amp;quot;The current date.&amp;quot;
      (format-time-string &amp;quot;%h %d&amp;quot;))
    (spaceline-toggle-time-on)
    (spaceline-emacs-theme 'date 'time))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/installing-emacs-spaceline/spaceline.png" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 30 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/installing-emacs-spaceline</guid></item><item><title>Links - November 30, 2015</title><link>https://faingezicht.com/links/2015/11/30/links/</link><description>Took a break for thanksgiving. Read a lot. Choosing was hard.
This week's winner seems to be Noah Smith.</description><author>Avy Faingezicht</author><pubDate>Mon, 30 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/11/30/links/</guid></item><item><title>Quick update, and Hugo</title><link>https://benovermyer.com/blog/2015/11/quick-update-and-hugo/</link><description>&lt;p&gt;Well, it's been about two months since my last post, which ironically was about my intention to write more frequently. To be fair, I wrote in my journal a number of times between then and now, but this is my first public post since then. Today I discovered a Go-based static site generator called &lt;a href="http://www.gohugo.io/" rel="external"&gt;Hugo&lt;/a&gt; that fascinates me with its speed and usability. I'm going to try using it to replace the current structure and content of &lt;a href="http://benovermyer.com" rel="external"&gt;benovermyer.com&lt;/a&gt;.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Mon, 30 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/11/quick-update-and-hugo/</guid></item><item><title>Codemotion 2015</title><link>https://danielpecos.com/2015/11/29/codemotion-2015/</link><description>&lt;p&gt;&lt;a href="http://2015.codemotion.es"&gt;&lt;img alt="Codemotion 2015" class="alignleft" src="https://danielpecos.com/assets/2015/11/codemotion.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Day after Codemotion 2015, this is my overall opinion of the event: meh. Don’t get me wrong, technical sessions have been quite interesting, full of really nice people and organization must have worked really to get the event running. But, in my opinion, this event is dying of success. Way too many assistants, making really hard to walk from one session to another (even having 15 min between them), or having to arrive 30 min before start if you’re intention was to have a nice place to plug your laptop and be able to see the presentation.&lt;/p&gt;
&lt;p&gt;Now, speaking about content, it’s really nice to have so much diversity to choose from in every time slot (although sometimes you were force to discard really nice sessions). Personally, I chose to assist to an JVM / Scala track that covered approximately the whole time slots of the first day (and part of the second) without significant overlaps. BTW, really interesting stuff is happening around the JVM, nothing to envy to the Node.js community.&lt;/p&gt;
&lt;p&gt;But I also wanted to have a look into different technologies which were newer to me, such as Docker or Big Data. And it’s impressive how much has the technology evolved and what amazing things are people achieving in these fields. Currently, recorded sessions are &lt;del&gt;not yet published&lt;/del&gt; &lt;a href="https://www.youtube.com/channel/UCd_1KHg4t2VKGsSDF8OD5Cw/videos"&gt;already published!&lt;/a&gt;, but I’m pretty sure it will be worth taking a look into what I missed.&lt;/p&gt;
&lt;img alt="StreetFighter" class="aligncenter" src="https://danielpecos.com/assets/2015/11/ray_dani_small.jpg" /&gt;
&lt;p&gt;But as always, the best thing of these events is the people you meet, old and new acquaintances. And, of course, nothing as a good as an old arcade machine and a StreetFighter match in the chill out area to relax and have some fun 😉&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Sun, 29 Nov 2015 23:00:00 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2015/11/29/codemotion-2015/</guid></item><item><title>Entwicklung und Betrieb einer Symfony2 Webanwendung – Teil 1</title><link>https://manuel.kiessling.net/2015/11/29/entwicklung-und-betrieb-einer-symfony2-webanwendung-teil-1/</link><description>Über diesen Artikel  Dies ist ein Crosspost vom GALERIA Kaufhof Technology Blog. Vor kurzem standen wir vor der Herausforderung, eine kleine Onlineanwendung für eine zeitlich begrenzte Rabattaktion zu realisieren, die keinerlei Verbindung mit dem Galeria.de Webshop hatte.
Während der Technologiestack rund um unseren Onlineshop auf Scala, Ruby und Casssandra basiert, wurde hier die Entscheidung gefällt, die Anwendung außerhalb unserer bestehenden Dienste und Systeme zu realisieren, und auch nicht im Kontext unserer Scala und Ruby Teams, mit dem Ziel den normalen Produktentwicklungsprozess nicht mit diesem Sonderprojekt zu “stören”.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Sun, 29 Nov 2015 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2015/11/29/entwicklung-und-betrieb-einer-symfony2-webanwendung-teil-1/</guid></item><item><title>package.el incomprehensible buffer</title><link>https://xenodium.com/package-el-incomprehensible-buffer</link><description>&lt;p&gt;Came across &amp;quot;incomprehensible buffer&amp;quot; error in package.el. &lt;a href="http://osdir.com/ml/general/2015-11/msg22232.html"&gt;Workaround patch&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1161,6 +1161,7 @@ package--with-work-buffer
(let* ((url (concat ,url-1 ,file))
       (callback (lambda (status)
                   (let ((b (current-buffer)))
+                    (goto-char (point-min))
                     (unwind-protect (wrap-errors
                                      (when-let ((er (plist-get
                                                      status :error)))
                                        (error &amp;quot;Error retrieving: %s %S&amp;quot; url er))
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 29 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/package-el-incomprehensible-buffer</guid></item><item><title>Leading bookmarks</title><link>https://xenodium.com/leading-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22969533"&gt;Agile's early evangelists wouldn't mind watching Agile die&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=27414443"&gt;An incomplete list of skills senior engineers need, beyond coding | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id%3D10395046"&gt;Ask HN: How to Be a Good Technical Lead? (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/DanielleMorrill/status/1321092574837383168"&gt;Books on leveling up as a manager&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/bcantrill/status/1216491216356823040"&gt;Bryan Cantrill on Twitter: &amp;quot;So, my thoughts on engineering performance management…&amp;quot;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/dan_abramov/status/1203486500731719681"&gt;Dan Abramov: What is your favorite book about management… (twitter)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hbr.org/2015/10/do-you-have-a-managers-mindset"&gt;Do You Have a Manager’s Mindset?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@kentcdodds/first-timers-only-78281ea47455#.hj28umxei"&gt;First Timers Only: A suggestion to Open Source project maintainers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hbr.org/2015/08/how-to-give-tough-feedback-that-helps-people-grow"&gt;How to Give Tough Feedback That Helps People Grow&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=19485559"&gt;Interviews with developers who became managers (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hbr.org/2016/01/secrets-of-the-superbosses"&gt;Secrets of the Superbosses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hbr.org/2015/10/shifting-from-star-performer-to-star-manager"&gt;Shifting from Star Performer to Star Manager&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html?__s=5ww3bdbkavuhrw1fhfpp"&gt;The Joel Test: 12 Steps to Better Code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://whilefalse.blogspot.co.uk/2015/11/the-manager-as-debugger.html?m=1"&gt;The Manager as Debugger&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Managers-Path-Leaders-Navigating-Growth/dp/1491973897"&gt;The Manager's Path: A Guide for Tech Leaders Navigating Growth and Change&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 29 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/leading-bookmarks</guid></item><item><title>Online reading backlog</title><link>https://xenodium.com/online-reading-backlog</link><description>&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://phrack.org/issues/69/1.html"&gt;Phrack 69&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://hbr.org/2015/10/a-simple-formula-for-changing-our-behavior?utm_campaign=harvardbiz&amp;amp;utm_source=twitter&amp;amp;utm_medium=social"&gt;A Simple Formula for Changing Our Behavior&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://hbr.org/2013/11/be-grateful-more-often"&gt;Be Grateful More Often&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://heydave.org/post/24286720323/gtd-sucks-for-creative-work-heres-an-alternative"&gt;GTD sucks for creative work&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://continuations.com/post/131372549150/land-capital-attention-this-time-it-is-the-same"&gt;Land, Capital, Attention: This Time it Is the Same&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.gatesnotes.com/Books/Mindset-The-New-Psychology-of-Success"&gt;Mindset: What You Believe Affects What You Achieve (Gates Notes)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.theatlantic.com/business/archive/2015/10/get-rid-borders-completely/409501/?single_page%3Dtrue"&gt;The Case for Getting Rid of Borders—Completely&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://blog.todoist.com/2015/11/30/ultimate-guide-personal-productivity-methods/"&gt;The Ultimate Guide to Personal Productivity Methods&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.gatesnotes.com/Books/Thing-Explainer"&gt;Thing Explainer: A Basic Guide for Curious Minds (Gates Notes)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.ted.com/talks/amy_cuddy_your_body_language_shapes_who_you_are?language%3Den"&gt;Your body language shapes who you are&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 29 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/online-reading-backlog</guid></item><item><title>Jurassic World</title><link>https://olshansky.info/movie/jurassic_world/</link><description>Olshansky's review of Jurassic World</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 28 Nov 2015 15:21:53 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/jurassic_world/</guid></item><item><title>Travel lifestyle bookmarks</title><link>https://xenodium.com/travel-lifestyle-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/getterhiss/status/1325835494773592071"&gt;1991 VW Vanagon Westfalia campervan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fourhourworkweek.com/2010/02/25/rolf-potts-vagabonding-travel/"&gt;5 Travel Lessons You Can Use at Home&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.your-rv-lifestyle.com/travel-tips.html"&gt;50 Best Travel Tips from 10 Years of Travel - Your RV Lifestyle&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=26284635"&gt;A new chapter – full-time working from a van in a forest | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://liveworkplaytravel.com/bali-digital-nomad-guide-live-in-bali-as-a-digital-nomad/"&gt;Bali Digital Nomad Guide - How To Live In Bali As A Digital Nomad&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/ohmygeorge-blog/bootstrapping-in-bangkok-is-the-best-option-c70e98f2b781#.2qbxef7oa"&gt;Bootstrapping in Bangkok is the best option&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.goruck.com/en"&gt;goruck bag&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.washingtonpost.com/travel/tips/dos-donts-in-flight-grooming/"&gt;Grooming on airplanes: What's acceptable? - The Washington Post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jamesstuber.com/long-term-travel-costs/"&gt;How Much Does it Cost to Drop Everything and Travel Asia for 3 Months?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/I-am-a-US-citizen-and-I-am-thinking-of-retiring-in-Thailand-What-are-the-pros-and-cons-and-is-it-advisable"&gt;I am a US citizen and I am thinking of retiring in Thailand.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uncorneredmarket.com/planning-travel-covid19/"&gt;Lessons in Planning and Travel During COVID-19 – Uncornered Market&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://expertvagabond.com/best-travel-tips/"&gt;My 30 Best Travel Tips After 8 Years Traveling The World • Expert Vagabond&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/My-partner-I-want-to-backpack-around-as-much-of-the-world-as-we-can-for-6-12-months-What-surprises-did-you-learn-on-the-way-I-should-plan-for"&gt;My partner &amp;amp; I want to backpack around as much of the world as we can for 6-12 months. What surprises did you learn on the way I should plan for?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nomadlist.io/?hn"&gt;NomadList&lt;/a&gt;: Best cities to work from remotely.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.oecdbetterlifeindex.org/topics/life-satisfaction/"&gt;OECD Better Life Index&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.calebjay.com/posts/taxman-prices/"&gt;onlinetaxman.com Prices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://servas.org/"&gt;Peace and understanding through travel and hosting | Servas Online&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.justanotherbackpacker.com/round-the-world-trip-20172018-the-costs/"&gt;Round The World Trip 2017/2018: The Costs - Just Another Backpacker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11890991"&gt;Show HN: I made a database of remote companies (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=28167358"&gt;Show HN: Nomad Visa – Working remotely? Explore your visa options | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tombihn.com"&gt;tom bihn bags&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.travistranslator.com/product-category/translators/"&gt;Travis translators&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://waveuptravel.com"&gt;waveUPtravel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-are-the-best-ways-to-earn-money-while-traveling-around-the-world"&gt;What are the best ways to earn money while traveling around the world? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/twostraws/status/1336613071347982336"&gt;where to emigrate to?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.calebjay.com/posts/why-taiwan/"&gt;Why You Should Remote Work in Taiwan&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 28 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/travel-lifestyle-bookmarks</guid></item><item><title>Documentation has a Cost and a Value</title><link>https://cmdev.com/blog/2015-11-28-documentationcostvsvalue/</link><description>The cost of documentation is proportional to change frequency and distance from the code</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Sat, 28 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-28-documentationcostvsvalue/</guid></item><item><title>Spacemacs for Atom</title><link>https://david.coffee/spacemacs-for-atom/</link><description>&lt;p&gt;If you read my last posts you might notice that I really like editors. Something about finding better and better tools is very interesting and fun. Plus using a new tool for a couple of weeks is keeping things fresh even when you work on the same codebase.&lt;/p&gt;
&lt;p&gt;The problem is that since I started using &lt;a href="http://dvcrn.github.io/2015/10/13/my_dream_editor.html"&gt;spacemacs&lt;/a&gt;, I can&amp;rsquo;t really use anything else. It just&amp;hellip; doesn&amp;rsquo;t work. The shortcuts are too awkward, get overriden by third party plugins and all the manual config orchestration is just a pain.&lt;/p&gt;
&lt;p&gt;When I went back to Sublime Text for a little, I ended up writing &lt;a href="https://github.com/dvcrn/sublimious"&gt;sublimious&lt;/a&gt;, a plugin which ports a big chunk of the spacemacs toolset into Sublime Text:&lt;/p&gt;
&lt;p&gt;
&lt;img alt="sublimious" class="img-fluid" src="./MqsB6Pt.gif" /&gt;

&lt;/p&gt;
&lt;p&gt;It works &lt;strong&gt;really REALLY good&lt;/strong&gt;! But eventually I ran into problems implementing more things. Stuff like relative line numbers is close to impossible to do without a big performance hit or awkward behavior. Or the gutter still only being able to hold 1 element in it. What&amp;rsquo;s up with that?&lt;/p&gt;
&lt;p&gt;Performance wise it is crazy fast but let&amp;rsquo;s face it: Sublime Text is dead even if the community doesn&amp;rsquo;t want to admit it. Waiting until John Skinner to come along and commit a new feature once a year is just taking too long.&lt;/p&gt;
&lt;h3 id="my-first-time-with-atom"&gt;My first time with Atom?&lt;/h3&gt;
&lt;p&gt;Now I am a little bit biased towards atom. I looked at it multiple times but it felt too slow, too in-performant and most of the plugins were just trash-level (sorry if I insulted some of my readers but they are just&amp;hellip; not good!).&lt;/p&gt;
&lt;p&gt;All the problems I have about plugins overwriting keybindings are here stronger than anywhere else. A plugin can literally change every little aspect of the editor. This is a really great thing, don&amp;rsquo;t get me wrong! But at the same time you need to take double care of what you are installing.&lt;/p&gt;
&lt;p&gt;Github also did a lot of weird design decicions that I can&amp;rsquo;t follow. Here are a few:&lt;/p&gt;
&lt;h5 id="emoji-as-commit-messages"&gt;Emoji as commit messages&lt;/h5&gt;
&lt;p&gt;I tried to nibble my way through the codebase and recent changes a bit but emojis&amp;hellip; man. I mean, it&amp;rsquo;s cool that you have fun with it but for outsiders it&amp;rsquo;s unnecessary confusing. 🎨 is probably style related, I get that, but what the heck is 📝? 🔥?&lt;/p&gt;
&lt;p&gt;Plus using emojis is not a substitute for a commit message. It&amp;rsquo;s like me commiting with the word &amp;ldquo;style.&amp;rdquo;&lt;/p&gt;
&lt;h5 id="coffeescript"&gt;Coffeescript&lt;/h5&gt;
&lt;p&gt;I used to like coffeescript a lot but reading through the atom sourcecode made me realise why I will probably not touch it again.&lt;/p&gt;
&lt;p&gt;Take this snippet for example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-coffee"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #a6e22e;"&gt;@eventElement&lt;/span&gt;.&lt;span style="color: #a6e22e;"&gt;dispatchEvent&lt;/span&gt;(&lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;CustomEvent&lt;/span&gt;(&lt;span style="color: #a6e22e;"&gt;name&lt;/span&gt;, bubbles: &lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;, cancelable: &lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What is it doing? Why do some of the arguments have colons? Where does the object start and where does it end? The constructor is getting 3 arguments, right? Right?&lt;/p&gt;
&lt;p&gt;I literally had to run this through a coffeescript parser to understand what it&amp;rsquo;s doing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-javascript"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;.&lt;span style="color: #a6e22e;"&gt;eventElement&lt;/span&gt;.&lt;span style="color: #a6e22e;"&gt;dispatchEvent&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;CustomEvent&lt;/span&gt;(&lt;span style="color: #a6e22e;"&gt;name&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #a6e22e;"&gt;bubbles&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #a6e22e;"&gt;cancelable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  }),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="confusing-objects-everywhere"&gt;confusing objects everywhere&lt;/h5&gt;
&lt;p&gt;I&amp;rsquo;m a big functional guy and everywhere I go in the atom sourcecode, I am dealing with objects after objects. I can&amp;rsquo;t count how many &lt;code&gt;@element&lt;/code&gt; assignments and reads I saw. Some things are getting assigned at the top of an object, used at the bottom and changed 3x until it reached that spot.&lt;/p&gt;
&lt;h5 id="cson"&gt;cson&lt;/h5&gt;
&lt;p&gt;For some reason someone decided that coffeescript is so great that we should also start writing json in it! Because&amp;hellip; commas are evil or something?&lt;/p&gt;
&lt;p&gt;I quickly ran away from it&lt;/p&gt;
&lt;h3 id="atom-meet-clojurescript"&gt;Atom, meet clojurescript&lt;/h3&gt;
&lt;p&gt;Now, since then and now I got a lot better in clojurescript so I decided to give it another go. I created a little &lt;a href="https://github.com/dvcrn/ajom"&gt;lein template&lt;/a&gt; for creating atom plugins in clojurescript and hacked a bit here and there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Turns out this works really well!&lt;/strong&gt; Clojurescript and atom are like&amp;hellip; emacs and elisp! You have all the power of clojurescript combined with all the customisation options atom gives you. You still have to deal with some quirks like passing objects around but still - this is making the idea of having a central configuration system so much more possible!&lt;/p&gt;
&lt;p&gt;Our clojurescript plugin could literally change how every other package reacts: how it is set up, what keybindings it uses, what options it needs and more. We could even change how other plugins look inside the editor by manipulating it&amp;rsquo;s DOM representation.&lt;/p&gt;
&lt;p&gt;Short said, in the last few days I started porting a bit of functionality from sublimious to atom.&lt;/p&gt;
&lt;p&gt;
&lt;img alt="demo" class="img-fluid" src="./proton-demo.gif" /&gt;

&lt;/p&gt;
&lt;p&gt;For sublimious, I did &lt;strong&gt;a lot of hacking&lt;/strong&gt;. I basically collected all the configuration and flushed it into real files that are then getting re-loaded by sublimetext. For atom, I don&amp;rsquo;t need to do that.&lt;/p&gt;
&lt;p&gt;How do I set a editor config? Like this!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-clj"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;(&lt;span style="color: #66d9ef;"&gt;defn &lt;/span&gt;set-config! [selector value]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  (&lt;span style="color: #a6e22e;"&gt;.set&lt;/span&gt; config selector value))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;How do I wipe the existing user config so it doesn&amp;rsquo;t conflict with our new one? One line.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-clj"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;(map atom-env/unset-config! (&lt;span style="color: #a6e22e;"&gt;atom-env/get-all-settings&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The only hack I had to implement is the ability to install packages from within a package. That&amp;rsquo;s currently not possible. Here&amp;rsquo;s how I did it anyway:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-clj"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;(&lt;span style="color: #66d9ef;"&gt;defn &lt;/span&gt;install-package [package-name]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  (&lt;span style="color: #66d9ef;"&gt;if &lt;/span&gt;(&lt;span style="color: #a6e22e;"&gt;is-installed?&lt;/span&gt; package-name)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    (&lt;span style="color: #a6e22e;"&gt;try&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;      (&lt;span style="color: #a6e22e;"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        (&lt;span style="color: #a6e22e;"&gt;.execSync&lt;/span&gt; child-process (str (&lt;span style="color: #a6e22e;"&gt;get-apm-path&lt;/span&gt;) &lt;span style="color: #e6db74;"&gt;" install "&lt;/span&gt; package-name &lt;span style="color: #e6db74;"&gt;" --no-colors"&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        true)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;      (&lt;span style="color: #a6e22e;"&gt;catch&lt;/span&gt; js/Error e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        false))))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(I&amp;rsquo;m just calling apm through node!)&lt;/p&gt;
&lt;h3 id="is-it-ready"&gt;Is it ready?&lt;/h3&gt;
&lt;p&gt;Not even close to but I am already a lot more happy with it than with sublimious before. It feels more&amp;hellip; powerful! Maybe cljs+atom can really be a alternative to emacs at some point. Let me dream 😊&lt;/p&gt;
&lt;p&gt;In the meantime, if you want to help, please check it out &lt;a href="https://github.com/dvcrn/proton"&gt;here&lt;/a&gt;.&lt;/p&gt;</description><author>David Mohl</author><pubDate>Fri, 27 Nov 2015 20:24:23 GMT</pubDate><guid isPermaLink="true">https://david.coffee/spacemacs-for-atom/</guid></item><item><title>Good Parenting, or High-Tech Cruises?</title><link>https://stop.zona-m.net/2015/11/parenting-or-high-tech-cruises/</link><description>&lt;p&gt;Some months ago, &lt;a href="http://techcrunch.com/2015/02/12/tc-makers-inside-the-it-room-of-a-high-tech-cruise-ship/"&gt;TechCrunch reported&lt;/a&gt; that, on High-Tech cruise ships like the  Quantum Of The Sea, &amp;ldquo;Wi-Fi is fast and it’s everywhere&amp;rdquo; for one specific reason that I really &lt;strong&gt;don&amp;rsquo;t&lt;/strong&gt; like .&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Fri, 27 Nov 2015 17:57:39 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/11/parenting-or-high-tech-cruises/</guid></item><item><title>Great piece!</title><link>https://olshansky.info/posts/2015-11-26-great-piece/</link><description>My takeaway was that as long all your needs are met, money just acts as insurance. Nothing changes when you get home / auto / health…</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 27 Nov 2015 04:04:54 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/posts/2015-11-26-great-piece/</guid></item><item><title>The Nature of Order</title><link>https://june.kim/nature-of-order/</link><author>june.kim</author><pubDate>Fri, 27 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/nature-of-order/</guid></item><item><title>Notes on the Synthesis of Form</title><link>https://june.kim/notes-on-the-synthesis-of-form/</link><author>june.kim</author><pubDate>Fri, 27 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/notes-on-the-synthesis-of-form/</guid></item><item><title>The Timeless Way of Building</title><link>https://june.kim/timeless-way-of-building/</link><author>june.kim</author><pubDate>Fri, 27 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/timeless-way-of-building/</guid></item><item><title>SoundCloud RSS Feeds</title><link>https://caiustheory.com/soundcloud-rss-feeds/</link><description>&lt;p&gt;&lt;a href="https://soundcloud.com"&gt;SoundCloud&lt;/a&gt; appears to have gained popularity in recent times for hosting podcasts on. As a consumer of their service they&amp;rsquo;re pretty good at everything except having a visible RSS feed on a profile page for a show! If I want to listen to a show in my podcast app of choice, an RSS feed is the easiest way for me to achieve that.&lt;/p&gt;
&lt;p&gt;Turns out SoundCloud &lt;em&gt;do&lt;/em&gt; have RSS feeds, they&amp;rsquo;re just well hidden and unfindable from the profile page itself. Thankfully, you can construct the URL for it from information on the profile page, and here&amp;rsquo;s a bookmarklet that will do it for you:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;javascript:var%20userURI;var%20metaTags=document.getElementsByTagName(
%22meta%22);for(var%20i=0;i&amp;lt;metaTags.length;i++){t=metaTags[i];if(
t.attributes[%22property%22]&amp;amp;&amp;amp;t.attributes[%22property%22].value==
%22al:ios:url%22){userURI=t.content;}}if(userURI){u=userURI.split(%22//%22)[1];
window.location=%22http://feeds.soundcloud.com/users/soundcloud:%22+u+
%22/sounds.rss%22;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or as a &lt;a href=""&gt;handy link&lt;/a&gt; to copy to your bookmarks bar. Simply click/run that when on a SoundCloud profile page and you&amp;rsquo;ll be taken to the RSS Feed URL.&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Fri, 27 Nov 2015 01:33:37 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/soundcloud-rss-feeds/</guid></item><item><title>SQL bookmarks</title><link>https://xenodium.com/sql-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.pgcli.com/launching-litecli.html"&gt;Launching LiteCLI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modern-sql.com/use-case/literate-sql"&gt;Literate SQL&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18335723"&gt;Show HN: SQL Trainer – Learn SQL by doing live data exercises (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/helenanders26/sql-series-from-a-to-z-2pk9"&gt;SQL Series: From A to Z - DEV Community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ben-n93/SQL-tips-and-tricks"&gt;SQL tips and tricks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simonwillison.net/2018/Oct/4/datasette-ideas/"&gt;The interesting ideas in Datasette&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/geshan/you-can-do-it-in-sql-stop-writing-extra-code-for-it-lok"&gt;You Can Do it in SQL, Stop Writing Extra Code for it - DEV Community&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 26 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/sql-bookmarks</guid></item><item><title>Unix/Linux tools bookmarks</title><link>https://xenodium.com/unix-linux-tools-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://forums.freebsd.org/threads/small-guide-on-using-mtree.61113/"&gt;(small) Guide on using mtree (The FreeBSD Forums)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thegeekstuff.com/2012/04/curl-examples/"&gt;15 Practical Linux cURL Command Examples&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/20_awk_examples/"&gt;20 awk examples – Linux Hint&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cyberciti.biz/open-source/7-awesome-open-source-analytics-weblog-analysis-softwares/"&gt;7 Awesome Open Source Analytics Software For Linux and Unix - nixCraft&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12137576"&gt;A practical proposal for migrating to safe long sessions on the web (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12140477"&gt;A practical security guide for web developers (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12364077"&gt;A Unix Utility to Know About: lsof (2009) (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/rtfpessoa/7a745be31e89673b8fc7"&gt;agnoster.bash&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huxiaoxing.com/tools/an-elegant-way-of-managing-dotfiles"&gt;An Elegant Way of Managing Dotfiles&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=16612580"&gt;Announcing gRPC Support in Nginx (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.figlet.org"&gt;ASCII art text with figlet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://autotools.io/index.html"&gt;Autotools Mythbuster&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.faqs.org/faqs/computer-lang/awk/faq/"&gt;awk FAQ&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ferd.ca/awk-in-20-minutes.html"&gt;awk in 20 minutes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.balthazar-rouberol.com/text-processing-in-the-shell"&gt;Balthazar – Text processing in the shell&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/bash_parameter_expansion/"&gt;Bash Parameter Expansion (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/bash_pipe_tutorial/"&gt;Bash pipe tutorial (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/bash_until_loops/"&gt;Bash Until Loops (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joshrollinswrites.com/help-desk-head-desk/basic-ssh-security/"&gt;Basic SSH Security (The Art of Not Asking Why)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.unixwiz.net/techtips/chroot-practices.html"&gt;Best Practices for UNIX chroot&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://johnbokma.com/blog/2019/05/13/blacklisting-domains-with-postfix.html"&gt;Blacklisting domains with Postfix - John Bokma&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.grymoire.com/Unix/Awk.html"&gt;Bruce Barnett's awk tutorial&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.grymoire.com/Unix/sed.html"&gt;Bruce Barnett's sed tutorial&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/skorokithakis/catt"&gt;Cast All The Things&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://remysharp.com/2018/08/23/cli-improved"&gt;CLI: improved (better cli alternatives)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17874718"&gt;CLI: Improved, better CLI alternatives (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/learnbyexample/Command-line-text-processing"&gt;Command-line-text-processing: From finding text to search and replace, from sorting to beautifying text and more&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kkovacs.eu/cool-but-obscure-unix-tools#"&gt;Cool but obscure unix tools at kkovacs.eu&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://catonmat.net/cookbooks/curl"&gt;Curl Cookbook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jvns.ca/blog/2019/08/27/curl-exercises/"&gt;curl exercises (Julia Evans)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/curl_bash_examples/"&gt;Curl in Bash Scripts by Example (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11213213"&gt;Curl vs Wget (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dualuse.io/blog/curryfinger/"&gt;CURRYFINGER - SNI &amp;amp; Host header spoofing utility - DUALUSE&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gchq.github.io/CyberChef/"&gt;CyberChef&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.romanzolotarev.com/openbsd/bioctl-crypto.html"&gt;Encrypt disk with bioctl(8) and CRYPTO - Roman Zolotarev&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://puntoblogspot.blogspot.co.uk/2016/01/entr-suckless-inotify-tools.html?m=1"&gt;entr runs commands when a file changes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wizardzines.com/networking-tools-poster/"&gt;Every Linux networking tool I know (zine)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/clvv/fasd"&gt;fasd a command-line productivity booster&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/length_of_string_bash/"&gt;Find Length of String in Bash (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18967249"&gt;For the Love of Pipes (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://git-annex.branchable.com/assistant/"&gt;git-annex&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/antonmedv/fx/"&gt;GitHub - antonmedv/fx: Command-line tool and terminal JSON viewer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/atorstling/origin"&gt;GitHub - atorstling/origin: Track down the origin of a command&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/insanum/gcalcli"&gt;GitHub - insanum/gcalcli: Google Calendar Command Line Interface&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raboof/nethogs"&gt;GitHub - raboof/nethogs: Linux 'net top' tool&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/trim_string_bash/"&gt;How to trim string in bash (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/array_awk_command/"&gt;How to use array in awk command (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-use-bash-s-job-control-to-manage-foreground-and-background-processes"&gt;How To Use Bash's Job Control to Manage Foreground and Background Processes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/conditional_statement_awk_command/"&gt;How to use conditional statement in awk command (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/dd_command_linux-2/"&gt;How to Use dd Command on Linux (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/for_loop_awk_command/"&gt;How to use for loop in awk command (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22082585"&gt;HTTP static server one-liners | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jkbrzt/httpie"&gt;httpie: Command line HTTP client, a user-friendly curl alternative&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/iptables_for_beginners/"&gt;Iptables for beginners (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sneak.berlin/20191011/stupid-unix-tricks/"&gt;Jeffrey Paul: Stupid Unix Tricks (Yubikey ssh on macOS)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jessfraz.com/post/for-the-love-of-pipes/"&gt;Jessie Frazelle's Blog: For the Love of Pipes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jvns.ca/zines/"&gt;Julia Evans's zines (unix tools)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kiramclean.com/blog/how-to-set-up-your-own-nextcloud-server/"&gt;Kira McLean | How To Set Up Your Own Nextcloud Server&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/beorn__/status/1281504590073073666"&gt;LD_DEBUG awesomeness (using ls)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://irreal.org/blog/?p=7323"&gt;Learn a Little AWK (Irreal)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/linux_cp_command/"&gt;Linux cp Command (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bryan-murdock.blogspot.co.uk/2015/12/linux-environment-management.html"&gt;Linux environment management&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/linux_grep_command/"&gt;Linux grep Command (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/linux_lsof_command/"&gt;Linux lsof Command (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/brendangregg/scale2015-linux-perfprofiling"&gt;Linux profiling at Netflix&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/linux_tar_command-2/"&gt;Linux tar Command (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/linux_tr_command/"&gt;Linux tr Command (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kitten-technologies.co.uk/project/magic-pipes/doc/trunk/README.wiki"&gt;Magic Pipes: suite of tools to construct powerful Unix shell pipelines that operate on structured data&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/3519939/make-curl-follow-redirects"&gt;Make cURL follow redirects&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/idcrook/i-dotfiles/blob/master/INSTALL-macos.md"&gt;Managing macOS dot files with stow&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mbork.pl/2019-03-11_Name-based_UUID_generation"&gt;Marcin Borkowski: 2019-03-11 Name-based UUID generation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18922030"&gt;More than you really wanted to know about Patch (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11909543"&gt;My First 10 Minutes on a Server (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.keycdn.com/support/nginx-vs-apache"&gt;Nginx vs Apache&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/nmap_alternatives/"&gt;Nmap Alternatives (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/nmap_basics_tutorial/"&gt;NMAP basics Tutorial (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/nmap_flags/"&gt;nmap flags and what they do (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/nmap_scan_ip_ranges/"&gt;Nmap: scan IP ranges (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/phw/peek"&gt;Peek: Simple animated GIF screen recorder with an easy to use interface&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18992930"&gt;Practical Linux Hardening Guide (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rclone.org/"&gt;Rclone (mount many cloud services locally)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://justine.lol/redbean/index.html"&gt;redbean&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iridakos.com/how-to/2019/05/16/remove-duplicate-lines-preserving-order-linux.html"&gt;Remove duplicate lines from files keeping the original order&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.philipdaniels.com/blog/2019/ripgrep-cheatsheet/"&gt;Ripgrep Cheatsheet • Phil's Blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18291302"&gt;Show HN: Ultimate Plumber – a tool for writing Linux pipes with live preview (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/p-gen/smenu"&gt;smenu is a selection filter just like sed is an editing filter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.softether.org"&gt;SoftEther VPN&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.0xbadc0de.be/archives/300"&gt;SSH: Best practices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://irreal.org/blog/?p=7184"&gt;Text Manipulation with Command Line Utilities&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge"&gt;the-book-of-secret-knowledge: A collection of inspiring lists, manuals, cheatsheets, blogs, hacks, one-liners, cli/web tools, and more&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calebmadrigal/trackerjacker/blob/master/README.md"&gt;trackerjacker/README.md at master · calebmadrigal/trackerjacker · GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devarea.com/understanding-awk-practical-guide/"&gt;Understanding Awk (Practical Guide)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cis.upenn.edu/~bcpierce/unison/"&gt;Unison File Synchronizer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/linux/comments/mi80x/give_me_that_one_command_you_wish_you_knew_years/"&gt;Unix commands you wish you knew years ago (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://unixmages.com/ufbm.pdf"&gt;Unix for the Beginning Mage&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/snovvcrash/usbrip"&gt;usbrip: Simple CLI forensics tool for tracking USB device artifacts (history of USB events) on GNU/Linux&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://brandon.invergo.net/news/2012-05-26-using-gnu-stow-to-manage-your-dotfiles.html"&gt;Using gnu stow to manage your dotfiles&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://magic-wormhole.readthedocs.io/en/latest/welcome.html#example"&gt;Welcome &amp;amp; Magic-Wormhole&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.semicomplete.com/projects/xdotool/"&gt;xdotool - fake keyboard/mouse input, window management, and more - semicomplete&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;xmllint –format.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lucasfcosta.com/2019/04/07/streams-introduction.html"&gt;Your terminal is not a terminal: An Introduction to Streams&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dotfiles.github.io/"&gt;Your unofficial guide to dotfiles on GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 26 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/unix-linux-tools-bookmarks</guid></item><item><title>Couchbase React Native bookmarks</title><link>https://xenodium.com/couchbase-react-native-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://groups.google.com/forum/#!forum/mobile-couchbase"&gt;Couchbase Mobile discussion group&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.couchbase.com/documentation/mobile/current/develop/guides/couchbase-lite/native-api/index.html"&gt;Couchbase Mobile Native API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.couchbase.com/mobile/"&gt;Couchbase Mobile&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/couchbase/sync_gateway"&gt;Couchbase sync gateway&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.couchbase.com/2015/november/getting-started-with-react-native-android-and-couchbase-lite"&gt;Getting Started with React Native Android and Couchbase Lite&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 26 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/couchbase-react-native-bookmarks</guid></item><item><title>Installing Emacs 25 devel on Mac OS X</title><link>https://xenodium.com/installing-emacs-on-mac-os-x</link><description>&lt;h2&gt;Stable&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;brew update
brew install emacs --HEAD --use-git-head --with-cocoa --with-srgb --with-gnutls
brew linkapps emacs
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Development&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;  brew update
  brew install emacs --devel --with-cocoa --with-srgb --with-gnutls
  brew linkapps emacs
then
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Had problems loading seq. Removed byte-compiled packages:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ find ~/.emacs.d/elpa -iname *.elc -exec rm '{}' \;
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 26 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/installing-emacs-on-mac-os-x</guid></item><item><title>Terrible Customer Support from Chase</title><link>https://peterlyons.com/problog/2015/11/terrible-customer-support-from-chase/</link><description>&lt;p&gt;So the Chase mobile banking app does not work properly on my new Google Nexus 5X phone. When taking a photo to deposit a check, the on-screen preview is rotated 180 degrees. This makes it really awkward to try to center the check because when you move the phone intuitively to fix alignment, it gets worse not better.&lt;/p&gt;
&lt;p&gt;I googled this and found it's a known problem due to some technical details about this particular phone and it requires the chase mobile app developers to code a fix and release an update via the google play store.&lt;/p&gt;
&lt;p&gt;Here's a &lt;a href="https://www.reddit.com/r/Android/comments/3rjbo8/nexus5x_marshmallow_camera_problem/"&gt;reddit thread&lt;/a&gt; where the Tech Lead for the Android Camera Framework confirms it.&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="https://www.reddit.com/r/nexus5x/comments/3q891a/camera_apps_that_arent_inverted/"&gt;another reddit thread&lt;/a&gt; where 2 other users confirm the problem in the Chase app specifically.&lt;/p&gt;
&lt;p&gt;Here's &lt;a href="http://forums.androidcentral.com/nexus-5x/598233-bug-nexus-5x-camera-upside-down-apps.html"&gt;an android central thread&lt;/a&gt; on this topic.&lt;/p&gt;
&lt;p&gt;So I tried to tell Chase about it. It went like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sent them a message via their "Secure Messaging Center" within their banking web site
&lt;ul&gt;
&lt;li&gt;They came back saying "we checked, it's not an actual problem. Fuck off."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I sent them feedback via the google play store which amounts basically to an email
&lt;ul&gt;
&lt;li&gt;They responded "psych! Yeah we can't actually communicate over these messages, sent us a message via our online banking web site"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;When I pressed again in their online banking message system that yes this is a real issue, here are the links they said "Oh fuck off we can't actually do tech support here, call this telephone number, I'm sure it will be fun to speak web URLs to them letter-by-letter"&lt;/li&gt;
&lt;li&gt;So I called them and spoke with tech support who thought I was saying a particular photograph was upside down for a while. When I finally explained this is a bug in their app to his satisfaction, he started to tell me to call some other number...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then I got profane, which I almost never do, but I said something along the lines of "No. Fuck that. I've already sent you emails in 2 different systems and called one telephone number. I'm not sending smoke signals. I'm not telegraphing anyone. You fucking record this bug in your system and communicate it internally to the right people on my behalf". The profanity seemed to actually prompt helpfulness, which is a sad truth, but eventually I found a reddit shortlink and spoke it to him over the phone. Hopefully they'll fix their app.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Thu, 26 Nov 2015 01:49:10 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2015/11/terrible-customer-support-from-chase/</guid></item><item><title>Multi-variable To-do List</title><link>https://www.davidschlachter.com/misc/multivariable-todo</link><description>To-do list weighing both the deadline and the value of the task. Helpful for balancing urgency and importance, tuned for university course work and exams.</description><author>David Schlachter</author><pubDate>Wed, 25 Nov 2015 19:00:00 GMT</pubDate><guid isPermaLink="true">https://www.davidschlachter.com/misc/multivariable-todo</guid></item><item><title>Macro-writing Macros</title><link>https://johnj.com/posts/macro-writing-macros/</link><description>&lt;p&gt;
&lt;em&gt;… in which we explore the power of macros, and macro-writing
macros, to DRY out repetitive code.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;





&lt;a href="https://johnj.com/macro-sketch.jpg"&gt;&lt;img class="resize" src="https://johnj.com/macro-sketch_hu_40622335ed8bd4db.jpg" style="width: 700px; border: 0px solid black;" /&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
I’ve been writing Clojure code full time for nearly two years now. I
have a pretty good feel for the language, its virtues and its
faults. Mostly, I appreciate its virtues (though I still wish the REPL
started faster).&lt;/p&gt;
&lt;p&gt;
For me one of the language’s attractions has always been that it’s a
Lisp — a “homoiconic” language, i.e., one defined in terms of its own
data structures. Homoiconicity has one primary virtue, which is that
it makes metaprogramming more powerful and straightforward than it is
in non-homoiconic languages (arguably at some cost to readability).&lt;/p&gt;
&lt;p&gt;
In Lisp, this metaprogramming is accomplished with &lt;em&gt;macros&lt;/em&gt;, which are
functions that transform your code during a separate stage of
compilation. In other words, you write little programs to change your
programs before they execute. In effect, you extend the compiler
itself.&lt;/p&gt;
&lt;p&gt;
I run a Clojure study group at work and find that it can be hard to
explain the utility (or appeal) of this to newcomers to Lisp. This is
partly because macros do things you can’t easily do in other
languages, and because the things you want to do tend to relate to
abstractions latent in a particular codebase.&lt;/p&gt;
&lt;p&gt;
While &lt;a href="https://github.com/eigenhombre/moarquil"&gt;playing around with 3d rendering&lt;/a&gt; in &lt;a href="http://quil.info/"&gt;Quil&lt;/a&gt;, I recently came across
a use case that reminded me of the following quote by Paul Graham:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The shape of a program should reflect only the problem it needs to
solve. Any other regularity in the code is a sign, to me at least,
that I’m using abstractions that aren’t powerful enough— often that
I’m generating by hand the expansions of some macro that I need to
write&lt;sup class="footnote-reference"&gt;&lt;a href="#footnote-1" id="footnote-reference-1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
In Quil, there are multiple situations in which one needs to create a
temporary context to carry out a series of operations, restoring the
original state afterwards:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Save current style with &lt;code class="verbatim"&gt;push-style&lt;/code&gt;; change style and draw stuff;
restore previous style with &lt;code class="verbatim"&gt;pop-style&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Start shape with &lt;code class="verbatim"&gt;begin-shape&lt;/code&gt;; draw vertices; &lt;code class="verbatim"&gt;end-shape&lt;/code&gt; to end.&lt;/li&gt;
&lt;li&gt;Save current position/rotation with &lt;code class="verbatim"&gt;push-matrix&lt;/code&gt;; translate / rotate
and draw stuff; restore old position/rotation with &lt;code class="verbatim"&gt;pop-matrix&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here’s an example:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(push-matrix)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(try
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  (push-style)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  (try
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    (fill 255)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    (no-stroke)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    (translate [10 10 10])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    (begin-shape)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    (try
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      (vertex x1 y1 0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      (vertex x2 y2 0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      (vertex x2 y2 h)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      (vertex x1 y1 h)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      (vertex x1 y1 0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      (finally
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        (end-shape)))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    (finally
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      (pop-style)))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  (finally
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    (pop-matrix)))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The &lt;code class="verbatim"&gt;(try ... (finally ...))&lt;/code&gt; constructions may not be strictly needed
for a Quil drawing, but it’s a good habit to guarantee that stateful
context changes are undone, even if problems occur.&lt;/p&gt;
&lt;p&gt;
In a complex Quil drawing the idioms for saving style, translation
state, and denoting shapes appear often enough that one hungers for a
more compact way of representing each. Here’s one way to do it:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(defmacro with-style [&amp;amp; body]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  `(do
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (push-style)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (try
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        ~@body
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;       (finally
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;         (pop-style)))))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(defmacro with-matrix [&amp;amp; body]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  `(do
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (push-matrix)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (try
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        ~@body
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;       (finally
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;         (pop-matrix)))))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(defmacro with-shape [&amp;amp; body]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  `(do
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (begin-shape)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (try
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        ~@body
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;       (finally
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;         (end-shape)))))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The original code then becomes more compact and easier to read:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(with-matrix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  (with-style
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    (fill 255)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    (no-stroke)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    (translate [10 10 10])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    (with-shape
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      (vertex x1 y1 0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      (vertex x2 y2 0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      (vertex x2 y2 h)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      (vertex x1 y1 h)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      (vertex x1 y1 0))))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
In &lt;a href="https://github.com/eigenhombre/moarquil/blob/master/src/moarquil/render.clj"&gt;this example code&lt;/a&gt;, the contexts &lt;code class="verbatim"&gt;with-matrix&lt;/code&gt;, etc. appear so often
that the resulting savings in lines of code and mental overhead for
the reader is substantial.&lt;/p&gt;
&lt;p&gt;
However, the astute reader will realize that the macro definitions
themselves are pretty repetitive—in fact, they look almost identical
except for the setup and teardown details (this kind of “context
manager” pattern is common enough that Python has &lt;code class="verbatim"&gt;its own language
construct&lt;/code&gt; for it).&lt;/p&gt;
&lt;p&gt;
I generally reach for macros when I have a pattern that occurs with
obvious repetition that’s not easy to abstract out using just pure
functions. Control abstractions such as loops or exception handling
are common examples. (I find this situation occurs especially
frequently when writing test code).&lt;/p&gt;
&lt;p&gt;
In any case, the solution for our repetitive macros could be something
like:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(defmacro defcontext
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  [nom setup teardown]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  `(defmacro ~(symbol (str “with-” nom))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     [~'&amp;amp; body#]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     `(do
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        ~'~setup
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        (try
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;          ~@body#
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;          (finally
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            ~'~teardown)))))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Yikes! I have to admit I had to write a lot of macros, and also refer
to &lt;a href="http://hubpages.com/technology/Clojure-macro-writing-macros"&gt;this helpful page&lt;/a&gt; for reference, before I could write (and grok)
this macro.&lt;/p&gt;
&lt;p&gt;
With &lt;code class="verbatim"&gt;defcontext&lt;/code&gt; in hand, our repetitive macro code just becomes:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(defcontext style (push-style) (pop-style))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(defcontext shape (begin-shape) (end-shape))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(defcontext matrix (push-matrix) (pop-matrix))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
These are exactly equivalent to the three context macros &lt;code class="verbatim"&gt;(with-*)&lt;/code&gt;
defined above.&lt;/p&gt;
&lt;p&gt;
With a little effort, it’s actually not too hard to construct such a
nested macro. It’s largely a matter of writing out the code you want
to generate, and then writing the code that generates it, testing with
&lt;code class="verbatim"&gt;macroexpand-1&lt;/code&gt; at the REPL as you go. &lt;a href="http://hubpages.com/technology/Clojure-macro-writing-macros"&gt;This page by A. Malloy&lt;/a&gt; has a lot
of helpful remarks, including this cautionary note: “Think twice
before trying to nest macros: it’s usually the wrong answer.” In this
case, I actually think it’s the right answer, because the pattern of a
context with setup and teardown is so common that I know I’ll reuse
this macro for many other things—we have effectively added one of my
favorite Python features to Clojure in just a few lines of code[fn::To
be even more like Python’s context managers, &lt;code class="verbatim"&gt;defcontext&lt;/code&gt; would want
to enable the user to bind some local state resulting from the setup
phase of execution (“ &lt;code class="verbatim"&gt;with x() as y:&lt;/code&gt; ” idiom); examples include file
descriptors or database connections. This is left as an exercise for
the reader.]&lt;/p&gt;
&lt;p&gt;
There’s a saying in the Clojure community: &lt;code class="verbatim"&gt;data &amp;gt; functions &amp;gt; macros&lt;/code&gt;.
I’m a big believer in this. Clojure’s powerful built-in
abstractions for wrangling data in all its forms make it the language
I prefer above all others these days. But occasionally that means
wrangling the data that is the code itself, thereby reaping the
benefits in power, brevity and expressiveness.&lt;/p&gt;
&lt;figure&gt;





&lt;a href="https://johnj.com/moarquil.png"&gt;&lt;img class="resize" src="https://johnj.com/moarquil_hu_4431473f278ad49.png" style="width: 700px; border: 0px solid black;" /&gt;&lt;/a&gt;


&lt;figcaption&gt;
Image generated by &lt;a href="https://github.com/eigenhombre/moarquil/blob/master/src/moarquil/util.clj#L5"&gt;the Quil code&lt;/a&gt; used for this example.
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class="footnotes"&gt;
&lt;hr class="footnotes-separatator" /&gt;
&lt;div class="footnote-definitions"&gt;
&lt;div class="footnote-definition"&gt;
&lt;sup id="footnote-1"&gt;&lt;a href="#footnote-reference-1"&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;div class="footnote-body"&gt;
&lt;p&gt;Paul Graham, "Revenge of the Nerds": &lt;a href="http://www.paulgraham.com/icad.html"&gt;http://www.paulgraham.com/icad.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>John Jacobsen</author><pubDate>Wed, 25 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://johnj.com/posts/macro-writing-macros/</guid></item><item><title>Diagram tools bookmarks</title><link>https://xenodium.com/diagram-tools-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.worthe-it.co.za/programming/2017/09/19/quick-introduction-to-graphviz.html"&gt;A Quick Introduction to Graphviz&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ncona.com/2020/06/create-diagrams-with-code-using-graphviz/"&gt;Create diagrams with code using Graphviz – ncona.com – Learning about computers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.diagram.codes/"&gt;Diagram.Codes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.draw.io/"&gt;Flowchart Maker &amp;amp; Online Diagram Software&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://graphviz.it/"&gt;Graphviz it! - fiddle with diagrams&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://soc.if.usp.br/manual/graphviz/html/info/shapes.html"&gt;Graphviz node shapes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.planttext.com/"&gt;PlantText UML Editor&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item"&gt;Svgbob: Convert your ASCII diagram scribbles into happy little SVG&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.texample.net/tikz/examples/tag/graphs/"&gt;TeXample.net (TeX examples)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/maybekatz/status/1137254612468154370"&gt;What do you like using for software architecture diagrams? (twitter)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 25 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/diagram-tools-bookmarks</guid></item><item><title>My New Youtube Channel</title><link>https://tanelpoder.com/2015/11/23/my-new-youtube-channel/</link><description>&lt;p&gt;I have created a new youtube channel – and have uploaded some videos there already! Bookmark &amp;amp; Subscribe here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/tanelpoder" rel="noopener" target="_blank"&gt;&lt;a href="https://www.youtube.com/tanelpoder"&gt;https://www.youtube.com/tanelpoder&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More stuff is coming over the next weeks &amp;amp; months :-)&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Tue, 24 Nov 2015 06:30:28 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2015/11/23/my-new-youtube-channel/</guid></item><item><title>Licensing bookmarks</title><link>https://xenodium.com/licensing-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://choosealicense.com/"&gt;choosealicense.com&lt;/a&gt; (Choosing an open source license doesn’t need to be scary).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/github/choosealicense.com"&gt;choosealicense.com (github)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tldrlegal.com/"&gt;tldrlegal.com&lt;/a&gt; (Software Licenses in Plain English).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 24 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/licensing-bookmarks</guid></item><item><title>[Computing] Why the AGPL is often unenforceable</title><link>https://www.devever.net/~hl/agplunenforceable</link><description>&lt;p&gt;The AGPL is intended to require that where the source code of open source
network service software is modified, that code is made available even if the
software is not distributed.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Tue, 24 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/agplunenforceable</guid></item><item><title>[Computing] Linux's GPLv2 licence is routinely violated</title><link>https://www.devever.net/~hl/linuxgpl</link><description>&lt;p&gt;The Linux kernel is licenced under the GPLv2. There are several notable things about this:&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Tue, 24 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/linuxgpl</guid></item><item><title>Synology bookmarks</title><link>https://xenodium.com/synology-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://synoguide.com/2016/04/21/backup-your-files-to-an-external-drive-or-a-shared-file-dsm-6-0/"&gt;Backup your files to an external drive or a shared file DSM 6.0 – Synoguide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.makeuseof.com/tag/ext4-btrfs-making-switch-linux/"&gt;Ext4 vs. Btrfs: Why We're Making The Switch {Linux}&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bpmsg.com/how-to-make-your-synology-disk-station-nas-more-secure/"&gt;How to make your Synology Disk station (NAS) more secure? – BPMSG&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.techrepublic.com/article/how-to-use-the-files-app-to-connect-to-a-network-server-from-your-iphone-or-ipad/"&gt;How to use the Files app to connect to a network server from your iPhone&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joshdick.net/2014/04/12/configuring_ssh_and_scp_sftp_on_dsm_5.0_for_synology_diskstations.html"&gt;Josh Dick » Configuring SSH and SCP/SFTP on DSM 5.0 for Synology DiskStations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.chainsawonatireswing.com/2012/01/16/log-in-to-a-synology-diskstation-using-ssh-keys-as-a-user-other-than-root/"&gt;Log in to a Synology DiskStation using SSH keys as a user other than root&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.markusbordihn.de/2012/02/encryption-of-synology-diskstation-how.html"&gt;Look into Synology's file encryption&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arstechnica.com/civis/viewtopic.php?t=1273997"&gt;RAID5 vs SHR - Ars Technica OpenForum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/synology/comments/73f7tb/please_confirm_that_i_chose_the_right_option_shr1/"&gt;reddit: Please confirm that I chose the right option (SHR1 with DS718+)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://synoguide.com/2014/07/30/reset-admin-password-synology/"&gt;Reset your Admin password in your Synology – Synoguide&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 23 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/synology-bookmarks</guid></item><item><title>The Circle (The Circle, #1)</title><link>https://olshansky.info/book/the_circle_the_circle_1/</link><description>Olshansky's review of The Circle (The Circle, #1) by Dave Eggers</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 23 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/the_circle_the_circle_1/</guid></item><item><title>Backup bookmarks</title><link>https://xenodium.com/backup-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/B00O0M5QK8"&gt;HGST Deskstar NAS 3.5-Inch 6TB 7200RPM SATA III 128MB Cache Internal Hard Drive (0S03839)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.stavros.io/posts/holy-grail-backups/"&gt;I found the Holy Grail of backups&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/B00CQ35GYE"&gt;Kingston Technology 4GB 1600MHz DDR3L PC3-12800 1.35V Non-ECC CL11 SODIMM Intel Laptop Memory KVR16LS11/4&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=19482280"&gt;Show HN: Baxx – Unix-friendly backup service (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/B00P3RPMEO/ref%3Das_li_ss_tl?psc%3D1&amp;amp;redirect%3Dtrue&amp;amp;ref_%3Doh_aui_detailpage_o01_s00&amp;amp;linkCode%3Dsl1&amp;amp;tag%3Dnatfrie-20&amp;amp;linkId%3D9867e6a1134b8c16fb39bd06c39bf1ef"&gt;Synology Disk Station 8-Bay (Diskless) Network Attached Storage (NAS) (DS1815+)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tarsnap.com/"&gt;Tarsnap: online backups for the truly paranoid&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 22 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/backup-bookmarks</guid></item><item><title>Making hummus</title><link>https://xenodium.com/making-hummus</link><description>&lt;p&gt;Made hummus, based on &lt;a href="http://www.deliciousistanbul.com/blog/2013/04/28/5-secrets-to-perfect-hummus/"&gt;Delicious Istanbul's&lt;/a&gt; &lt;a href="http://www.deliciousistanbul.com/blog/2013/04/28/5-secrets-to-perfect-hummus/"&gt;5 Secrets to Perfect Hummus&lt;/a&gt; (&lt;a href="https://web.archive.org/web/20160829162734/deliciousistanbul.com/blog/2013/04/28/5-secrets-to-perfect-hummus/"&gt;wayback machine&lt;/a&gt;) post.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;160 g dry chickpeas.&lt;/li&gt;
&lt;li&gt;4 cloves garlic minced.&lt;/li&gt;
&lt;li&gt;1 tsp fine sea salt.&lt;/li&gt;
&lt;li&gt;1 1/2 tbsp lemon juice.&lt;/li&gt;
&lt;li&gt;1/4 tsp ground cumin.&lt;/li&gt;
&lt;li&gt;6 tbsp tahini paste.&lt;/li&gt;
&lt;li&gt;2/3 cup cooking water.&lt;/li&gt;
&lt;li&gt;Extra virgin olive oil, for serving.&lt;/li&gt;
&lt;li&gt;Red pepper flakes, for serving.&lt;/li&gt;
&lt;li&gt;Zahter mixture, for serving.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Soak chickpeas overnight.&lt;/li&gt;
&lt;li&gt;Discard water and rinse chickpeas.&lt;/li&gt;
&lt;li&gt;Cook in low heat (about 5 cups water) for 1.5 hours for until soft (but keeping shape.) Check if can be mashed with thumnb.&lt;/li&gt;
&lt;li&gt;Save cooking water.&lt;/li&gt;
&lt;li&gt;Peal chickpeas (optional).&lt;/li&gt;
&lt;li&gt;Blend ingredients until silky paste. Taste and add lemon/salt/cooking water.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Keeps in fridge for 3-4 days. Freeze otherwise.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/making-hummus/hummus-01.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/making-hummus/hummus-02.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/making-hummus/hummus-03.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/making-hummus/hummus-04.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/making-hummus/hummus-05.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/making-hummus/hummus-06.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/making-hummus/hummus-07.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/making-hummus/hummus-08.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/making-hummus/hummus-09.jpg" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 22 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/making-hummus</guid></item><item><title>Nara travel bookmarks</title><link>https://xenodium.com/nara-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/K%25C5%258Dfuku-ji"&gt;Kōfuku-ji&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/T%C5%8Ddai-ji"&gt;Nara Buddha temple&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 22 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/nara-travel-bookmarks</guid></item><item><title>Late Fragment by Raymond Carver</title><link>https://ho.dges.online/words/commonplace/late-fragment-by-raymond-carver/</link><description>&lt;p&gt;And did you get what&lt;br /&gt;
you wanted from this life, even so?&lt;br /&gt;
I did.&lt;br /&gt;
And what did you want?&lt;br /&gt;
To call myself beloved, to feel myself&lt;br /&gt;
beloved on the earth.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sun, 22 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/late-fragment-by-raymond-carver/</guid></item><item><title>Lenin On History</title><link>https://ho.dges.online/words/commonplace/lenin-on-history/</link><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;There are decades where nothing happens; and there are weeks where decades happen.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;</description><author>ho.dges.online</author><pubDate>Sun, 22 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/lenin-on-history/</guid></item><item><title>Kubernetes bookmarks</title><link>https://xenodium.com/kubernetes-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17462043"&gt;A Tutorial Introduction to Kubernetes (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11216020"&gt;Borg, Omega, Kubernetes: Lessons learned from container management over a decade (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fabric8.io/"&gt;Fabric8 is an integrated open source DevOps and Integration Platform (Kubernetes or OpenShift)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/artsy/hokusai"&gt;hokusai: Artsy's Docker / Kubernetes CLI and Workflow&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=14452819"&gt;Kubernetes by Example | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id%3D10438273"&gt;Swarm vs. Fleet vs. Kubernetes vs. Mesos (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id%3D10438273"&gt;Swarm vs. Fleet vs. Kubernetes vs. Mesos&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codefresh.io/howtos/local-k8s-draft-skaffold-garden/"&gt;The ultimate guide for local development on Kubernetes&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 21 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/kubernetes-bookmarks</guid></item><item><title>Docker bookmarks</title><link>https://xenodium.com/docker-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;[[&lt;a href="https://news.ycombinator.com/item?id=25619319"&gt;https://news.ycombinator.com/item?id=25619319&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;][Dockerfile Best Practices | Hacker News]].&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/beginners_guide_docker_compose/"&gt;A Beginner’s Guide To Docker Compose – Linux Hint&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22964972"&gt;Basic Docker Commands for Beginners | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id%3D10890233"&gt;Docker for Beginners (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://prakhar.me/docker-curriculum/"&gt;Docker for Beginners&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes"&gt;How To Remove Docker Images, Containers, and Volumes | DigitalOcean&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id%3D10969052"&gt;Simplifying Docker on OS X (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/b0rk/status/1237528379097616388"&gt;What problems have you run into in practice when using containers?&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 21 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/docker-bookmarks</guid></item><item><title>Angular bookmarks</title><link>https://xenodium.com/angular-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://egghead.io/technologies/angular2"&gt;Egghead.io's Angular 2 lessons&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 21 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/angular-bookmarks</guid></item><item><title>Mac OS bookmarks</title><link>https://xenodium.com/mac-os-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jrus/cocoa-text-system"&gt;Customizing the Cocoa Text System (github)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hcs.harvard.edu/~jrus/site/cocoa-text.html"&gt;Customizing the Cocoa Text System (~/Library/KeyBindings/DefaultKeyBinding.dict)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ttscoff/KeyBindings"&gt;GitHub - ttscoff/KeyBindings: DefaultKeybindings.dict for Mac OS X&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/appkit/nsstandardkeybindingresponding?language=objc"&gt;NSResponder (useful for DefaultKeyBinding.dict)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.daisydiskapp.com/"&gt;DaisyDisk&lt;/a&gt; (what's taking up your disk space).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://8thlight.com/blog/colin-jones/2015/11/06/dtrace-even-better-than-strace-for-osx.html"&gt;DTrace: {even better than} strace for OS X | 8th Light&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://flummox-engineering.blogspot.com/2014/06/getting-absolute-path-in-bash-in-osx.html"&gt;Getting absolute path in Bash in OSX&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fitztrev/shuttle"&gt;GitHub - fitztrev/shuttle: A simple SSH shortcut menu for macOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://csrc.nist.gov/publications/drafts/800-179/sp800_179_draft.pdf"&gt;Guide to Securing Apple OS X&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hammerspoon.org"&gt;Hammerspoon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.manpagez.com/man/8/kextstat/"&gt;kextstat&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://objective-see.com/products/kextviewr.html"&gt;KextViewr: View all modules on that are loaded in the OS kernel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.obdev.at/products/littlesnitch/index.html"&gt;Little Snitch&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raywenderlich.com/151741/macos-development-beginners-part-1"&gt;macOS Development for Beginners: Part 1&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raywenderlich.com/151746/macos-development-beginners-part-2"&gt;macOS Development for Beginners: Part 2&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raywenderlich.com/151748/macos-development-beginners-part-3"&gt;macOS Development for Beginners: Part 3&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pspdfkit.com/blog/2018/porting-ios-apps-to-mac-marzipan-iosmac-uikit-appkit/"&gt;Marzipan: Porting iOS Apps to the Mac (Inside PSPDFKit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kasper/phoenix"&gt;Phoenix: A lightweight macOS window and app manager scriptable with JavaScript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://subler.org/"&gt;Subler: Mac OS X app created to mux and tag mp4 files&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apple.stackexchange.com/questions/82/which-os-x-applications-do-you-find-indispensable/"&gt;Which OS X Applications do you find indispensable? (Stack Exchange)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 21 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/mac-os-bookmarks</guid></item><item><title>easy_install-\&amp;gt;pip-\&amp;gt;conda</title><link>https://xenodium.com/easy_install-pip-conda</link><description>&lt;p&gt;Spotted &lt;a href="http://conda.pydata.org/docs/index.html"&gt;Conda&lt;/a&gt; package manager. It handles python installations, in addition to package management. There's also a package index provided by &lt;a href="https://binstar.org/"&gt;Binstar&lt;/a&gt;. Installed &lt;a href="http://conda.pydata.org/miniconda.html"&gt;Miniconda&lt;/a&gt;, the bare bones Conda environment.&lt;/p&gt;
&lt;p&gt;Can't find a python package in Binstar? Here's a post on &lt;a href="http://www.peterbronez.com/Using%2520PyPi%2520Packages%2520with%2520Conda"&gt;Using PyPi Packages with Conda&lt;/a&gt;. If that fails, you can try pip from your Conda python environment.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 21 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/easy_install-pip-conda</guid></item><item><title>Links - November 20, 2015</title><link>https://faingezicht.com/links/2015/11/20/links/</link><description/><author>Avy Faingezicht</author><pubDate>Fri, 20 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/11/20/links/</guid></item><item><title>Build vs. Buy, Part 5</title><link>https://cmdev.com/blog/2015-11-20-buildvsbuy5/</link><description>Buy for parity, build for advantage</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Fri, 20 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-20-buildvsbuy5/</guid></item><item><title>[Computing] Insyde BIOS Issues</title><link>https://www.devever.net/~hl/insyde</link><description>&lt;p&gt;Insyde is a relatively new UEFI-style BIOS manufacturer.
      Unfortunately their product, Insyde H2O, leaves a great deal to be
      desired in terms of code quality.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Fri, 20 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/insyde</guid></item><item><title>The Walking Dead: Season 6</title><link>https://olshansky.info/tv/the_walking_dead_season_6/</link><description>Olshansky's review of The Walking Dead: Season 6</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 19 Nov 2015 14:30:57 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_walking_dead_season_6/</guid></item><item><title>Demand driven iOS apps with om and react native</title><link>https://david.coffee/demand-driven-ios-apps-with-om-and-react-native/</link><description>&lt;p&gt;I recently talked a lot about om and react native. Since people seemed quite interested in this topic, I decided to hold a little presentation at the last Tokyo iOS meetup in November.&lt;/p&gt;
&lt;p&gt;People were a bit overwhelmed (many never saw clojurescript before) but the general feedback was quite good. I am sure I convinced at least 1 person to give it a spin!&lt;/p&gt;
&lt;p&gt;In any way, here is my talk from that iOS meetup. Slides are available &lt;a href="http://www.slideshare.net/dvcrn/demand-driven-applications-with-omnext-and-react-native-55185632"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class="video-wrapper"&gt;

&lt;/div&gt;
&lt;p&gt;This was also the first time we decided to record things so excuse the mediocore quality. I experimented by putting a external microphone on the table next to me but didn&amp;rsquo;t realise that the macbook fan blowed straight into it. Still slightly better than the in-camera mic but still room for improvements.&lt;/p&gt;
&lt;p&gt;I for my part am very excited about clojurescript on native and super happy to be part of this still young but growing community. Clojurescript will come for you - if you want it or not. Better start learning it now! 😈&lt;/p&gt;</description><author>David Mohl</author><pubDate>Thu, 19 Nov 2015 13:01:23 GMT</pubDate><guid isPermaLink="true">https://david.coffee/demand-driven-ios-apps-with-om-and-react-native/</guid></item><item><title>White Chocolate Protein Flapjacks</title><link>https://rjp.is/blogging/posts/white-chocolate-protein-flapjacks-2/</link><description>Almost entirely a recipe I got from @chrismusther. Specific ingredients I used linked in [brackets].
Ingredients 75g Scottish Oats [Sainsbury&amp;rsquo;s] 75g Flax (Milled) [Linwoods Organic] 120g Whey Protein [Precision Engineered, Banana] 1 Apple (large) [Sainsbury&amp;rsquo;s 5 for £1] 300ml Apple Juice [Sainsbury&amp;rsquo;s Basics] 50g Mixed Fruit [Sainsbury&amp;rsquo;s Basics Dried] 30g Morello Cherries [Sainsbury&amp;rsquo;s Taste The Difference - Alternative] 20g Currants [Whitworths Juicy] 100g White Chocolate Chips [Sainsbury&amp;rsquo;s Cook&amp;rsquo;s] Method Put the oats, flax, whey protein, and chocolate chips into a bowl and mix loosely by hand to ensure a diverse community Grease up your silicon baking tray - 8&amp;quot; square is my preference Preheat your oven to about 150º / 305ºF / Gas Mark 2 Chop the apple as finely as you want the bits in your flapjacks but no finer than your sanity can allow Put the apple chunks, apple juice, and various fruits into a pan - precise ordering is irrelevant here Apply strong heat until the apple chunks go soft but before the juice really starts evaporating Pour the hot steaming fruit cocktail onto the aforementioned diverse oaty-flaxy-chocolatey-protein community and stir slowly but thoroughly This will create an astonishingly sticky mess that smells amazing - RESIST ALL TEMPTATION TO MASH YOUR FACE IN IT Carefully spoon the sticky mess into your baking tray, evening it out as much as you can (good luck with that) Place baking tray in oven and relax for 25-30 minutes until the top is firm Remove your delicious goodness from the oven and leave to cool before enjoying with a nice cup of tea Nutrition Based on the specific ingredients I used, MyFitnessPal reckons a 1/16th slice contains -</description><author>infrequent oscillations</author><pubDate>Thu, 19 Nov 2015 09:45:25 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/white-chocolate-protein-flapjacks-2/</guid></item><item><title>Build vs. Buy, Part 4</title><link>https://cmdev.com/blog/2015-11-19-buildvsbuy4/</link><description>Customization and programmability of commerical and bespoke software</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Thu, 19 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-19-buildvsbuy4/</guid></item><item><title>Why does the theatre cost ALL MY MONEY?</title><link>https://rjp.is/blogging/posts/why-does-the-theatre-cost-all-my-money-2/</link><description>In which we learn about the cost of theatre productions.</description><author>infrequent oscillations</author><pubDate>Wed, 18 Nov 2015 14:26:08 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/why-does-the-theatre-cost-all-my-money-2/</guid></item><item><title>Paper Lantern</title><link>https://june.kim/paper-lantern/</link><author>june.kim</author><pubDate>Wed, 18 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/paper-lantern/</guid></item><item><title>Links - November 18, 2015</title><link>https://faingezicht.com/links/2015/11/18/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 18 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/11/18/links/</guid></item><item><title>Build Vs. Buy, Part 3</title><link>https://cmdev.com/blog/2015-11-18-buildvsbuy3/</link><description>Polist and quality comparisons in vendor vs in-house software</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Wed, 18 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-18-buildvsbuy3/</guid></item><item><title>Organizational Patterns of Agile Software Development</title><link>https://june.kim/organizational-patterns/</link><author>june.kim</author><pubDate>Tue, 17 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/organizational-patterns/</guid></item><item><title>Links - November 17, 2015</title><link>https://faingezicht.com/links/2015/11/17/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 17 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/11/17/links/</guid></item><item><title>Intro to FlightJS</title><link>https://dylanpaulus.com/posts/2015/intro-to-flight-js/</link><description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This post is part of the archive. These are mainly random posts that were written throughout the years in no coherent order.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;FlightJS&lt;/h3&gt;
&lt;p&gt;FlightJs isn’t the new kid on the block. This little framework has gone unnoticed in Github-land for years. Taken from the FlightJS Github: “Flight is a lightweight, component-based JavaScript framework that maps behavior to DOM nodes.” Reworded, we use reusable components that listen for event calls. These events then in turn perform actions on the DOM or manipulate pieces of our code. Today we will get started with FlightJs, and show how simple it is to use. Though this is an introduction guide, I will assume that we have a fair proficiency with HTML, CSS, and JavaScript.&lt;br /&gt;
Getting Started&lt;/p&gt;
&lt;p&gt;In this Intro to FlightJS guide we will do what many intro framework guides do, make a counter. Let’s get to work.&lt;br /&gt;
Head over to the FlightJS Github, and install FlightJS using your favorite method.&lt;br /&gt;
HTML code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;h1&amp;gt;FlightJS Counter&amp;lt;/h1&amp;gt;
&amp;lt;div class="”counter”"&amp;gt;
  &amp;lt;h2 class="”counter-total”"&amp;gt;0&amp;lt;/h2&amp;gt;
  &amp;lt;div class="”counter-function”"&amp;gt;
    &amp;lt;a href="”#subtract”" class="”counter-subtract”"&amp;gt;-&amp;lt;/a&amp;gt;
    &amp;lt;a href="”#add”" class="”counter-add”"&amp;gt;+&amp;lt;/a&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Counter&lt;/h3&gt;
&lt;p&gt;To get started, let us create a FlightJS component. Since we will be creating a counter, we’ll create a Counter component.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var Counter = flight.component(function() {
   this.defaultAttrs({});
   this.after(“initialize”, function() {
   });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We did a few things in the example above. First, we created a new Flight component called Counter. Next, we defined that we have no default attributes to the Counter component (this will change soon). Attributes provide two big benefits: Component attributes create private variables for a component.&lt;/p&gt;
&lt;p&gt;Secondly, attributes give us a way to assign unique data to each instance of a component. Lastly, we have this weird &lt;code&gt;this.after(“initialize”)&lt;/code&gt; thing going on at the end. This is where a lot of the power comes from. Flight will execute the function we provide, as the second argument, after the initialize function has ran (initialize is an internal flight function) . Basically we’re telling Flight that once it gets itself in order, let us do what we need to.&lt;/p&gt;
&lt;p&gt;So what does a counter need? We need a total number that will be counted on. Oh yeah, and some buttons, that when clicked, either add or subtract one from the total. Let’s add this to our JavaScript.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var Counter = flight.component(function() {
   this.defaultAttrs({
      "subtractSelector": ".counter-subtract",
      "additionSelector": ".counter-add",
      "count": 0
   });
   this.subtract(function() {});
   this.add(function() {});
   this.after(“initialize”, function() {
     this.on("click", {
        "subtractSelector": this.subtract,
        "additionSelector": this.add
     });
   });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;First we added some attributes. These attributes provide us a DOM element for our subtract and add buttons—named subtractSelector and additionSelector respectively—and defines our starting number count. We then created some stubbed functions for once the selector’s event is triggered. Finally, an event handler is created. &lt;code&gt;this.on(“”)&lt;/code&gt; creates an event binding it to whatever we define within the quotes. In this case, we are waiting on a click event to be performed on our DOM selectors subtractSelector and additionSelector. Once a click is recognized, the corresponding function is called. (&lt;code&gt;this.subtract()&lt;/code&gt; or &lt;code&gt;this.add()&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;Continuing, here is our finished code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var Counter = flight.component(function() {
   this.defaultAttrs({
      "subtractSelector": ".counter-subtract",
      "additionSelector": ".counter-add",
      "count": 0
   });
   this.subtract = function() {
      this.attr.count--;
   }

   this.add = function() {
      this.attr.count++;
   }

   this.uiDisplayCount = function() {
      this.$node.find(“h2.counter-total”).html( this.attr.count );
   }

   this.after("add subtract", function() {
      this.uiDisplayCount();
   });
   this.after(“initialize”, function() {
     this.uiDisplayCount();
     this.on("click", {
        "subtractSelector": this.subtract,
        "additionSelector": this.add
     });
   });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally we get functionality. The subtract and add function perform a -1 or +1 on the total count depending on which event is triggered. Once we perform these actions on our count, we have no way of displaying the new information. This is where &lt;code&gt;this.uiDisplayCount&lt;/code&gt; plays its role. From any jQuery enthusiast, this function is straight forward. Take our count attribute, and insert it into the html of .counter-total. But, what is &lt;code&gt;this.$node&lt;/code&gt;? This.$node is a property given to us from Flight that grabs a jQuery object of the DOM this component is attached to. Later on we will attach the Counter component to the DOM, and see how this plays out. Going to the next function, we tell our component to execute the uiDisplayCount function after the add or subtract functions are done being executed.&lt;/p&gt;
&lt;p&gt;Now there is one thing missing, how do we actually attach this to the DOM?&lt;br /&gt;
&lt;code&gt;Counter.attachTo(“.counter”, { count: 100 });&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Going back to before, our &lt;code&gt;this.$node&lt;/code&gt; property would return a jQuery object of our .counter, &lt;code&gt;$(“.counter”)&lt;/code&gt;. As we can see by the second parameter, we can also change what our default attributes are once we attach the component. This helps enforce the modular code Flight preaches. We can change the attributes to fit whatever the situation.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Counter.attachTo(“.counter”, { count: 100 });
Counter.attachTo(“.counter-new”, {
                   count: 0,
                   subtractSelector: ".new-subtract"
                });
Counter.attachTo(".counter-new-new", {
                   subtractSelector: ".s",
                   additionSelector: ".a"
                });
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;We Did It&lt;/h3&gt;
&lt;p&gt;And that is it, we completed our counter! We can see from this little example, Flight gives us some powerful tools in creating modulated code without the need to learn new paradigms. As always, there is much more Flight can do. For additional information on Flight check out their Github.&lt;/p&gt;
&lt;h4&gt;Counter Example&lt;/h4&gt;
&lt;p&gt;Here is our finished product: &lt;a href="http://codepen.io/ganderzz/pen/pjNdNq"&gt;http://codepen.io/ganderzz/pen/pjNdNq&lt;/a&gt;&lt;/p&gt;</description><author>Dylan Paulus' Blog</author><pubDate>Tue, 17 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://dylanpaulus.com/posts/2015/intro-to-flight-js/</guid></item><item><title>Build Vs. Buy, Part 2.</title><link>https://cmdev.com/blog/2015-11-17-buildvsbuy2/</link><description>Upgrades and feature creep in commercial software</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Tue, 17 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-17-buildvsbuy2/</guid></item><item><title>It Is Not The Critic Who Counts by Theodore Roosevelt</title><link>https://ho.dges.online/words/commonplace/it-is-not-the-critic-who-counts-by-theodore-roosevelt/</link><description>&lt;p&gt;It is not the critic who counts. Not the man who points out how the strong man stumbles or where the diet of deeds could have done them better. The credit belongs to the man who is actually in the arena, whose face is marred by dust and sweat and blood. Who strives valiantly. Who errs. Who comes short again and again. Because there is no effort without error and shortcoming.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Tue, 17 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/it-is-not-the-critic-who-counts-by-theodore-roosevelt/</guid></item><item><title>Announcing White Glove</title><link>https://peterlyons.com/problog/2015/11/announcing-white-glove/</link><description>&lt;p&gt;I've open-sourced my mongodb/couchdb data integrity analysis tool called white glove. You can find it at &lt;a href="https://github.com/focusaurus/white-glove"&gt;focusaurus/white-glove&lt;/a&gt; on github and &lt;a href="https://npmjs.com/package/white-glove"&gt;white-glove on npm&lt;/a&gt;. It helps with both schema discovery of a new or unfamiliar database as well as scanning your data for inconsistencies that may help you prevent problems before they cause any impact to end users.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Mon, 16 Nov 2015 17:20:59 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2015/11/announcing-white-glove/</guid></item><item><title>Elite Proxies</title><link>https://www.anardil.net/2015/elite-proxies.html</link><description>&lt;p&gt;What they are, how they work, how they can be useful, and how you can use one yourself&lt;/p&gt;</description><author>Anardil</author><pubDate>Mon, 16 Nov 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2015/elite-proxies.html</guid></item><item><title>Ant-Man</title><link>https://olshansky.info/movie/ant-man/</link><description>Olshansky's review of Ant-Man</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 16 Nov 2015 09:49:24 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/ant-man/</guid></item><item><title>Traditional music bookmarks</title><link>https://xenodium.com/traditional-music-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://asianclassicalmp3.org/"&gt;Cliff Sloane's asian classical music in mp3 format&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://oriental-traditional-music.blogspot.in"&gt;Oriental traditional music&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v%3D4PVGmjYypGU&amp;amp;feature%3Dyoutu.be"&gt;Shruti Box comparison&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 16 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/traditional-music-bookmarks</guid></item><item><title>Links - November 16, 2015</title><link>https://faingezicht.com/links/2015/11/16/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 16 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/11/16/links/</guid></item><item><title>Grounding, part 4: Explaining leaky abstractions</title><link>http://dimitarsimeonov.com/2015/11/16/grounding-part-4-explaining-leaky-abstractions</link><description>&lt;p&gt;Some concepts are very complex and need a long explanation.  But we
might decide to take a shortcut and simplify the concept when
describing it.&lt;/p&gt;

&lt;p&gt;That short explanation is misleading.&lt;/p&gt;

&lt;p&gt;Lets see why…  For example, we might be trying to explain
electro-magnetism. A full explanation will include Maxwell’s
equations, definitions of electric and magnetic fields a discussion of
ferromagnets, and more. A shortcut explanation might be that magnets
attract like rubber bands.&lt;/p&gt;

&lt;p&gt;The shortcut might suffice for a while. It gets the rough idea of
“attraction” across, but cannot be trusted as a base for further
inference. Rubber bands break if they are stretched too much, but
magnets still work over very far distances - albeit weakly.  Coldness
increases the power of magnets, but decreases the flexibility of a
rubber band.&lt;/p&gt;

&lt;p&gt;To refine our understanding of magnets, we need to start imagining
rubber bands that behave differently with temperature, knowing that
they get weaker with heath.  This is an exception to our common sense,
and it requires a bunch of effort to remember it and apply it
properly.&lt;/p&gt;

&lt;p&gt;Pretty soon we start keeping all these exceptions to the rule in our
heads. This is wasteful, and defeats the point of the short
explanation.  We could have redirected that extra effort to towards
learning Maxwell’s equations properly.  A person which blindly follows
the rubber band model might save effort for a little bit, but over
time they will spend more mental energy to keep their mental model in
sync with reality.  They will have larger error and disappointment
when the model fails…&lt;/p&gt;

&lt;p&gt;The cautious thing would be to realize when the model works and when
it doesn’t work and to only use it, when it works, for a while, and
not depend too much on it. Misleading models are a shaky foundation
for reasoning.&lt;/p&gt;

&lt;p&gt;But which models are not misleading? Even the laws of physics get
disputed by other physicists.&lt;/p&gt;

&lt;p&gt;The answer is that there are no perfect models. Every model is an
abstraction over reality, and all abstractions are leaky. That’s the
&lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;law of leaky abstractions&lt;/a&gt;, defined by Joel Spolsky.  All models that
we use in the daily life are imprecise in some way.&lt;/p&gt;

&lt;p&gt;But lets not despair. Some models are more precise and trustworthy
than others. They can go a very, very long way towards practicality.&lt;/p&gt;

&lt;p&gt;Physics models, for example, a.k.a. the laws of physics, are usually
so precise that the scientists in CERN can use them to take single
particles and hit them with really high speed, and measure very tiny
deviations from their expectations.&lt;/p&gt;

&lt;p&gt;Other models, usually the non-scientific ones, are much less reliable.
Many economic models are only approximate, and they have been derived
in situations, that are no longer applicable as the markets and
regulations evolve.  Lets just remember this every time there is a market
crash.&lt;/p&gt;

&lt;p&gt;To be fair, even leak-free abstractions might not be able to fully
predict everything. For example, many deterministic mathematical
models of dynamic systems can exhibit chaotic behavior - which means
that even the slightest error in measurement of the truth can lead to
enormous deviations over time. This is why you can’t predict the
weather. The world changes deterministically according to the law of
physics, but similar starting conditions can lead to very different
outcomes over time. This is what people refer to as the butterfly
effect.  A change as small as the flap of the wings of a butterfly
might cause a hurricane in to future to happen, or not. If the
butterfly is at the right place at the right time.&lt;/p&gt;

&lt;p&gt;Getting back to the situation in which we need to provide a short
explanation for something too complex, we have several options.&lt;/p&gt;

&lt;p&gt;One option is to provide a metaphorical explanation, a shortcut, but
make it clear that it isn’t what actually happens. This way they at
least are aware that we aren’t giving them the full story. This can be
the quickest approach, as long as our audience doesn’t keep on asking
“Why?”&lt;/p&gt;

&lt;p&gt;Another option is to ask our audience to bear with us while we develop
the idea.  This works well in college classes and other situations,
but is not always available. Neither our audience, nor us have time
for it, for everything. A benefit of this approach is that we’ll get
to actually understand the concept better if we have to fully teach
it.&lt;/p&gt;

&lt;p&gt;Yet another option is is to find some middle ground in which we
gradually build up the concept, and progressively close each leak in
understanding. We can make the practical parts rock solid, and
hand-wave around the non-important parts. It may be really hard to
know which parts are important though.&lt;/p&gt;

&lt;p&gt;There is no single right approach that works all the time. Read the
situation.&lt;/p&gt;</description><author>D13V</author><pubDate>Mon, 16 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2015/11/16/grounding-part-4-explaining-leaky-abstractions</guid></item><item><title>Build vs. Buy -- Responding to All-or-Nothing Approaches</title><link>https://cmdev.com/blog/2015-11-16-buildvsbuy1/</link><description>Technology, cost, and quality in deciding build vs buy</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Mon, 16 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-16-buildvsbuy1/</guid></item><item><title>Continuous Integration, Misapplied</title><link>https://cmdev.com/blog/2015-11-15-continuousintegrationmisapplied/</link><description>Putting together an continuous-integration-style automated build and deploy halfway through the project is exponentially more effort than starting off with one. At some point in the project, it may even be that the effort outweighs the gain.</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Sun, 15 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-11-15-continuousintegrationmisapplied/</guid></item><item><title>Recommended Reading (or listening)</title><link>https://justingarrison.com/blog/2015-11-15-recommended-reading-or-listening/</link><description>At my current job I have the luxury of a typical Southern California commute.</description><author>Justin Garrison's Homepage</author><pubDate>Sun, 15 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2015-11-15-recommended-reading-or-listening/</guid></item><item><title>LiveReload for Chrome extensions with Gulp</title><link>https://www.seanw.org/blog/livereload-for-chrome-extensions/</link><description>LiveReload is a fantastic feature to add to your development workflow to increase your productivity. The general idea is that when a change occurs to a file that makes up your app, your app is automatically rebuilt and the app restarts itself. This saves you from manually rebuilding and restarting your app each time you make a change and generally makes development much more pleasant.
There are LiveReload implementations available for many languages and frameworks such as tiny-lr which can be used with Gulp for web development.</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Sun, 15 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/livereload-for-chrome-extensions/</guid></item><item><title>Matching arbitrary URL's to custom Firefox profiles</title><link>https://purpleidea.com/blog/2015/11/14/matching-arbitrary-urls-to-custom-firefox-profiles/</link><description>&lt;p&gt;We&amp;rsquo;re constantly clicking on all sorts of different URL&amp;rsquo;s throughout the day. These clickable links appear in webpages (including in &amp;ldquo;&lt;a href="https://www.gnu.org/philosophy/who-does-that-server-really-serve.html"&gt;web apps&lt;/a&gt;&amp;rdquo; like gmail) in mail clients like &lt;a href="https://en.wikipedia.org/wiki/Evolution_%28software%29"&gt;Evolution&lt;/a&gt;, in terminals such as &lt;a href="https://wiki.gnome.org/Apps/Terminal"&gt;GNOME-terminal&lt;/a&gt;, and any other &lt;a href="https://en.wikipedia.org/wiki/GTK%2B"&gt;GTK+&lt;/a&gt; app on your GNU/Linux desktop. I wanted to perform custom actions when arbitrary URL&amp;rsquo;s are clicked, including running certain links in separate Firefox profiles. There are a bunch of different steps you have to do to get this working, but it should be easy to follow along. I&amp;rsquo;m doing all of this on &lt;a href="https://getfedora.org/"&gt;Fedora 23&lt;/a&gt;, but it should work on other GNU/Linux environments.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Sat, 14 Nov 2015 08:50:35 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/11/14/matching-arbitrary-urls-to-custom-firefox-profiles/</guid></item><item><title>HTTP/2 and SSL</title><link>https://rjp.is/blogging/posts/http-2-and-ssl-2/</link><description>rjp.is is now HTTPS-only; and also supports HTTP/2 [FAQ] for future proofing.
Here&amp;rsquo;s an owl to compensate for the entertainment-free nature of this post.</description><author>infrequent oscillations</author><pubDate>Fri, 13 Nov 2015 15:58:53 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/http-2-and-ssl-2/</guid></item><item><title>Links - November 13, 2015</title><link>https://faingezicht.com/links/2015/11/13/links/</link><description/><author>Avy Faingezicht</author><pubDate>Fri, 13 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/11/13/links/</guid></item><item><title>2015-11-13</title><link>https://ho.dges.online/pictures/2015-11-13/</link><description>&lt;p&gt;A&amp;amp;J rocking that Hollywood matinee idol look.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Fri, 13 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-11-13/</guid></item><item><title>Fix Played Tracks with Empty Playcount in iTunes</title><link>https://donatstudios.com/iTunesPlaycountZeroFix</link><description>&lt;p&gt;I have a quite large iTunes library, and I’m rather anal about keeping my metadata clean and up to date.  In an earlier release of iTunes 12 there was a bug. Every so often after a song played, the Play Count would fail to increment, but the Last Played would update.&lt;/p&gt;
&lt;p&gt;Searching my library, I found 74 tracks that had this issue.&lt;/p&gt;
&lt;p&gt;I found this irritating and inaccurate, so I set forth finding a way to correct it.&lt;/p&gt;
&lt;p&gt;I wrote the following simple AppleScript to set the playcount of such tracks to 1.&lt;/p&gt;
&lt;p&gt;All you need to do is either paste the following into the 'Script Editor' or &lt;a href="https://cdn.rawgit.com/donatj/12b86fc65982e29f20a2/raw/3fd49e20267caf34d1ac60b62f2114a2ac57839c/FixITunesPlayedCount.applescript"&gt;download&lt;/a&gt; it and run it.  See video below if you need help running it once it’s open.&lt;/p&gt;
&lt;video controls="controls" loop="loop" preload="auto" style="display: block; margin: 0 auto;"&gt;
      &lt;source src="https://donatstudios.com/assets/60/fixitunes.mp4" type="video/mp4" /&gt;
      &lt;p&gt;To view this video please enable JavaScript and upgrade to a web browser that &lt;a href="https://videojs.com/html5-video-support/" target="_blank"&gt;supports HTML5 video&lt;/a&gt;&lt;/p&gt;
&lt;/video&gt;</description><author>Donat Studios</author><pubDate>Thu, 12 Nov 2015 05:50:58 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/iTunesPlaycountZeroFix</guid></item><item><title>It’s secure… until it’s not</title><link>https://www.danstroot.com/posts/2015-11-12-it-is-secure-until-its-not</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/bramah.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Is there a such thing as perfect security? In the 1770s Joseph Bramah created a lock that was vastly superior to any the world ever seen. Bramah believed it was 100% theft-proof. It was, and then it wasn't.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2015-11-12-it-is-secure-until-its-not"&gt;It’s secure… until it’s not&lt;/a&gt; first appeared on &lt;a href="https://www.danstroot.com"&gt;Dan Stroot's Blog&lt;/a&gt;</description><author>Dan Stroot</author><pubDate>Thu, 12 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2015-11-12-it-is-secure-until-its-not</guid></item><item><title>Das Keyboard Review</title><link>https://www.anardil.net/2015/das-keyboard-review.html</link><description>&lt;p&gt;Das Keyboard 4C Ultimate Review&lt;/p&gt;</description><author>Anardil</author><pubDate>Wed, 11 Nov 2015 22:30:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2015/das-keyboard-review.html</guid></item><item><title>Three years of (proprietary) projects</title><link>https://blog.separateconcerns.com/2013-06-20-three-years-proprietary-projects.html</link><description>&lt;p&gt;Some of the code I write is Open Source, but these days most of it is closed source and property of &lt;a href="http://www.moodstocks.com/"&gt;Moodstocks&lt;/a&gt;, the startup I work for. For the last three years I have had the chance to work on a lot of really interesting projects, the most significant of which I will talk about now. If you are still a student, maybe that can inspire you to join a startup. Maybe you will even decide to join us in our quest to advance mobile image recognition and applications in general.&lt;/p&gt;
&lt;section id="Harvest-the-Pikadeo-crawler"&gt;
&lt;h2&gt;Harvest, the Pikadeo crawler&lt;/h2&gt;
&lt;p&gt;When I joined Moodstocks in April 2010 the team was working on a mobile price comparison application called Pikadeo. The pitch was that you could take a picture of any cultural product (CD, DVD, book…) and it would give you a list of places where you could buy it, sorted by price.&lt;/p&gt;
&lt;p&gt;The iOS application itself, largely designed by &lt;a href="https://twitter.com/Arcank"&gt;Louis Romero&lt;/a&gt; who had interned at Moodstocks and left just as I arrived, was working. The image recognition technology was working too, although it was purely server-side. The team was already researching how to leverage client-side processing but it was really just a crazy idea at that point, so Pikadeo was doing what most “mobile” image recognition software still does: send JPEG frames to the server.&lt;/p&gt;
&lt;p&gt;What was missing was the data. We needed to crawl several large e-commerce websites, extract product images and metadata, send the former to the image recognition engine and the store the latter in a database. So I set out to write a crawler in Ruby, which was the dynamic language of choice of the team at the time. Moodstocks was a Ruby / C++ shop due to the background of the founders. Obviously things have changed a lot since then.&lt;/p&gt;
&lt;p&gt;I tried to use Hadoop for the job, mostly because it was trending at that time and I had access to Amazon’s Elastic MapReduce. I soon understood that 1) the Hadoop Streaming interface was not quite there yet so I would have to switch to Java and 2) the Map/Reduce paradigm was not the best for the job anyway.&lt;/p&gt;
&lt;p&gt;After reading a few papers on crawling (I had to anyway, since that project would be the basis of my MSc thesis, but it actually helped a lot) I ended up writing a kind of Master/Worker system, with work queues in &lt;a href="http://kr.github.io/beanstalkd/"&gt;Beanstalkd&lt;/a&gt; and metadata storage in Amazon’s SimpleDB, which did the job. It did the job a little too well, actually, since it ended up DDoSing an e-commerce website for a few seconds during a performance test for my thesis. Fortunately I was monitoring it and hit the stop button…&lt;/p&gt;
&lt;p&gt;After setting reasonable speed limits and balancing the requests between various websites, Harvest was fast enough for our needs. The bottleneck became the image search engine itself, I will expand on that later.&lt;/p&gt;
&lt;p&gt;Due to the deprecation of the Pikadeo product, Harvest is no longer used today. It is probably a good thing: it was my first Ruby program so the code was awful, it was way too complex and too tied to AWS (the master instance would run and kill worker instances, it relied a lot on SimpleDB…). That being said, the crawling model was sound.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Acorn"&gt;
&lt;h2&gt;Acorn&lt;/h2&gt;
&lt;p&gt;Once we got crawling sorted out, the image recognition engine itself became the problem. Oak (it has become a tradition to use plant-related names for our projects internally) had been almost entirely written by &lt;a href="https://twitter.com/deltheil"&gt;Cédric&lt;/a&gt;, Moodstocks’ CTO. It was a piece of C++ software, with the image recognition parts isolated in dynamic libraries and a &lt;a href="http://thrift.apache.org/"&gt;Thrift&lt;/a&gt; layer to interface with the core Ruby on Rails Web application. It was multithreaded, designed to run on a single multicore EC2 instance.&lt;/p&gt;
&lt;p&gt;The scalability pain point, it turned out, was not CPU load. The index was stored in a B+ Tree in &lt;a href="https://dbdb.io/db/tokyo-cabinet"&gt;Tokyo Cabinet&lt;/a&gt;, a tool we like a lot and still use today in other parts of our system. The problem was that when we indexed millions of images the dataset would inevitably become very large, larger than the available memory. The system would still be very responsive on most reads, but writes would invalidate large chunks of the in-memory cache and result in long pauses.&lt;/p&gt;
&lt;p&gt;Latency is the enemy when you write image recognition software, so we decided not to sacrifice it: all the index had to fit in RAM. We decided to consider RAM as our primary datastore. That decision would bring about our later choices.&lt;/p&gt;
&lt;p&gt;Since rebuilding an index can be &lt;strong&gt;very&lt;/strong&gt; long we wanted something that could persist even if the engine crashed or had to be restarted for an update. Soon it became obvious that Redis could be the answer. However it was missing some commands that we needed, especially one that would insert the same key with different values in different maps (if you have already written inverted indices you may understand why, otherwise have a look at &lt;a href="http://files.catwell.info/presentations/2011-osdcfr-redis-iidx/"&gt;that presentation&lt;/a&gt;). Lua scripting was what we needed, but it wasn’t there yet so I ended up forking Redis to develop it in C while &lt;a href="http://files.catwell.info/presentations/2011-osdcfr-redis-iidx/img03.png"&gt;lobbying for scripting support&lt;/a&gt;. Acorn was, to my knowledge, the first application to run Redis 2.5 in production, and the first one to use Redis scripting too. We never encountered any Redis-related crash.&lt;/p&gt;
&lt;p&gt;Now, to have the index fit entirely in RAM, we would have to distribute it across different machines, so Acorn would have to be a distributed system. Knowing that, I chose to make Acorn nodes single-threaded: they would communicate by message passing and we would have several of them per instance.&lt;/p&gt;
&lt;p&gt;We chose &lt;a href="http://msgpack.org/"&gt;MessagePack&lt;/a&gt; for serialization of Redis values, and I started looking at &lt;a href="https://github.com/msgpack/msgpack-rpc"&gt;MessagePack-RPC&lt;/a&gt;. It had a lot of the pieces that I wanted for the distribution part, and one major problem: it was only usable in Ruby. But we were not CPU-bound… Would it be sensible to write the engine in a dynamic language? I started investigating that possibility. Our C++ libraries already had Ruby bindings that we used for vision R&amp;amp;D, and the little number crunching Oak Core did (mostly different scoring algorithms) turned out to be fast enough in Ruby.&lt;/p&gt;
&lt;p&gt;So Acorn ended up as a distributed system written in Ruby, with MessagePack-RPC for communication and a fork of the development branch of Redis at its heart. It used MessagePack-RPC for communication with our Rails stack too.&lt;/p&gt;
&lt;p&gt;In retrospect, relying on two unstable pieces of software was risky. It turned out well, and Redis was definitely the right choice, especially since Lua Scripting now allows us to use a regular, stable 2.6 version. &lt;a href="http://www.zeromq.org/"&gt;0MQ&lt;/a&gt; would probably have been a better technical choice than MessagePack-RPC, and plain C better than Ruby, but I believe those choices saved us development time, and time to market was important. Acorn is still in production today, doing its job for legacy clients who use online recognition.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Moodstocks-Notes"&gt;
&lt;h2&gt;Moodstocks Notes&lt;/h2&gt;
&lt;p&gt;You now know that when I joined Moodstocks it was trying to be a B2C company. However we were seeing interest in licensing our technology, and began to envision a B2B product: Moodstocks API.&lt;/p&gt;
&lt;p&gt;When you write an API, especially as a product, you must write applications for it simultaneously. They serve two purposes: demonstrate what your API can do, and help you figure out how it should be improved. We set out to do that with two mobile applications, one of which was Notes.&lt;/p&gt;
&lt;p&gt;The original idea I proposed was, I think, simple: &lt;a href="https://en.wikipedia.org/wiki/Google_Sidewiki"&gt;Google SideWiki&lt;/a&gt; (RIP) for the real world. That is: you walk in the street, you see something interesting, you take a picture of it, you get a comments thread. If you are the first to do so, you get to leave the first comment (yay, first!!1).&lt;/p&gt;
&lt;p&gt;As we were looking to add virality to it, that idea developed into a kind of mostly mobile social network where both people and objects could be followed. Objects actually had their own timeline with an associated Atom feed, which you could reach by browsing or, of course, as the result of an image search.&lt;/p&gt;
&lt;p&gt;Technically the server-side part of Notes was a rather classic Sinatra application. The most interesting part of it was that it used some kind of CQRS architecture with all reads coming from Redis and all writes going to log-structured storage. The very nice thing about it was that any part of it could be replayed so it was almost trivial to reproduce bugs or replicate production incrementally to a development setup.&lt;/p&gt;
&lt;p&gt;The iPhone application, on the other hand, was one of the nicest and most complex ones we have ever written. I wasn’t responsible for it so I won’t get into details here but the latest internal version we never actually released was IMO a thing of beauty.&lt;/p&gt;
&lt;p&gt;As it turned out, Notes got a reasonable amount of &lt;a href="http://techcrunch.com/2010/12/10/moodstocks-notes-is-stickybits-without-the-barcodes/"&gt;online&lt;/a&gt; &lt;a href="http://mashable.com/2010/12/18/moodstocks/"&gt;press&lt;/a&gt; after our CEO showed it to Michael Arrington at the Le Web conference. This got us a few users and we briefly thought about making it a product in its own right. I wrote a wxPython GUI to analyze logs, trying my hand for the first time at techniques like cohort analysis.&lt;/p&gt;
&lt;p&gt;Eventually we took the decision not to invest more time in the idea: we were a small team and our now core B2B business needed our attention. Notes’ success was a long shot and would have required significant time and money investment so I guess it was the right decision, although I would love to see someone revisit the idea.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Moodstocks-API-v2"&gt;
&lt;h2&gt;Moodstocks API v2&lt;/h2&gt;
&lt;p&gt;As I said, Notes was written to help us design our API. Using its feedback and that from the few users of our v1 API, which was more some kind of beta, I set out to write version two.&lt;/p&gt;
&lt;p&gt;I will not expand too much on all its aspects here, REST-ish API design being well covered in the literature and online (start &lt;a href="https://www.amazon.com/gp/product/0596801688/"&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The main differences with API v1 were the use of JSON instead of XML, and the ability to index a single image by uploading it to the API using multipart post. Previously, users would upload a XML list of image URLs and associated IDs; we would download them and tell you when indexing was over. Now users index single images and changes are taken into account instantly. The necessity for that was a lesson from Notes and user feedback, and it was made possible by Acorn.&lt;/p&gt;
&lt;p&gt;Another interesting choice was the authentication method, HTTP Digest, which we kept from version one. Theoretically, it had all the right properties and was a standard, so it was the best choice. What we had not realized is how many &lt;a href="http://devblog.avdi.org/2013/02/04/the-trouble-with-http-digest-authentication/"&gt;implementations were broken&lt;/a&gt; or incomplete (i.e. not supporting nonce reuse, which is a necessity on mobile to reduce the number of HTTP requests). I ended up having to submit patches to a lot of them, and I am not even mentioning .NET land… If I had to do it again today I would probably go with Basic Auth and SSL.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Acorn-Quantizer"&gt;
&lt;h2&gt;Acorn Quantizer&lt;/h2&gt;
&lt;p&gt;Earlier, I wrote about how I had made Acorn processes single-threaded. This had some advantages, but also a big inconvenient.&lt;/p&gt;
&lt;p&gt;Part of the image search process involves quantizing features, which means associating vectors in a many-dimensional space to integers. To do this the &lt;a href="http://en.wikipedia.org/wiki/Curse_of_dimensionality"&gt;curse of dimensionality&lt;/a&gt; forces you to use an approximate nearest-neighbor search algorithm.&lt;/p&gt;
&lt;p&gt;The way it works is: take a large number of features from a representative dataset and use some kind of clustering algorithm (e.g. k-means) on them to obtain a bunch of centroids (a “vocabulary”), then process these centroids to obtain a datastructure called kd-forest which will be used to perform nearest-neighbor search (a “dictionary”).&lt;/p&gt;
&lt;p&gt;Vocabulary generation is clearly an offline task that requires a lot of number crunching and is done as little as possible. Generating the kd-forest, on the other hand, takes from a handful of seconds to a few minutes depending on the size of the vocabulary, so it is frequently done on engine startup. The kd-tree itself only exists in RAM.&lt;/p&gt;
&lt;p&gt;The problem with that was that a kd-forest is a rather large datastructure. In our case it occupied hundreds of MB of RAM and took about one minute to generate. That was OK with Oak, where it was shared between threads, but with Acorn that overhead had to be paid for every process, both in space and time. We had to find a way to share the kd-forest across Acorn nodes on the same machine, and if possible to make startup faster.&lt;/p&gt;
&lt;p&gt;The solution I opted for was to rewrite the whole quantizer. Previously we had been using popular Open Source libraries for this, but they didn’t do what I wanted.&lt;/p&gt;
&lt;p&gt;I wrote the kd-forest generation algorithm as a &lt;a href="http://luajit.org/"&gt;LuaJIT&lt;/a&gt; program. It was the first Lua program officially used in production at Moodstocks, although as you will see it was only run offline. What it does is take centroids as input, generate a kd-forest and serialize it in a way easily readable in C thanks to the FFI. It can also actually perform nearest-neighbor searches but this is only used for test purpose.&lt;/p&gt;
&lt;p&gt;Once the kd-forest is serialized, it can be loaded into &lt;a href="https://beej.us/guide/bgipc/html/#shm"&gt;system shared memory&lt;/a&gt; quite fast. A C library can then be used in every Acorn process to access this shared memory read-only and perform nearest-neighbor searches.&lt;/p&gt;
&lt;p&gt;The idea is simple once you stop under-estimating the capabilities of SHM on Linux. By default it usually limited to a few MB so you have to increase it a lot for this to work (it can be done with &lt;a href="http://linux.die.net/man/8/sysctl"&gt;sysctl&lt;/a&gt;). The implementation, on the other hand, is far from trivial. My code uses a &lt;strong&gt;lot&lt;/strong&gt; of pointer arithmetics, I should probably clean it up someday, but in the meantime it does its job perfectly.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Seed"&gt;
&lt;h2&gt;Seed&lt;/h2&gt;
&lt;p&gt;The Acorn Quantizer was the last major improvement to our online search stack. Around that time, we resolved on a major technological shift: we would perform image recognition on mobile devices directly instead of doing it on the server. Of course, initially, we would have an hybrid approach where on-device recognition would work as a kind of cache, but the mobile was where we would focus our efforts.&lt;/p&gt;
&lt;p&gt;Doing on-device image recognition, though, almost meant starting from scratch: we had to make different technological trade-offs, use very different algorithms, and that meant writing an almost entirely new image recognition stack. We named that project Seed.&lt;/p&gt;
&lt;p&gt;Seed encompasses a lot of things now, but at its core are proprietary Computer Vision algorithms that we set out to develop with Cédric and &lt;a href="https://twitter.com/mbrenon"&gt;Maxime&lt;/a&gt;, who had joined us by then. We would discuss them as a team, then Maxime and Cédric would implement them in C while I would work on a Lua version.&lt;/p&gt;
&lt;p&gt;The big picture is that some processing is done on the server at indexing time to generate signatures which are then sent to the client. Server-side software used to be entirely Lua, client-side software entirely C, but we decided to implement the whole stack in both languages. I think that was one of the best ideas we ever had. Being able to compare results avoided errors on both sides (tricky things like off-by-ones were always noticed thanks to the fact that Lua is 1-based, floating-point math issues were found…). Lua allowed faster prototyping on some parts and it was interesting to compare the different architectural choices we were making.&lt;/p&gt;
&lt;p&gt;With the current (second) generation of the Seed algorithms, we are actually mostly using the C implementation through the LuaJIT FFI on the server side now. That is because I have been working on other projects while the rest of the team (which is not as comfortable with Lua) was developing them, so I would have been a bottleneck if we had kept the dual stack approach. I may well bring the Lua branch up to date someday though, who knows?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="chksrv-and-chkcoherence"&gt;
&lt;h2&gt;chksrv and chkcoherence&lt;/h2&gt;
&lt;p&gt;Moodstocks’ server-side architecture is &lt;a href="https://blog.separateconcerns.com/2013-01-02-startups-soa.html"&gt;some kind of SOA&lt;/a&gt;. That means we have a lot of different services that run as daemons and need to stay up. chksrv is a medium-sized program in Bash that takes care of this. It is deployed on every instance with a configuration file that indicates which services should be running on that instance, and it makes sure that they are (correctly). It also checks if other instances are up. If something goes wrongs, it warns the “ops team”, who is basically me and Cédric as a backup in case I am not available.&lt;/p&gt;
&lt;p&gt;chksrv is a very useful piece of software but I was a bit worried by its growth as we added services. Standardizing the way we deamonize processes helped a lot with that by increasing code reuse (thank you &lt;a href="http://libslack.org/"&gt;libslack&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;chkcoherence is the ideal complement to chksrv: where the latter checks if services are running, the former verifies that they are doing things right. It is also written in Bash at the top level. I have already written about its concept &lt;a href="https://blog.separateconcerns.com/2013-05-28-coherence-checks.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Anemone"&gt;
&lt;h2&gt;Anemone&lt;/h2&gt;
&lt;p&gt;Anemone is the project that deals with everything related to metrics and measurements at Moodstocks. It is written in Lua and has quite a few different roles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
collect logs and data from production instances;
&lt;/li&gt;
&lt;li&gt;
generate internal daily and weekly reports with business metrics for the platforms and email them to the team;
&lt;/li&gt;
&lt;li&gt;
generate technical reports for operations (e.g. growth of different datasets);
&lt;/li&gt;
&lt;li&gt;
generate weekly reports per application and email them to our platform customers;
&lt;/li&gt;
&lt;li&gt;
generate custom reports tailored to the needs of our enterprise customers.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also has a web-based dashboard for the team with high-level KPI, written in JavaScript and &lt;a href="http://code.google.com/p/flot/"&gt;flot&lt;/a&gt;. Someday I might integrate Brett Slatkin’s &lt;a href="https://bslatkin.github.io/cohorts/"&gt;Cohort Visualizer&lt;/a&gt; into it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Dandelion"&gt;
&lt;h2&gt;Dandelion&lt;/h2&gt;
&lt;p&gt;I said earlier that with Seed we generate image signatures on the server and send them to the mobile clients where they are used for recognition. Dandelion is the code name of the service responsible for that.&lt;/p&gt;
&lt;p&gt;It turns out efficiently sending millions of image signatures per day, over slow and unreliable networks, to devices everywhere in the world, is not trivial. So Dandelion, more than software, is a synchronization protocol and its implementation; a range of tricks to make the best of mobile networks packaged as software. It is one of the reasons (along with all the innovation on CV algorithms and their optimized client-side implementation) why we can propose client-side recognition with databases of thousands of images or even videos, an order of magnitude more than our competitors.&lt;/p&gt;
&lt;p&gt;The server part of Dandelion is written in Lua and depends on pieces like Redis and Beanstalkd, which is why I wrote &lt;a href="https://github.com/catwell/haricot"&gt;haricot&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="Physalis"&gt;
&lt;h2&gt;Physalis&lt;/h2&gt;
&lt;p&gt;Finally, Physalis is the project I am currently working on. It has not been released yet so I won’t get into the details, but I can explain the reasoning behind it.&lt;/p&gt;
&lt;p&gt;While we were building Dandelion and through our experience with our clients, we learned the following things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
writing mobile applications that work offline but keep their data up to date is tricky;
&lt;/li&gt;
&lt;li&gt;
most developers who attempt to implement it from scratch end up with a broken solution or just give up;
&lt;/li&gt;
&lt;li&gt;
when you succeed it makes your applications a &lt;strong&gt;lot&lt;/strong&gt; better.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So we thought: we have done it, why not make it accessible to everybody? This is what Physalis is: Moodstocks’ image signature distribution system generalized so that you can leverage it for your own mobile application.&lt;/p&gt;
&lt;p&gt;Physalis will be available in private alpha for selected users soon, under its real brand name (Physalis is only its “internal plant-themed name”). If you are interested in trying it out, &lt;a href="https://twitter.com/pchapuis"&gt;get in touch&lt;/a&gt;. The requirements are that you should be making a mobile application and ready to communicate on a regular basis with us: we are doing this alpha to collect useful feedback.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;EDIT: Physalis was eventually released in August 2013 as &lt;a href="https://winch.io/"&gt;Winch&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/section&gt;</description><author>Separate Concerns</author><pubDate>Wed, 11 Nov 2015 22:15:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2013-06-20-three-years-proprietary-projects.html</guid></item><item><title>Strategy Design Pattern</title><link>https://denvaar.dev/posts/design_patterns_strategy.html</link><description>Quick example of the Strategy pattern in Python.</description><author>denvaar's website</author><pubDate>Wed, 11 Nov 2015 08:40:09 GMT</pubDate><guid isPermaLink="true">https://denvaar.dev/posts/design_patterns_strategy.html</guid></item><item><title>Troubleshooting Another Complex Performance Issue – Oracle direct path inserts and SEG$ contention</title><link>https://tanelpoder.com/2015/11/10/troubleshooting-another-complex-performance-issue-oracle-direct-path-inserts-and-seg-contention/</link><description>&lt;p&gt;Here’s an updated presentation I first delivered at Hotsos Symposium 2015.&lt;/p&gt;
&lt;p&gt;It’s about lots of concurrent PX direct path insert ant CTAS statements that, when clashing with another bug/problem, caused various &lt;strong&gt;&lt;em&gt;gc buffer busy waits&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;enq: TX – allocate ITL entry&lt;/em&gt;&lt;/strong&gt; contention. This got amplified thanks to running this concurrent workload on 4 RAC nodes:&lt;/p&gt;
 
&lt;p&gt;When reviewing these slides, I see there’s quite a lot that needs to be said in addition to what’s on slides, so this might just mean a (Powerpoint) hacking session some day!&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Wed, 11 Nov 2015 02:35:23 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2015/11/10/troubleshooting-another-complex-performance-issue-oracle-direct-path-inserts-and-seg-contention/</guid></item><item><title>Project Fi and Nexus 5X report</title><link>https://peterlyons.com/problog/2015/11/project-fi-and-nexus-5x-report/</link><description>&lt;p&gt;So after having a Google Nexus 5 smartphone for the last 2+ years, when I saw that &lt;a href="https://fi.google.com/about/"&gt;Project Fi&lt;/a&gt; had the potential to give me better coverage and a higher data limit for lower cost than T-Mobile, I decided to go for it.&lt;/p&gt;
&lt;p&gt;Here's my notes on both the Project Fi service and the &lt;a href="https://www.google.com/nexus/5x/"&gt;Google Nexus 5X&lt;/a&gt; smartphone.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project Fi
&lt;ul&gt;
&lt;li&gt;Value: great
&lt;ul&gt;
&lt;li&gt;cheap data rates and my modest usage means I have basically all the data, TXT, and voice I need for $40/month&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Coverage: better
&lt;ul&gt;
&lt;li&gt;Coming from T-Mobile I have the coverage I used to have plus access to Sprint and Wi-Fi calling so it's a no-brainer improvement on this front. Weirdly the heart of the downtown business district in my home town is a T-Mobile dead zone.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Transition: flawless&lt;/li&gt;
&lt;li&gt;All the cell number porting stuff and account stuff went smooth as butter&lt;/li&gt;
&lt;li&gt;Overall it's really good service with no long-term contract, an unlocked phone, and a low monthly bill. Really pleased with this.&lt;/li&gt;
&lt;li&gt;There are some annoying limitations of Google Apps accounts vs regular gmail accounts. I use my main Google Apps accounts for most things, but they don't work with Google Play Store or Google Voice, so I need to use an old gmail account for that, which is annoying and confusing.&lt;/li&gt;
&lt;li&gt;Having voicemail just be there without having to dial a number and use an IVR touchpad is really nice. Amazing it took so long to reach this point.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Nexus 5X
&lt;ul&gt;
&lt;li&gt;battery charges much faster and lasts much longer than Nexus 5. It will probably take me a while to adjust the chronic battery paranoia I learned using my Nexus 5 which could do ~6 hours at most.&lt;/li&gt;
&lt;li&gt;Camera is indeed better&lt;/li&gt;
&lt;li&gt;Fingerprint reader is nice&lt;/li&gt;
&lt;li&gt;Larger storage capacity is welcome
&lt;ul&gt;
&lt;li&gt;Still kind of mind-blowing that my Creative Nomad Xen mp3 player circa 2006 had double the storage of my current smartphone a decade later.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Performance is not noticeable better compared to my Nexus 5. Most things are still a bit laggy when they shouldn't be, which the exception of the Calendar app which responds instantly and caches tons of data locally, which I wish every other app would do. It's disgusting that Google Inbox does not automatically sync my most recent 1GB of email at all times. I can use Here Maps and download a detailed map of the entire state of Colorado for offline use but getting the email with my flight details from last much while offline - not so much.&lt;/li&gt;
&lt;li&gt;The USB type C charger connection is a bit of a hassle as you are extremely likely to buy the wrong thing when shopping for chargers and cables on amazon at the moment.
&lt;ul&gt;
&lt;li&gt;Let &lt;a href="http://www.amazon.com/gp/pdp/profile/A25GROL6KJV3QG/ref=cm_cr_rdp_pdp"&gt;Google Engineer Benson Leung&lt;/a&gt;'s amazon reviews be your guide.&lt;/li&gt;
&lt;li&gt;However, if you do indeed find the right thing, it's nice to see on the screen "Charging rapidly" as a confirmation.&lt;/li&gt;
&lt;li&gt;I caught the dramatic price drop of the Nexus 5 after the initial batch last time around, but this time with the 5X I didn't wait. Less than a week after my order, google dropped the price significantly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Android Marshmallow
&lt;ul&gt;
&lt;li&gt;Overall a lot better&lt;/li&gt;
&lt;li&gt;Transition was a bit annoying as google does not transfer any app settings or OS settings other than your google accounts themselves. Had to go through app by app and adjust notifications and preferences&lt;/li&gt;
&lt;li&gt;Some fixes when connecting via bluetooth to my car stereo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So without too much time/effort configuring stuff, my smartphone is now in good working order and I have everything set up how I like and don't have to futz with it. Overall within the apps themselves I'm still feeling constantly frustrated by current UI trends of stacking stuff on top of each other, animations, and moving/disappearing tap targets.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Wed, 11 Nov 2015 02:30:08 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2015/11/project-fi-and-nexus-5x-report/</guid></item><item><title>Scars are beautiful</title><link>https://stephango.com/scars</link><description>&lt;p&gt;I saw a wonderful exhibit of Ishiuchi Miyako’s photography. Her series “Scars” particularly struck me.&lt;/p&gt;

&lt;figure class="wide"&gt;
&lt;img alt="Scars by Ishiuchi Miyako" class="multiply" src="/assets/scars.png" /&gt;
&lt;figcaption&gt;"Scars" by Ishiuchi Miyako&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The images are hard to look at without wincing. The oversized prints were even more painful to witness in person. But after the initial shock washed over me, I began to appreciate the photography itself. There is beauty in these shapes.&lt;/p&gt;

&lt;p&gt;Like a path winding through a forest, I get lost in the meandering edges of these scars, the delicate unevenness of each wrinkle. As I separate myself from the pain, there is an intriguing nature to these photographs that is undeniable. I find it impossible to look at these images without questioning the fetishism of perfection ingrained in us since youth.&lt;/p&gt;

&lt;p&gt;I am fascinated by the Japanese philosophy &lt;em&gt;wabi-sabi&lt;/em&gt;. It is a worldview centered around the beauty of transience. An example is &lt;em&gt;kintsugi&lt;/em&gt;, the art of repairing broken pottery by joining the pieces together with gold lacquer. By doing so, the cracks are accentuated rather than covered up or discarded. The object becomes more valuable as it loses its “perfection”.&lt;/p&gt;

&lt;figure&gt;
&lt;img alt="Example of a kintsugi cup" class="multiply" src="/assets/kintsugi.png" /&gt;
&lt;figcaption&gt;Example of a kintsugi cup&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Cracks, like scars, tell a story. They are not only beautiful to look at, they are also lessons in survival and perseverance.&lt;/p&gt;

&lt;p&gt;There is no learning, no victory, no good story without a share of failures, scars, and the perseverance it took to overcome them. Too often we overlook that idea in our perception of beauty.&lt;/p&gt;

&lt;p&gt;Wabi-sabi does not have to be fatalistic. The appreciation of imperfection is not an invitation to let things break down and dilapidate. The opposite of fragility is not resilience. Some things become stronger or better when challenged by chaos and uncertainty.&lt;/p&gt;

&lt;p&gt;Your muscles become stronger as they heal from being torn by physical exertion. Products and systems can be designed to not only &lt;em&gt;withstand&lt;/em&gt; aging, but improve over time.&lt;/p&gt;

&lt;p&gt;I find that much anxiety can be alleviated by finding beauty in transience, imperfection, and scars. If we feel judged for our scars, we become afraid to get scarred. We follow the path that results in the least amount of &lt;a class="internal-link" href="/pain"&gt;pain&lt;/a&gt;, rather than the path that leads to the most amount of learning.&lt;/p&gt;

&lt;p&gt;Whether they are literal or figurative, do not fear the scars. Be proud to earn them. Gild them like a kintsugi tea cup.&lt;/p&gt;</description><author>Steph Ango</author><pubDate>Wed, 11 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://stephango.com/scars</guid></item><item><title>Rebound: Season 2</title><link>https://olshansky.info/tv/rebound_season_2/</link><description>Olshansky's review of Rebound: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 10 Nov 2015 15:54:42 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/rebound_season_2/</guid></item><item><title>Snaily Updates, Nov 10 - Family trees and inbreeding coefficient</title><link>https://liza.io/snaily-updates-nov-10-family-trees-and-inbreeding-coefficient/</link><description>&lt;ul&gt;
&lt;li&gt;I did some research on snail ailments. This particular page was especially useful. Though SnailLife snails are not aquatic, some of these still seem very relevant: &lt;a href="http://applesnail.net/content/various/snail_disease.php"&gt;http://applesnail.net/content/various/snail_disease.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Also did research on inbreeding in snails and complications it could cause. Apparently one commonly observed side effect is shell thinning. I then did some reading on finding the inbreeding coefficent and how to calculate it.&lt;/li&gt;
&lt;li&gt;Looked into Google Visualization API to display the family trees and started a test implementation.&lt;/li&gt;
&lt;li&gt;Started actually using Taiga.io, I&amp;rsquo;ve been wanting to try it out for a while.&lt;/li&gt;
&lt;/ul&gt;</description><author>Liza Shulyayeva</author><pubDate>Tue, 10 Nov 2015 14:06:05 GMT</pubDate><guid isPermaLink="true">https://liza.io/snaily-updates-nov-10-family-trees-and-inbreeding-coefficient/</guid></item><item><title>Snake-duino: Hey look, a side project!</title><link>https://joshuarogers.net/articles/2015-11/snakeduino/</link><description>My desk has a new ornament on it: an Arduino powered lamp. And why does that merit a blog post? Because I built it.
After combining the Rainbowduino kit with some 600-ish points of solder, I found myself ruler of a 16MHz processor, 30Kb of instruction storage, 2Kb of data storage, and 64 tricolor pixels.
And what does one do with 64 pixels, no inputs, and processing power reminiscent of a vintage entertainment console?</description><author>Joshua Rogers</author><pubDate>Tue, 10 Nov 2015 14:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2015-11/snakeduino/</guid></item><item><title>Template Method Design Pattern</title><link>https://denvaar.dev/posts/design_patterns_template_method.html</link><description>Example of the Template Method design pattern with Python.</description><author>denvaar's website</author><pubDate>Tue, 10 Nov 2015 08:40:09 GMT</pubDate><guid isPermaLink="true">https://denvaar.dev/posts/design_patterns_template_method.html</guid></item><item><title>Links - November 10, 2015</title><link>https://faingezicht.com/links/2015/11/10/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 10 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/11/10/links/</guid></item><item><title>Listening to satellites for 30 dollars</title><link>https://blog.nobugware.com/post/2015/listening_to_satellites_for_30_dollars/</link><description>I&amp;rsquo;ve ever dreamed of space &amp;amp; satellites, it turms out you can received pictures from them.
After getting my radio amateur license in the US, I&amp;rsquo;ve discovered there was some satellites dedicated to radio amateurs but also some weather satellites from the late 90s still working and capable of sending pictures from the space like this one NOOA-15.
SDR You don&amp;rsquo;t need expensive hardware anymore thanks to the SDR movement Software defined radio and some great developers, a simple 20$ USB key and some pratices are good enough to make it work.</description><author>Fabrice Aneche</author><pubDate>Tue, 10 Nov 2015 00:51:43 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2015/listening_to_satellites_for_30_dollars/</guid></item><item><title>Git aliases</title><link>https://www.danielcorin.com/posts/2015/2015-11-09-git-aliases/</link><description>Git aliases</description><author>Thought Eddies</author><pubDate>Mon, 09 Nov 2015 19:31:00 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2015/2015-11-09-git-aliases/</guid></item><item><title>Snaily Updates - Bug fixing and cleaning out old stuff</title><link>https://liza.io/snaily-updates-bug-fixing-and-cleaning-out-old-stuff/</link><description>&lt;p&gt;Snaily Updates are going to be really brief posts with some short &amp;ldquo;daily&amp;rdquo; updates on SnailLife. I haven&amp;rsquo;t updated in a while because I&amp;rsquo;ve mostly just been refactoring and bug fixing. But it&amp;rsquo;s important, and even though I&amp;rsquo;m not working on new features right now I still want to document some of my progress and what I do each day.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Mon, 09 Nov 2015 14:39:54 GMT</pubDate><guid isPermaLink="true">https://liza.io/snaily-updates-bug-fixing-and-cleaning-out-old-stuff/</guid></item><item><title>PySpark dependencies</title><link>https://www.danielcorin.com/posts/2015/2015-11-09-pyspark/</link><description>PySpark dependencies</description><author>Thought Eddies</author><pubDate>Mon, 09 Nov 2015 09:19:00 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2015/2015-11-09-pyspark/</guid></item><item><title>Racket</title><link>https://www.anardil.net/2015/racket.html</link><description>&lt;p&gt;Thoughts on the Racket language&lt;/p&gt;</description><author>Anardil</author><pubDate>Mon, 09 Nov 2015 04:25:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2015/racket.html</guid></item><item><title>Links - November 09, 2015</title><link>https://faingezicht.com/links/2015/11/09/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 09 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/11/09/links/</guid></item><item><title>How to cluster and failover (almost) anything - An intro to Pacemaker and Corosync</title><link>https://smcleod.net/2015/11/how-to-cluster-and-failover-almost-anything-an-intro-to-pacemaker-and-corosync/</link><description>&lt;h2 id="slides"&gt;Slides&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://media.githubusercontent.com/media/sammcj/smcleod_files/refs/heads/master/slides/cluster_anything.pdf"&gt;&lt;img alt="Click to Start Slides" src="https://smcleod.net//img/san/cluster_anything_screenshot.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="failover-demo"&gt;Failover Demo&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/sammcj/review/133110890/6f4900c090"&gt;&lt;img alt="Click to Start Failover Video" src="https://smcleod.net//img/san/lcmcpcmk.png" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Mon, 09 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/11/how-to-cluster-and-failover-almost-anything-an-intro-to-pacemaker-and-corosync/</guid></item><item><title>Chromebooks</title><link>https://www.anardil.net/2015/chromebooks.html</link><description>&lt;p&gt;Review of Toshiba Chromebook 2&lt;/p&gt;</description><author>Anardil</author><pubDate>Sun, 08 Nov 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2015/chromebooks.html</guid></item><item><title>The Society of Mind &amp;amp; The Emotion Machine</title><link>https://june.kim/society-of-mind-emotion-machine/</link><author>june.kim</author><pubDate>Sat, 07 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/society-of-mind-emotion-machine/</guid></item><item><title>Electronic Voting</title><link>https://blog.separateconcerns.com/2015-11-06-e-voting.html</link><description>&lt;p&gt;French politician Axelle Lemaire
&lt;a href="https://twitter.com/axellelemaire/status/662247104123904001"&gt;tweeted&lt;/a&gt;
today that, like half of French voters, she was in favor of electronic voting.
This tweet has resulted in a strong reaction among most of my techno-saavy
friends which could be summed up as “OMG no, e-voting cannot be secure,
please educate yourself”.&lt;/p&gt;
&lt;p&gt;On this topic, my views differ with the majority opinion among people in
technology, even though I support the same organizations fighting abuses
in e-voting such as
&lt;a href="https://www.eff.org/issues/e-voting"&gt;Electronic Frontier Foundation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you speak French, please read
&lt;a href="http://binaire.blog.lemonde.fr/2015/01/19/quest-ce-quun-bon-systeme-de-vote/"&gt;these&lt;/a&gt;
&lt;a href="http://binaire.blog.lemonde.fr/2015/01/29/le-vote-papier-est-il-reellement-plus-sur-que-lelectronique/"&gt;three&lt;/a&gt;
&lt;a href="http://binaire.blog.lemonde.fr/2015/03/16/les-bonnes-proprietes-dun-systeme-de-vote-electronique/"&gt;articles&lt;/a&gt;
by LORIA reasearcher Véronique Cortier. They may change your mind on e-voting
somehow. In particular, she argues that, although e-voting cannot be as secure
as physical voting, it could very well be better than absentee voting.&lt;/p&gt;
&lt;p&gt;Véronique is one of the researchers working on
&lt;a href="https://www.belenios.org"&gt;Belenios&lt;/a&gt;, which is
&lt;a href="https://github.com/glondu/belenios"&gt;Open Source&lt;/a&gt; and
&lt;a href="http://www.loria.fr/~cortier/Belenios.pdf"&gt;scientifically proven&lt;/a&gt;
e-voting software. Belenios provides privacy, verifiability and full
correctness, properties which many erroneously think cannot be satisfied
simultaneously.&lt;/p&gt;
&lt;p&gt;I am not denying that there are issues that will be hard or impossible to
solve. The two main ones, for me, are the security of client terminals and
the capacity for random citizen to trust the process. Indeed, understanding
and verifying something like Belenios requires relative proficiency in
math and computer science. I am willing to let the scientific community
do that work, but some consider this view elitist.&lt;/p&gt;
&lt;p&gt;However, I would like to see more research and experiments with e-voting.
I think that making the organization of votes easier and cheaper will allow
our political systems to evolve towards something where citizen have more
direct influence on the democratic process.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have to disclose that I know one of the authors of Belenios
(&lt;a href="http://stephane.glondu.net/"&gt;Stéphane Glondu&lt;/a&gt;) personally, which is how I
came to learn about systems like Helios and Belenios in the first place.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>Separate Concerns</author><pubDate>Sat, 07 Nov 2015 00:20:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2015-11-06-e-voting.html</guid></item><item><title>Some leaky abstractions in C++11</title><link>https://bastian.rieck.me/blog/2015/leaky_abstractions_cxx/</link><description>&lt;p&gt;Thanks to the introductory course in computer science taught by my colleague &lt;a href="http://www.iwr.uni-heidelberg.de/groups/viscomp/people/sadlo/"&gt;Filip
Sadlo&lt;/a&gt;, I am starting to reacquaint
myself more with the thought processes of beginners who learn C++ for the first time. Programming is
all about &lt;em&gt;abstraction&lt;/em&gt;. Finding out how to solve problems &lt;em&gt;generally&lt;/em&gt; and &lt;em&gt;generically&lt;/em&gt; instead of
providing a bespoke solution for a single problem. This is certainly the intention of the Standard
Template Library. As students, we all learned to use &lt;code&gt;std::sort&lt;/code&gt;, &lt;code&gt;std::transform&lt;/code&gt;, &lt;code&gt;std::for_each&lt;/code&gt;,
and so on. With the arrival of C++11, algorithms based on functors or predicates became even more
useful. Instead of having to specify a function object beforehand, I can simply use an in-line
lambda expression as the input of, say, &lt;code&gt;std::remove_copy_if&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That’s all very well, but unfortunately, the STL and C++11 is somewhat “leaky”at
times. Joel Spolsky coined the term &lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;ldquo;leaky
abstraction”&lt;/a&gt; to refer to
abstractions that, often inadvertently, break down and expose knowledge about the implementation to
the user. During my—for want of a better word—“career”, I encountered
multiple such leaks in the STL and C++. I want to discuss two interesting ones in detail here,
because they tend to confuse beginners the most.&lt;/p&gt;
&lt;h1 id="how-to-sort-a-list"&gt;How to sort a list&lt;/h1&gt;
&lt;p&gt;Having seen the horrors of &lt;code&gt;qsort()&lt;/code&gt; in the C library, you are glad that C++ offers &lt;code&gt;std::sort&lt;/code&gt;. The
following works great:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This works likewise:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You start feeling confident. Obviously, you have figured that one out. So:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But the compiler denies you this small victory. Instead of the compiled code, you get pages of error
messages. The salient points seems to be:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;In file included from /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/algorithm:62:
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algo.h:1882:18: error: invalid operands to binary expression ('std::_List_iterator&amp;lt;double&amp;gt;' and
      'std::_List_iterator&amp;lt;double&amp;gt;')
      if (__last - __first &amp;gt; int(_S_threshold))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the way of the STL to tell you that the iterators of a list do not support subtraction. They
are not random access iterators. The solution is to use the &lt;em&gt;built-in&lt;/em&gt; sorting function for lists:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This feels cheap, does it not? Vector, for example, does &lt;em&gt;not&lt;/em&gt; have this built-in function. Hence,
you need to check the container type before applying a sort function to it. But this is completely
contrary to the intention of the STL, which wants you to prefer &lt;em&gt;generic algorithms&lt;/em&gt; over &lt;em&gt;specific
implementations&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Of course, this behaviour is well-documented and can easily be justified. It’s confusing for
the beginner, nonetheless.&lt;/p&gt;
&lt;h1 id="copying-functions"&gt;Copying functions&lt;/h1&gt;
&lt;p&gt;C++11 added the great &lt;code&gt;std::function&lt;/code&gt; class, which permits us programmers to write less verbose
code. For example, I often use a construction along the following lines:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ... 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The idea is to be able to reassign &lt;code&gt;f&lt;/code&gt; later on in order to change the behaviour without writing new
code. So far, so good. But how could we make this less verbose? By using auto, of course. This
lets the compiler figure out the proper function signature:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ... 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But, woe is us! Another compiler error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;f.cc:14:5: error: no viable overloaded '='
  f = root;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What happened? Well, we were being sneaky. The syntax we used actually refers to a lambda
expression. In order to be able to create more compact and efficient code, whenever we specify it
with &lt;code&gt;auto&lt;/code&gt;, the type of the expression will be a special compiler-generated type. &lt;code&gt;std::function&lt;/code&gt;,
on the other hand, is more heavy-weight—it will typically incur some small overhead cost for
calling. So, again, the compiler behaviour is justified (as always), but it certainly makes for
some confusion of the sort “Why am I suddenly losing the ability to reassign function objects
when using &lt;code&gt;auto&lt;/code&gt;?”.&lt;/p&gt;
&lt;p&gt;These are just two examples that I recently encountered. I am sure there are tons and tons more.
I am not sure what would be better, from a pedagogical point of view:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Teaching these “leaks” along with the regular material&lt;/li&gt;
&lt;li&gt;Waiting for students to encounter them on their own and be confused.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So far, I am using the second method. I try to justify this by the assumption that students learn
more that way…&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Fri, 06 Nov 2015 21:14:04 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/leaky_abstractions_cxx/</guid></item><item><title>Internal Clojure libraries</title><link>https://honza.pokorny.ca/2015/11/internal-clojure-libraries/</link><description>&lt;p&gt;At work, we have a few Clojure services in production.  Each service is its own
leiningen project with its own dependencies.  And because setting up a local
maven repository is hard, each project reimplements quite a bit of logic.  This
duplicate code usually relates to the non-essential but still important parts
of a service: logging, metrics, sentry integration, etc.&lt;/p&gt;
&lt;p&gt;Just the other day, I was getting really annoyed with this situation, and was
about ready to go learn about the wonderful intricacies of Maven, when I
discovered leiningen&amp;rsquo;s &lt;code&gt;install&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;lein install&lt;/code&gt;, you can install your library as a jar and a pom to the
local repository.  Here, local repository means a local repository, typically
in &lt;code&gt;~/.m2&lt;/code&gt;.  Your apps can then depend on this library via the normal
&lt;code&gt;:dependencies&lt;/code&gt; list in the project file.  This is all completely seamless
and works well.&lt;/p&gt;
&lt;p&gt;Apparently, this command has been around for a long time.&lt;/p&gt;
&lt;p&gt;Armed with this new information, I was able to create an internal project
called &lt;em&gt;metrics&lt;/em&gt; and remove a ton of duplication.  &lt;code&gt;lein install&lt;/code&gt; also allows
multiple versions of the same library to be installed at once.  Simply require
whatever version you need in your apps&amp;rsquo; &lt;code&gt;project.clj&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;This makes developing Clojure projects without having to publish your libraries
to Clojars a lot easier.&lt;/p&gt;</description><author>Honza Pokorný</author><pubDate>Fri, 06 Nov 2015 12:32:00 GMT</pubDate><guid isPermaLink="true">https://honza.pokorny.ca/2015/11/internal-clojure-libraries/</guid></item><item><title>Limitations of My Own Thinking</title><link>https://josh.works/limitations-of-my-own-thinking</link><description>&lt;p&gt;I sometimes make recommendations, or at least recount a story that has “actionable insights”. Anytime this happens, I start tripping over myself with warnings and qualifying statements.&lt;/p&gt;

&lt;p&gt;Here’s what would happen:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;I would make a recommendation (“start a side project to help get a better job”).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I would immediately follow it with a paragraph of qualifying statements. (“It’s not the side project itself that gets you the job, it’s the skills that you get while pursuing it. Well, not even the skills, but the “stick-to-itiveness” that you gain. But even if you’re naturally tenacious, you have to telegraph that to a potential employer, so really the side project is a way of showing traits that you already have.  It helps you gain traits you might not have too. And helps you showcase both.” and on and on and on.)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s a rough way to write, and makes it hard to get a coherent thought down. So, now, whenever I make an assertion and want to qualify my statements, I’ll just link here. Every time I link to this page, hear my voice in your head saying:&lt;/p&gt;

&lt;p&gt;“Please be aware that I’m only human and have limited knowledge. Important differences are invisible to both of us. These differences may cause your experience to differ wildly from mine”&lt;/p&gt;

&lt;h1 id="on-the-limitation-of-my-knowledge"&gt;On the limitation of my knowledge&lt;/h1&gt;

&lt;p&gt;We’re all suspicious of people who
say but do not
do. We’re also eager to hear from people that
do, so we can learn from them and improve our own situation.&lt;/p&gt;

&lt;p&gt;We should be wary of people who have done great things and then talk about it. We (humans) are unable to recall events and discern cause-and-effect with skill or accuracy.&lt;/p&gt;

&lt;p&gt;When imparting advice, the advice giver
andthe audience face three dangers:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Modify the advice or story to make yourself look better.&lt;/strong&gt;
 This modification usually is not intentional.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Mistaking the relationship between
what happened and
what was observed.  &lt;/strong&gt;
Have you noticed that “plain facts” get interpreted in opposite ways? &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Misattribute cause and effect. &lt;/strong&gt;
“I started calling customers and changing the marketing to use the words and phrases they used, 
and our company grew 20% month over month!” Possible, but keep in mind that
&lt;a href="http://www.tylervigen.com/spurious-correlations"&gt;the number of people who drowned by falling into pools correlates with the number of films featuring Nicolas Cage. &lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even with the best of intentions, it is impossible to view oneself and the events that ones has experienced with perfect clarity. I like to think well of myself, so with enough time (or wine) I’ll revise past events to make myself look better.
 This revision is to better protect my ego, and is insideous. I do this, and chances are good that you do too. &lt;/p&gt;

&lt;p&gt;The change is subtle. Sometimes I’ll make a chance good thing seem a little more like something I chose. Or I’ll “misremember” my reaction to some bad thing as less immature and selfish than it really was. &lt;/p&gt;

&lt;p&gt;This “misremembering” isn’t the end of the world. It just taints my ability to make generalizations and recommendations to other people. I’m not going to stop making recommendations.  I am just leaving it up to you to be appropriately apprehensive and suspicious of everything that I write. &lt;/p&gt;

&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;Don’t trust most of what most people say.&lt;/p&gt;

&lt;p&gt;If you want a good starting point for trusting some people and distrusting others, I cannot recommend
&lt;a href="http://www.amazon.com/Antifragile-Things-That-Disorder-Incerto/dp/0812979680"&gt;Antifragile&lt;/a&gt; highly enough. Go read it.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Thu, 05 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/limitations-of-my-own-thinking</guid></item><item><title>Links - November 05, 2015</title><link>https://faingezicht.com/links/2015/11/05/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 05 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/11/05/links/</guid></item><item><title>Recover from an unresponsive Emacs</title><link>https://xenodium.com/recover-from-an-unresponsive-emacs</link><description>&lt;p&gt;&lt;a href="https://twitter.com/_wilfredh"&gt;Wilfred Hughes&lt;/a&gt; has a handy &lt;a href="https://twitter.com/_wilfredh/status/659499112677642242?refsrc%3Demail&amp;amp;s%3D11"&gt;tip&lt;/a&gt; to bail you out of a hung Emacs instance:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;pkill -SIGUSR2 emacs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ps. Not had a chance to try it, but next time it happens…&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 04 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/recover-from-an-unresponsive-emacs</guid></item><item><title>Links - November 04, 2015</title><link>https://faingezicht.com/links/2015/11/04/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 04 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/11/04/links/</guid></item><item><title>The Pink Startup</title><link>https://solomon.io/the-pink-startup/</link><description>Since I started working on our fantasy sports product, nothing has been both praised and contested as much as our brand color.</description><author>Sam Solomon</author><pubDate>Wed, 04 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/the-pink-startup/</guid></item><item><title>Default to empathy</title><link>https://stephango.com/empathy</link><description>&lt;p&gt;There’s a saying you may have heard called Hanlon’s razor:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Never attribute to malice what can be explained by stupidity.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The word “malice” is perfect because it says nothing about the severity of the act. It could describe anything from someone cutting you off in traffic to an accident that blows up the Earth.&lt;/p&gt;

&lt;p&gt;On the other hand, I find that “stupidity” only describes a narrow band of human behavior. The saying works just as well if you replace that word. For example:&lt;/p&gt;

&lt;p&gt;Never attribute to malice what can be explained by…&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;a rough day at the office&lt;/li&gt;
  &lt;li&gt;a family emergency&lt;/li&gt;
  &lt;li&gt;an ill-fitting pair of pants&lt;/li&gt;
  &lt;li&gt;not having coffee this morning&lt;/li&gt;
  &lt;li&gt;a recent uptick in birds pooping on that person’s car&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get the idea.&lt;/p&gt;

&lt;p&gt;Everyone has something on their mind. Something that isn’t going perfectly well in their life. A nagging issue that, however small, may affect your mood on any given day. We’ve all been &lt;em&gt;that person&lt;/em&gt; who rudely cuts into traffic because it’s-been-a-long-stressful-day-and-if-we-could-just-be-home-right-now-we-could-finally-relax. And so yes, we will cut into traffic, because today we tell ourselves that we deserve to.&lt;/p&gt;

&lt;p&gt;My secret weapon is my alter ego (well, one of my many alter egos, but we’ll get into that another day). I call him &lt;em&gt;benefit-of-the-doubtman&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When someone does something seemingly malicious to me, I try to summon &lt;em&gt;benefit-of-the-doubtman&lt;/em&gt;. Sometimes it’s hard to remember because my ego tends to bristle and roar: “Why is this happening to &lt;strong&gt;me&lt;/strong&gt;?”&lt;/p&gt;

&lt;p&gt;But &lt;em&gt;benefit-of-the-doubtman&lt;/em&gt; comes to the rescue and asks: what are the conditions that caused this person to behave that way? Usually it’s easy to come up with one or two maybes. Maybe they’re worried about losing their job. Maybe they’re upset about something happening in their personal life.&lt;/p&gt;

&lt;p&gt;There’s no room to take it personally. Instead of becoming defensive, I try to either disregard the apparent malice or resolve the causes behind it.&lt;/p&gt;

&lt;p&gt;I often catch myself marveling at the concept of streets  —  cars whizzing by each other, divided only by a thin strip of paint. Streets say a lot about the power of ego. What makes this crazy system work is that none of us want to die. At least not in a head-on collision. The inherent sense of self-preservation and self-interest that we all share makes society possible, but also causes a lot of what seems like malice.&lt;/p&gt;

&lt;p&gt;To solve the root cause of “malice”, it’s helpful to consider whether your environment is effective at converting self-interest into positive impact for the group. Maybe that environment is something you have the power to change?&lt;/p&gt;

&lt;p&gt;Whether it’s true or not, I want to believe that most people are good people. I want to live in a world where we can all make that assumption. Call me an optimist, but I think that starts with defaulting to empathy.&lt;/p&gt;</description><author>Steph Ango</author><pubDate>Wed, 04 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://stephango.com/empathy</guid></item><item><title>What Programming And Computing Represent</title><link>https://venam.net/blog/programming/2015/11/04/what-is-programming.html</link><description>Hello fellow readers,  In this post I'll discuss what programming and computing are for me.  Computers are tools. Their functions can be summed to entertainment, utility, and information. It's common to find persons loosing themselves to a tool, slave to their creation.  Programming is something useful. It's a big domain where you learn languages to instruct a machine to take actions.  Those instructions can range from outputting things (maybe screen pixels but not limited to that), taking inputs from the outside world (not necessarily a keyboard or mouse), doing calculations at very high speed, storing data, and transferring data.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Wed, 04 Nov 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/programming/2015/11/04/what-is-programming.html</guid></item><item><title>Calling Matlab from Python</title><link>https://bastibe.de/2015-11-03-matlab-engine-performance.html</link><description>&lt;p&gt;For my latest experiments, I needed to run both Python functions and Matlab functions as part of the same program. As I &lt;a href="http://bastibe.de/2015-10-29-matlab-engine-leaks.html"&gt;noted earlier&lt;/a&gt;, Matlab includes the &lt;a href="http://mathworks.com/help/matlab/matlab-engine-for-python.html"&gt;Matlab Engine for Python&lt;/a&gt; (MEfP), which can call Matlab functions from Python. Before I knew about this, I created &lt;a href="https://github.com/bastibe/transplant"&gt;Transplant&lt;/a&gt;, which does the very same thing. So, how do they compare?&lt;/p&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;As it's name suggests, Matlab is a &lt;strong&gt;mat&lt;/strong&gt;rix &lt;strong&gt;lab&lt;/strong&gt;oratory, and matrices are the most important data type in Matlab. Since matrices don't exist in plain Python, the MEfP implements it's own as &lt;code&gt;matlab.double&lt;/code&gt; et al., and you have to convert any data you want to pass to Matlab into one of those. In contrast, Transplant recognizes the fact that Python does in fact know a really good matrix engine called &lt;a href="http://scipy.org/"&gt;Numpy&lt;/a&gt;, and just uses that instead.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       Matlab Engine for Python        |              Transplant
---------------------------------------|---------------------------------------
import numpy                           | import numpy
import matlab                          | import transplant
import matlab.engine                   |
                                       |
eng = matlab.engine.start_matlab()     | eng = transplant.Matlab()
numpy_data = numpy.random.randn(100)   | numpy_data = numpy.random.randn(100)
list_data = numpy_data.tolist()        |
matlab_data = matlab.double(list_data) |
data_sum = eng.sum(matlab_data)        | data_sum = eng.sum(numpy_data)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Aside from this difference, both libraries work almost identical. Even the handling of the number of output arguments is (accidentally) almost the same:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       Matlab Engine for Python        |              Transplant
---------------------------------------|---------------------------------------
eng.max(matlab_data)                   | eng.max(numpy_data)
&amp;gt;&amp;gt;&amp;gt; 4.533                              | &amp;gt;&amp;gt;&amp;gt; [4.533 537635]
eng.max(matlab_data, nargout=1)        | eng.max(numpy_data, nargout=1)
&amp;gt;&amp;gt;&amp;gt; 4.533                              | &amp;gt;&amp;gt;&amp;gt; 4.533
eng.max(matlab_data, nargout=2)        | eng.max(numpy_data, nargout=2)
&amp;gt;&amp;gt;&amp;gt; (4.533, 537635.0)                  | &amp;gt;&amp;gt;&amp;gt; [4.533 537635]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Similarly, both libraries can interact with Matlab objects in Python, although the MEfP can't access object properties:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       Matlab Engine for Python        |              Transplant
---------------------------------------|---------------------------------------
f = eng.figure()                       | f = eng.figure()
eng.get(f, 'Position')                 | eng.get(f, 'Position')
&amp;gt;&amp;gt;&amp;gt; matlab.double([[ ... ]])           | &amp;gt;&amp;gt;&amp;gt; array([[ ... ]])
f.Position                             | f.Position
&amp;gt;&amp;gt;&amp;gt; AttributeError                     | &amp;gt;&amp;gt;&amp;gt; array([[ ... ]])
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There are a few small differences, though:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Function documentation in the MEfP is only available as &lt;code&gt;eng.help('funcname')&lt;/code&gt;. Transplant will populate a function's &lt;code&gt;__doc__&lt;/code&gt;, and thus documentation tools like IPython's &lt;code&gt;?&lt;/code&gt; operator just work.&lt;/li&gt;
&lt;li&gt;Transplant converts empty matrices to &lt;code&gt;None&lt;/code&gt;, whereas the MEfP represents them as &lt;code&gt;matlab.double([])&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Transplant represents &lt;code&gt;dict&lt;/code&gt; as &lt;code&gt;containers.Map&lt;/code&gt;, while the MEfP uses &lt;code&gt;struct&lt;/code&gt; (the former is more correct, the latter arguable more useful).&lt;/li&gt;
&lt;li&gt;If the MEfP does not know &lt;code&gt;nargout&lt;/code&gt;, it assumes &lt;code&gt;nargout=1&lt;/code&gt;. Transplant uses &lt;code&gt;nargout(func)&lt;/code&gt; or returns whatever the function writes into &lt;code&gt;ans&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The MEfP can't return non-scalar structs, such as the return value of &lt;code&gt;whos&lt;/code&gt;. Transplant can do this.&lt;/li&gt;
&lt;li&gt;The MEfP can't return anonymous functions, such as &lt;code&gt;eng.eval('@(x, y) x&amp;gt;y')&lt;/code&gt;. Transplant can do this.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Performance&lt;/h2&gt;
&lt;p&gt;The time to start a Matlab instance is shorter in MEfP (3.8 s) than in Transplant (6.1 s). But since you're doing this relatively seldomly, the difference typically doesn't matter too much.&lt;/p&gt;
&lt;p&gt;More interesting is the time it takes to call a Matlab function from Python. Have a look:&lt;/p&gt;
&lt;p&gt;&lt;img alt="execution-time" src="http://bastibe.de/static/2015-11/execution-time.png" /&gt;&lt;/p&gt;
&lt;p&gt;This is running &lt;code&gt;sum(randn(n,1))&lt;/code&gt; from Transplant, the MEfP, and in Matlab itself. As you can see, the MEfP is a constant factor of about 1000 slower than Matlab. Transplant is a constant factor of about 100 slower than Matlab, but always takes at least 0.05 s.&lt;/p&gt;
&lt;p&gt;There is a gap of about a factor of 10 between Transplant and the MEfP. In practice, this gap is highly significant! In my particular use case, I have &lt;a href="http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/doc/voicebox/fxpefac.html"&gt;a function&lt;/a&gt; that takes about one second of computation time for an audio signal of ten seconds (half a million values). When I call this function with Transplant, it takes about 1.3 seconds. With MEfP, it takes 4.5 seconds.&lt;/p&gt;
&lt;p&gt;Transplant spends its time serializing the arguments to JSON, sending that JSON over &lt;a href="http://zeromq.org/"&gt;ZeroMQ&lt;/a&gt; to Matlab, and parsing the JSON there. Well, to be honest, only the parsing part takes any significant time, overall. While it might seem onerous to serialize everything to JSON, this architecture allows Transplant to run over a network connection.&lt;/p&gt;
&lt;p&gt;It is a bit baffling to me that MEfP manages to be slower than &lt;em&gt;that&lt;/em&gt;, despite being written in C. Looking at the number of function calls in the profiler, the MEfP calls 25 functions (!) on each value (!!) of the input data. This is a shockingly inefficient way of doing things.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;It used to be very difficult to work in a mixed-language environment, particularly with one of those languages being Matlab. Nowadays, this has thankfully gotten much easier. Even Mathworks themselves have stepped up their game, and can interact with Python, C, Java, and FORTRAN. But their interface to Python does leave something to be desired, and there are better alternatives available.&lt;/p&gt;
&lt;p&gt;If you want to try Transplant, just head over to &lt;a href="https://github.com/bastibe/transplant"&gt;Github&lt;/a&gt; and use it. If you find any bugs, feature requests, or improvements, please let me know in the Github issues.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Tue, 03 Nov 2015 17:05:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2015-11-03-matlab-engine-performance.html</guid></item><item><title>List of Awesomeness #3</title><link>https://rohitjha.com/blog/list-of-awesomeness-3/</link><description>&lt;p&gt;Shifting gears a bit, I have decided to add in a few papers,books, articles that I found quite riveting last few weeks.&lt;/p&gt;&lt;h1 id="papers"&gt;Papers&lt;/h1&gt;&lt;p&gt;Starting at the beginning &amp;#x2013; with the greatest minds of our century &amp;#x2013; A. Einstein. He published &lt;strong&gt;5 papers in a single year, 1905 a.k.&lt;/strong&gt;&lt;/p&gt;</description><author>THINK@RJ</author><pubDate>Tue, 03 Nov 2015 17:00:00 GMT</pubDate><guid isPermaLink="true">https://rohitjha.com/blog/list-of-awesomeness-3/</guid></item><item><title>Links - November 03, 2015</title><link>https://faingezicht.com/links/2015/11/03/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 03 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/11/03/links/</guid></item><item><title>Prototype: A GUI-friendly Snappy</title><link>https://kyrofa.com/posts/prototype-a-gui-friendly-snappy/</link><description>So this is the week of the Ubuntu Online Summit, and many of the sessions are discussing Snappy. As you may know, Snappy is currently pretty geared toward embedded, headless devices. However, it is the successor to Click, and eventually the phones will be based upon it. To drive that effort forward, a few colleagues and I had a session (update: I used to link to the video here, but the Summit server is no more) where we discussed the path forward for supporting snaps on other devices, specifically the phone and the desktop.</description><author>kyrofa's blog</author><pubDate>Tue, 03 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/prototype-a-gui-friendly-snappy/</guid></item><item><title>Compiling QEMU with GlusterFS Support on Ubuntu 14.04</title><link>/posts/2015-11-03-qemu-glusterfs-ubuntu/</link><description>On Ubuntu 14.04 (and maybe later) Qemu does not come with GlusterFS support. To compile it, you have to fetch the sources and enable flags. You also need to get the build dependencies, and some debian package tools.
You can install the dependencies as follows:
$ sudo apt-get install build-essential glusterfs-common devscripts dpkg-dev $ sudo apt-get build-dep qemu  You also need to execute the following command, but it might be better to create a script file and execute it:</description><author>Mustafa Akın</author><pubDate>Tue, 03 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">/posts/2015-11-03-qemu-glusterfs-ubuntu/</guid></item><item><title>Explaining Go error handling</title><link>https://divan.dev/posts/go_errors/</link><description>&lt;p&gt;I recently translated great article — &lt;a href="https://blog.golang.org/errors-are-values"&gt;Errors are values&lt;/a&gt; by Rob Pike — and we discussed it in our &lt;a href="https://golangshow.com/"&gt;podcast Golangshow&lt;/a&gt; (in russian). One thing I was surprised about is that even experienced Go developers sometimes do not understand the core idea of that article.&lt;/p&gt;
&lt;p&gt;Looking back, I remember my first impressions when I read it for the first time. It was similar to &lt;em&gt;“It looks like Pike just adds some complexity to what could’ve been solved gracefully with exceptions”&lt;/em&gt;. I have never been fond of exceptions, but that’s the first thought I remember. The example in the article was clearly asking for comparison with exceptions’ way to deal with errors and it didn’t look like a winner here.&lt;/p&gt;</description><author>divan's blog</author><pubDate>Mon, 02 Nov 2015 17:36:54 GMT</pubDate><guid isPermaLink="true">https://divan.dev/posts/go_errors/</guid></item><item><title>Language choice</title><link>https://honza.pokorny.ca/2015/11/language-choice/</link><description>&lt;p&gt;&lt;em&gt;Warning: this is a rant&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Recently, I have made great progress in my journey towards Haskell
enlightenment.  I finally see how many of the little pieces of the Haskell
puzzle fit together.  At this point, I feel empowered to go forth and write
useful programs.  I &lt;a href="https://twitter.com/_honza/status/660421406698508288"&gt;read&lt;/a&gt; through the source of &lt;a href="https://github.com/scotty-web/scotty"&gt;Scotty&lt;/a&gt; the web framework
the other day, and I was very pleasantly surprised that I understood how it
works.  I absolutely &lt;em&gt;love&lt;/em&gt; Haskell.  I love that it makes you think.  One does
not simply open a text editor and start banging at the keyboard to write a
Haskell program.  I love that Haskell encourages generalizations and
abstractions.  One of the biggest heureka moments in my journey was
understanding the full implications of why a function of type &lt;code&gt;a -&amp;gt; a&lt;/code&gt; has a
single implementation.  I&amp;rsquo;m addicted to running my program for the first time
(after fighting with the compiler for ages), and having it work.  I think monad
transformers and lenses are really clever.  By many criteria, Haskell is the
perfect programming language.&lt;/p&gt;
&lt;p&gt;It has taken me four years to get here.&lt;/p&gt;
&lt;p&gt;I used to get so discouraged that I took breaks for weeks or months at a time
because I didn&amp;rsquo;t see the point of continuing.  But I always came back. Now I
have finally arrived.  I would say I&amp;rsquo;m an intermediate Haskeller.  Naturally,
I&amp;rsquo;m thinking about writing some Haskell code at work which is going to be easy
given our service-oriented architecture.&lt;/p&gt;
&lt;p&gt;I have also been playing with &lt;a href="http://www.purescript.org/"&gt;Purescript&lt;/a&gt; which is a Haskell dialect that
compiles to javascript.  In many ways, Purescript is a much better Haskell
because it doesn&amp;rsquo;t come with the historical baggage.  In speaking with my
colleague who doesn&amp;rsquo;t know Purescript about introducing it into our code base,
I realized the gravity of what I was asking him to learn.  It sounds great to
say &amp;ldquo;let&amp;rsquo;s rewrite this in purescript&amp;rdquo; and expect someone to come back from
their weekend having learned enough to be dangerous when it took me four years
to learn.&lt;/p&gt;
&lt;p&gt;Another great example is the open source community.  If you choose Haskell for
your open source project, you might be productive, safe to refactor, write
little code &amp;mdash; but how many people will be willing to learn Haskell to
contribute a fix or a new feature?&lt;/p&gt;
&lt;p&gt;Many of my Haskell friends like to mock the &lt;a href="https://golang.org/"&gt;Go&lt;/a&gt; programming language.  Myself
included at times.  Mind you, the language is &lt;em&gt;objectively&lt;/em&gt; poorly designed.
The error handling, the lack of generics, the ridiculous package manager, the
absurd type system, the &lt;code&gt;range&lt;/code&gt; thing, etc.  It&amp;rsquo;s almost exactly the opposite
of Haskell.&lt;/p&gt;
&lt;p&gt;And yet, Go is a lot &lt;a href="http://adambard.com/blog/top-github-languages-2014/"&gt;more popular&lt;/a&gt; than Haskell according to GitHub.  Yet,
there are so many amazing projects written in Go, like Docker, Influxdb, etcd,
consul, prometheus, packer, and many more.  Unlike Haskell, if you ask your
coworkers to learn Go over the weekend, everyone will come back with a little
app they built.  A clearly inferior tool is used by crowds of people to build
cool things.&lt;/p&gt;
&lt;p&gt;What should we conclude from this?  The choice of programming language matters.
Programming is a social activity.  Fewer features seems to equal easier to
learn.  Generalization and programming language innovation seem to be out of
favor.  Creating software to solve real problems with blunt tools seems to be a
lot more important than using a sharp axe.  We&amp;rsquo;d much rather use an inferior
tool whose manual we don&amp;rsquo;t have to read.  We&amp;rsquo;d much rather snap a picture
with our smartphone than to learn how to use a DSLR.&lt;/p&gt;</description><author>Honza Pokorný</author><pubDate>Mon, 02 Nov 2015 17:25:00 GMT</pubDate><guid isPermaLink="true">https://honza.pokorny.ca/2015/11/language-choice/</guid></item><item><title>Setting up an sbt-based project for Scala 2.11 with ScalaTest support</title><link>https://manuel.kiessling.net/2015/11/02/setting-up-an-sbt-based-project-for-scala-2-11-with-scalatest-support/</link><description>This post describes how to set up a new Scala 2.11.7 project with ScalaTest 2.2.4 support using sbt 0.13.9 on Mac OS X 10.11 “El Capitan” with Java 1.8.  If set up as describes below, you can manage your project via sbt, and you will be able to run your test cases via sbt test. Also, after setting things up this way, the project can be opened and used in IntelliJ IDEA 14 as an sbt project.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Mon, 02 Nov 2015 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2015/11/02/setting-up-an-sbt-based-project-for-scala-2-11-with-scalatest-support/</guid></item><item><title>Links - November 02, 2015</title><link>https://faingezicht.com/links/2015/11/02/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 02 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/11/02/links/</guid></item><item><title>Margin of Safety: Risk-Averse Value Investing Strategies for the Thoughtful Investor</title><link>https://olshansky.info/book/margin_of_safety/</link><description>Olshansky's review of Margin of Safety: Risk-Averse Value Investing Strategies for the Thoughtful Investor by Seth A. Klarman</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 02 Nov 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/margin_of_safety/</guid></item><item><title>Amounts 2, In Review</title><link>https://swiftfox.co/2015/11/amounts-2-in-review/</link><description>&lt;p&gt;After nearly two years in (Part time) development, Amounts 2 has finally been sent off to Apple for review. This will be a free update to all users, and I think everyone will love it. The UI has been overhauled to support the new screen sizes, icons have been updated, and now the app supports...  &lt;a class="excerpt-read-more" href="https://swiftfox.co/2015/11/amounts-2-in-review/" title="ReadAmounts 2, In Review"&gt;Read more &amp;#187;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a href="https://swiftfox.co/2015/11/amounts-2-in-review/"&gt;Amounts 2, In Review&lt;/a&gt; first appeared on &lt;a href="https://swiftfox.co"&gt;Swift Fox Software LLC&lt;/a&gt;.&lt;/p&gt;</description><author>Swift Fox Software LLC</author><pubDate>Sun, 01 Nov 2015 15:28:07 GMT</pubDate><guid isPermaLink="true">https://swiftfox.co/2015/11/amounts-2-in-review/</guid></item><item><title>Sunlight</title><link>https://www.anardil.net/2015/sunlight.html</link><description>&lt;p&gt;Short poem&lt;/p&gt;</description><author>Anardil</author><pubDate>Sun, 01 Nov 2015 09:00:00 GMT</pubDate><guid isPermaLink="true">https://www.anardil.net/2015/sunlight.html</guid></item><item><title>I couldn’t agree more.</title><link>https://olshansky.info/posts/2015-10-31-i-couldnt-agree-more/</link><description>Having grown up in a reform Jewish household, I always enjoyed the holidays and just having a reason to get together as a community and…</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 01 Nov 2015 03:47:57 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/posts/2015-10-31-i-couldnt-agree-more/</guid></item><item><title>Tiny Keep (#blogtober 31)</title><link>https://rjp.is/blogging/posts/tiny-keep-blogtober-31-2/</link><description>THE END.
Tiny Keep has the distinction of being the last. But sadly not the best.
This is actual a fair reflection of me this evening.
They&amp;rsquo;ve bizarrely decided to use normal* console controls - left stick does movement, right stick controls the camera. This makes it nigh-on impossible to control reliably, especially when you get to combat later.
Managed to set myself and a bunch of enemies on fire. Oops.</description><author>infrequent oscillations</author><pubDate>Sun, 01 Nov 2015 01:08:55 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/tiny-keep-blogtober-31-2/</guid></item><item><title>Inglourious Basterds</title><link>https://olshansky.info/movie/inglourious_basterds/</link><description>Olshansky's review of Inglourious Basterds</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 31 Oct 2015 17:26:16 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/inglourious_basterds/</guid></item><item><title>Ten days in Spain - Madrid &amp;amp; Seville</title><link>https://www.planetjones.net/blog/31-10-2015/ten-days-in-spain-madrid-and-seville.html</link><description>With ten days to enjoy Spain we eventually succeeded in buying a Renfe Spain pass and made our way to Madrid and Seville.</description><author>Jonathan Jones homepage: planetjones.net</author><pubDate>Sat, 31 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.planetjones.net/blog/31-10-2015/ten-days-in-spain-madrid-and-seville.html</guid></item><item><title>No Brakes Valet (#blogtober 30)</title><link>https://rjp.is/blogging/posts/no-brakes-valet-blogtober-30-2/</link><description>Despite the name, you do have brakes. I didn&amp;rsquo;t realise this for quite a few games&amp;hellip;
Easy enough - park the cars in the parking bays.
Er, yeah.
Don&amp;rsquo;t ram the explosives truck with another vehicle, btw.
I cannot even.</description><author>infrequent oscillations</author><pubDate>Sat, 31 Oct 2015 01:55:00 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/no-brakes-valet-blogtober-30-2/</guid></item><item><title>Pixels</title><link>https://olshansky.info/movie/pixels/</link><description>Olshansky's review of Pixels</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 30 Oct 2015 20:16:46 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/pixels/</guid></item><item><title>My Livecoding.tv account deletion saga</title><link>https://liza.io/my-livecoding-dot-tv-account-deletion-saga/</link><description>&lt;p&gt;&lt;strong&gt;Update 3, Nov 2 2015 (PM):&lt;/strong&gt; Well, it&amp;rsquo;s been&amp;hellip;strange. First, it seems my account was finally deleted by Livecoding.tv (thank you!) After being up all night with libel posted all over it, hours after Jamie Green (the other Livecoding co-founder) and Sam Altman (Y Combinator president) replied to the &lt;a target="_blank"&gt;Hacker News thread&lt;/a&gt; claiming they were trying to do something, something finally happened. I have heard nothing from either of them since their original comments and am not sure exactly what spurred the removal of slander from the profile and its eventual deletion. I know some other Livecoding users quit and had a discussion with the CEO in live chat also.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Fri, 30 Oct 2015 19:23:49 GMT</pubDate><guid isPermaLink="true">https://liza.io/my-livecoding-dot-tv-account-deletion-saga/</guid></item><item><title>The Fountain</title><link>https://olshansky.info/movie/the_fountain/</link><description>Olshansky's review of The Fountain</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 30 Oct 2015 09:58:26 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_fountain/</guid></item><item><title>searchcode local</title><link>https://boyter.org/2015/10/searchcode-local/</link><description>&lt;p&gt;I am going to copy the searchcode pitch itself below quickly before explaining it a bit further.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;searchcode offers powerful code search over billions of lines of open source code. Imagine what it could do with your private repositories.&lt;/p&gt;
&lt;p&gt;There have been requests to offer a downloadable version of searchcode. Given enough interest a downloadable hostable version of searchcode will be offered. Register your email below to register your interest.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 30 Oct 2015 09:56:37 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/10/searchcode-local/</guid></item><item><title>Upgrade your job</title><link>https://josh.works/jobs/2015/10/30/upgrade-your-job/</link><description>&lt;p&gt;So, apparently I send a lot of email about people trying to get cool jobs. Here’s yet 
another email I sent to a friend, recorded here. &lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Hi [redacted],&lt;/p&gt;

&lt;p&gt;First I want to highlight is that flexible/remote jobs are 
just like normal jobs, but more people want them, so the companies can be 
highly selective in their hiring.&lt;/p&gt;

&lt;p&gt;So, it is quite possible that your 
next job will be (and should be) a “normal” 9-5, where you’re in the same office as everyone else. &lt;/p&gt;

&lt;p&gt;This company may not be particularly progressive or innovative (however you’d define those) but it could be a perfect playground to build your own personal portfolio of incredible work. You could spend a year at a company, do great things, and then take those things to 
another company that allows all the travel and flexible work.&lt;/p&gt;

&lt;p&gt;A really good book (
&lt;a href="http://calnewport.com/books/so-good/"&gt;So Good They Can’t Ignore You&lt;/a&gt;, I recommend reading this ASAP) explains this as “career capital”. You have to gain career capital to “turn it in” for a good job. Most people want a good job, but most people don’t have any career capital.&lt;/p&gt;

&lt;p&gt;At your next job, whatever it is, you should relentlessly pursue this career capital. You’ll then be in a position to do exactly what you want to do next.&lt;/p&gt;

&lt;p&gt;I forgot to tell you the most significant part of what I learned when trying to pick up a kick-ass job.&lt;/p&gt;

&lt;p&gt;It all started clicking when I stumbled across a guy named Ramit Sethi. &lt;/p&gt;

&lt;p&gt;Far and away, he’s the most influential person on me and the work that I do. Everything that I say that companies like I’ve basically lifted from him. &lt;/p&gt;

&lt;p&gt;He talks about many things, but the relevant bits that I started with were “Natural Networking” and “Interviewing”&lt;/p&gt;

&lt;p&gt;Here’s a long list of links. I’d set aside 30 mins and look over stuff, then dig deeper into what he has to say. Seriously. Everything is gold. Your “this guy is scammy” radar should be going off because of the URL and titles he uses, but read/watch. &lt;/p&gt;

&lt;h3 id="natural-networking"&gt;Natural networking: &lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.iwillteachyoutoberich.com/blog/video-how-to-use-natural-networking-to-connect-with-people/"&gt;http://www.iwillteachyoutoberich.com/blog/video-how-to-use-natural-networking-to-connect-with-people/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.iwillteachyoutoberich.com/blog/ramits-definitive-guide-to-building-your-network-with-scripts/"&gt;http://www.iwillteachyoutoberich.com/blog/ramits-definitive-guide-to-building-your-network-with-scripts/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.iwillteachyoutoberich.com/blog/2-common-traps-to-avoid-when-choosing-a-career/"&gt;http://www.iwillteachyoutoberich.com/blog/2-common-traps-to-avoid-when-choosing-a-career/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.iwillteachyoutoberich.com/blog/interview-tips-art-of-storytelling/"&gt;http://www.iwillteachyoutoberich.com/blog/interview-tips-art-of-storytelling/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.iwillteachyoutoberich.com/blog/best-of-iwt-word-for-word-scripts/"&gt;http://www.iwillteachyoutoberich.com/blog/best-of-iwt-word-for-word-scripts/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Yb03mTqI2Io"&gt;https://www.youtube.com/watch?v=Yb03mTqI2Io&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="interviewing"&gt;Interviewing: &lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.iwillteachyoutoberich.com/blog/3-tips-to-dominate-your-job-interview-and-give-the-perfect-answers/"&gt;http://www.iwillteachyoutoberich.com/blog/3-tips-to-dominate-your-job-interview-and-give-the-perfect-answers/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="http://www.iwillteachyoutoberich.com/blog/how-to-stand-out-and-get-hired-video/"&gt;http://www.iwillteachyoutoberich.com/blog/how-to-stand-out-and-get-hired-video/&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=taOo0Rexo8s"&gt;https://www.youtube.com/watch?v=taOo0Rexo8s&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you could do only one thing, I’d dig deep into the “natural networking” side of stuff, and study how he uses/recommends “scripts” and having some go-to and practiced concise stories. &lt;/p&gt;

&lt;p&gt;-Josh&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Fri, 30 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/jobs/2015/10/30/upgrade-your-job/</guid></item><item><title>Constraint solver</title><link>https://mattkeeter.com/projects/constraints</link><description>Gradient descent in Haskell</description><author>Matt Keeter</author><pubDate>Fri, 30 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/projects/constraints</guid></item><item><title>A JavaScript Modules Manager That Fits in a Tweet</title><link>https://bfontaine.net/2015/10/29/a-javascript-modules-manager-that-fits-in-a-tweet/</link><description>&lt;p&gt;ES6 does provide &lt;a href="http://es6-features.org/#ValueExportImport"&gt;modules&lt;/a&gt;; but unless you’re using &lt;a href="https://babeljs.io/"&gt;Babel&lt;/a&gt;
you’ll have to rely on third-party libraries such as &lt;a href="http://requirejs.org/"&gt;RequireJS&lt;/a&gt; until all
major browsers support them.&lt;/p&gt;

&lt;p&gt;I use &lt;a href="http://d3js.org/"&gt;D3&lt;/a&gt; everyday to visualize data about ego networks and
have a small (400-500 SLOC) JavaScript codebase I need to keep organized.
In the context I work in I must keep things simple as I won’t always be there
to maintain the code I’m writing today.&lt;/p&gt;

&lt;p&gt;How simple a modules implementation could possibly be? It should at least be
able to register modules and require a module inside another; much like
Python’s &lt;code class="language-plaintext highlighter-rouge"&gt;import&lt;/code&gt;. It should also handle issues like circular dependencies
(e.g. &lt;code class="language-plaintext highlighter-rouge"&gt;foo&lt;/code&gt; requires &lt;code class="language-plaintext highlighter-rouge"&gt;bar&lt;/code&gt; which requires &lt;code class="language-plaintext highlighter-rouge"&gt;foo&lt;/code&gt;) and undeclared modules.
Modules should be lazily loaded, i.e. only when they are required; and
requiring twice the same module shouldn’t execute it twice.&lt;/p&gt;

&lt;p&gt;Well, here is one:&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:{},&lt;/span&gt;&lt;span class="na"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:{},&lt;/span&gt;&lt;span class="na"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="na"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]){&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;|!&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="k"&gt;throw&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]}};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It’s 136-bytes long. 139 if you count the variable definition. At this level
you can’t expect long function names but here is an usage example:&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="c1"&gt;// register a "main" module. A module consists of a name and a&lt;/span&gt;
&lt;span class="c1"&gt;// function that takes an object used to require other modules.&lt;/span&gt;
&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;main&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// get the "num" module and store it in a `num` variable&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;num&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// use it to print something&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// register a "num" module&lt;/span&gt;
&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;num&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// a module can export bindings by returning an object&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// call the "main" module&lt;/span&gt;
&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;main&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This code will print &lt;code class="language-plaintext highlighter-rouge"&gt;42&lt;/code&gt; in the console. It only uses two modules but the
implementation works with an arbitrary number of modules. A module can depend
on any number of other modules that can be declared in an arbitrary order.&lt;/p&gt;

&lt;p&gt;Consider this example:&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;m1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;m2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;m2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;m3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;m3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;m1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;m1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;m1&lt;/code&gt; depends on &lt;code class="language-plaintext highlighter-rouge"&gt;m2&lt;/code&gt; which depends on &lt;code class="language-plaintext highlighter-rouge"&gt;m3&lt;/code&gt; which itself depends on &lt;code class="language-plaintext highlighter-rouge"&gt;m1&lt;/code&gt;. The
implementation won’t die in an endless loop leading to a stack overflow but
will fail as soon as it detects the loop:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;p:m1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Admittedly this error message doesn’t give us too information but we have to be
thrifty in order to fit under 140 characters. The prefix &lt;code class="language-plaintext highlighter-rouge"&gt;p:&lt;/code&gt; tells you the
error comes from &lt;code class="language-plaintext highlighter-rouge"&gt;p&lt;/code&gt;, and the part after is the faulty module. It can either be
a wrong name (the module doesn’t exist) or a circular dependency.&lt;/p&gt;

&lt;h2 id="walk-through"&gt;Walk-through&lt;/h2&gt;

&lt;p&gt;Note: don’t use this at home. This is just an experiment; I eventually used
&lt;a href="http://browserify.org"&gt;Browserify&lt;/a&gt; for my project.&lt;/p&gt;

&lt;p&gt;We need an object to map modules to their functions; we’ll populate it on calls
to &lt;code class="language-plaintext highlighter-rouge"&gt;register&lt;/code&gt;. We need another object to store the result of their function
call; i.e. what they export. I added a third object to “lock” a module while
it’s executed in order to detect circular dependencies.&lt;/p&gt;

&lt;p&gt;We’ll have something like that:&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;_fn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;   &lt;span class="c1"&gt;// the functions&lt;/span&gt;
    &lt;span class="na"&gt;_m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;    &lt;span class="c1"&gt;// the modules’ exported values&lt;/span&gt;
    &lt;span class="na"&gt;_lock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="c1"&gt;// the locks&lt;/span&gt;

    &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// add the function in the object&lt;/span&gt;
        &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_fn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// if we have a value for this module let’s return it.&lt;/span&gt;
        &lt;span class="c1"&gt;// Note that we should use `.hasOwnProperty` here&lt;/span&gt;
        &lt;span class="c1"&gt;// because this’ll fail if the module returns a falsy&lt;/span&gt;
        &lt;span class="c1"&gt;// value. This is not really important for this problem.&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// if it’s locked that’s because we’re already getting&lt;/span&gt;
        &lt;span class="c1"&gt;// it; so there’s a recursive requirement&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_lock&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Recursive requirement: '&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// if we don’t have any function for this we can’t&lt;/span&gt;
        &lt;span class="c1"&gt;// execute it and get its value. See also the&lt;/span&gt;
        &lt;span class="c1"&gt;// remark about `.hasOwnProperty` above.&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_fn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unknown module '&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;'&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// we lock the module so we can detect circular&lt;/span&gt;
        &lt;span class="c1"&gt;// requirements.&lt;/span&gt;
        &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_lock&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// execute the module's function and pass&lt;/span&gt;
            &lt;span class="c1"&gt;// ourselves to it so it can require other&lt;/span&gt;
            &lt;span class="c1"&gt;// modules with p.get.&lt;/span&gt;
            &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_fn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// ensure we *always* remove the lock.&lt;/span&gt;
            &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_lock&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// return the result&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This works and is pretty short; but that won’t fit in a Tweet ;)&lt;/p&gt;

&lt;p&gt;Let’s compact the exceptions into one because those strings take a lot of
place:&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_lock&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_fn&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Module error: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The error is less explicit but we’ll accept that here.&lt;/p&gt;

&lt;p&gt;We try to get as little code as possible then use &lt;a href="https://yui.github.io/yuicompressor/"&gt;YUI Compressor&lt;/a&gt; to
remove the spaces and rename the variables. This means we can still work with
(mostly) readable code and let YUI Compressor do the rest for us.&lt;/p&gt;

&lt;p&gt;I measure the final code size with the following command:&lt;/p&gt;

&lt;div class="language-sh highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;yuicompressor p.js | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Right now we have 240 bytes. We need a way to remove 100 bytes. Let’s rename
the attributes. &lt;code class="language-plaintext highlighter-rouge"&gt;_fn&lt;/code&gt; becomes &lt;code class="language-plaintext highlighter-rouge"&gt;f&lt;/code&gt;; &lt;code class="language-plaintext highlighter-rouge"&gt;_m&lt;/code&gt; becomes &lt;code class="language-plaintext highlighter-rouge"&gt;m&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;_lock&lt;/code&gt; becomes &lt;code class="language-plaintext highlighter-rouge"&gt;l&lt;/code&gt; and
the public methods are reduced to their first letter. We can also remove the
&lt;code class="language-plaintext highlighter-rouge"&gt;var&lt;/code&gt; since &lt;code class="language-plaintext highlighter-rouge"&gt;p&lt;/code&gt; will be global anyway. Let’s also reduce the error message
prefix to &lt;code class="language-plaintext highlighter-rouge"&gt;"p:"&lt;/code&gt;.&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="na"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="na"&gt;l&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;

    &lt;span class="na"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="na"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That’s 186 bytes once compressed. Not bad! Note that we have twice the same
line in the &lt;code class="language-plaintext highlighter-rouge"&gt;g&lt;/code&gt; function (previously known as “&lt;code class="language-plaintext highlighter-rouge"&gt;get&lt;/code&gt;”):&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can invert the first &lt;code class="language-plaintext highlighter-rouge"&gt;if&lt;/code&gt; condition and fit the whole code in it;
combining both &lt;code class="language-plaintext highlighter-rouge"&gt;return&lt;/code&gt;s into one. This is equivalent to transforming this
code:&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Into this one:&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The first form is preferable because it removes one indentation level for the
function body. But here &lt;code class="language-plaintext highlighter-rouge"&gt;return&lt;/code&gt; is a keyword we can’t compress.&lt;/p&gt;

&lt;p&gt;Speaking of keyword we can’t compress; how could we remove the &lt;code class="language-plaintext highlighter-rouge"&gt;delete&lt;/code&gt;? All we
care about is to know if there’s a lock or not, so we can set the value to
&lt;code class="language-plaintext highlighter-rouge"&gt;false&lt;/code&gt; instead, at the expense of more memory. This saves us only one byte but
since we only care about the &lt;em&gt;boolean&lt;/em&gt; values we can replace &lt;code class="language-plaintext highlighter-rouge"&gt;true&lt;/code&gt; with &lt;code class="language-plaintext highlighter-rouge"&gt;1&lt;/code&gt;
and &lt;code class="language-plaintext highlighter-rouge"&gt;false&lt;/code&gt; with &lt;code class="language-plaintext highlighter-rouge"&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We’re now at 166 bytes and the &lt;code class="language-plaintext highlighter-rouge"&gt;g&lt;/code&gt; function looks like this:&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, what if we tried to remove one of the three objects we’re using? We need
to keep the functions and the results in separate objects but we might be able
to remove the locks object without losing the functionality.&lt;/p&gt;

&lt;p&gt;Assuming that modules only return objects let’s merge &lt;code class="language-plaintext highlighter-rouge"&gt;m&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;l&lt;/code&gt;. We’ll set
&lt;code class="language-plaintext highlighter-rouge"&gt;p.m[A]&lt;/code&gt; to &lt;code class="language-plaintext highlighter-rouge"&gt;0&lt;/code&gt; if it’s locked and will then override the lock with the result.
&lt;code class="language-plaintext highlighter-rouge"&gt;p.m[A]&lt;/code&gt; then have the following possible values:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;undefined&lt;/code&gt;: the key doesn’t exist; the module hasn’t been required yet&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;0&lt;/code&gt;: the module is currently being executed&lt;/li&gt;
  &lt;li&gt;something else: the module has already been executed; we have its return
value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We need to modify our code a little bit for this:&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that this allowed us to get ride of the &lt;code class="language-plaintext highlighter-rouge"&gt;try&lt;/code&gt;/&lt;code class="language-plaintext highlighter-rouge"&gt;finally&lt;/code&gt; which let us go
down to 143 bytes. We can already save two bytes by using &lt;code class="language-plaintext highlighter-rouge"&gt;&amp;lt; 1&lt;/code&gt; instead of
&lt;code class="language-plaintext highlighter-rouge"&gt;=== 0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Replacing &lt;code class="language-plaintext highlighter-rouge"&gt;||&lt;/code&gt; (boolean &lt;code class="language-plaintext highlighter-rouge"&gt;OR&lt;/code&gt;) with &lt;code class="language-plaintext highlighter-rouge"&gt;|&lt;/code&gt; (binary &lt;code class="language-plaintext highlighter-rouge"&gt;OR&lt;/code&gt;) saves one more byte and
allows us to fit in 140 bytes! We can go further and remove the brackets for
the inner &lt;code class="language-plaintext highlighter-rouge"&gt;if&lt;/code&gt; since it only has one instruction. We need to do that after the
compression because YUI Compressor adds brackets if they’re missing.&lt;/p&gt;

&lt;p&gt;The final code looks like this:&lt;/p&gt;

&lt;div class="language-js highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="na"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;

    &lt;span class="na"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="na"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That’s 139 bytes once compressed! You can see the result at the top of this
blog post.  &lt;br /&gt;
Please add a comment below if you think of any way to reduce this
further while preserving all existing features.&lt;/p&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;</description><author>Baptiste Fontaine’s Blog</author><pubDate>Fri, 30 Oct 2015 00:58:00 GMT</pubDate><guid isPermaLink="true">https://bfontaine.net/2015/10/29/a-javascript-modules-manager-that-fits-in-a-tweet/</guid></item><item><title>Hatoful Boyfriend (#blogtober 29)</title><link>https://rjp.is/blogging/posts/hatoful-boyfriend-blogtober-29-2/</link><description>I&amp;rsquo;m a girl. At a school for pigeons.
My best friend is a rock dove.
Here&amp;rsquo;s my teacher. He&amp;rsquo;s a quail. OBVIOUSLY.
Apparently I live in a cave.
This might be a side plot about pudding. Or it might be just another thing which is making my brain bleed out.
Oh ho ho, REFERENCES.
&amp;ldquo;RAGE VOLTAGE&amp;rdquo; is an excellent metaphor but everyone knows that it&amp;rsquo;s really Amps that do the damage.</description><author>infrequent oscillations</author><pubDate>Thu, 29 Oct 2015 22:44:47 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/hatoful-boyfriend-blogtober-29-2/</guid></item><item><title>SQL Monitoring in Oracle Database 12c</title><link>https://tanelpoder.com/2015/10/29/sql-monitoring-in-oracle-database-12c/</link><description>&lt;p&gt;Here’s my latest OOW presentation – &lt;strong&gt;SQL Monitoring in Oracle Database 12c&lt;/strong&gt;:&lt;/p&gt;
 
&lt;p&gt;&lt;a href="http://www.slideshare.net/tanelp/sql-monitoring-in-oracle-database-12c" target="_blank"&gt;[direct link]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can download all my scripts from &lt;a href="https://tanelpoder.com/files/" target="_blank"&gt;/files/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Thu, 29 Oct 2015 20:53:08 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2015/10/29/sql-monitoring-in-oracle-database-12c/</guid></item><item><title>Massive Memory Leak in the Matlab Engine for Python</title><link>https://bastibe.de/2015-10-29-matlab-engine-leaks.html</link><description>&lt;p&gt;As of Matlab 2014b, Matlab includes a &lt;a href="http://mathworks.com/help/matlab/matlab-engine-for-python.html"&gt;Python module&lt;/a&gt; for calling Matlab code from Python. This is how you use it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matlab&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matlab.engine&lt;/span&gt;

&lt;span class="n"&gt;eng&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;matlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_matlab&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;random_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# convert Numpy data to Matlab:&lt;/span&gt;
&lt;span class="n"&gt;matlab_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;matlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;data_sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eng&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matlab_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can call any Matlab function on &lt;code&gt;eng&lt;/code&gt;, and you can access any Matlab workspace variable in &lt;code&gt;eng.workspace&lt;/code&gt;. As you can see, the Matlab Engine is not Numpy-aware, and you have to convert all your Numpy data to Matlab &lt;code&gt;double&lt;/code&gt; before you can call Matlab functions with it. Still, it works pretty well.&lt;/p&gt;
&lt;p&gt;Recently, I ran a rather large experiment set, where I had a set of four functions, two in Matlab, two in Python, and called each of these functions a few thousand times with a bunch of different data to see how they performed.&lt;/p&gt;
&lt;p&gt;While doing that I noticed that my Python processes were growing larger and larger, until they consumed all my memory and a sizeable chunk of my swap as well. I couldn't find any reason for this. None of my Python code cached anything, and the sum total of all global variables did not amount to anything substantial.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="http://pythonhosted.org/Pympler/index.html"&gt;Pympler&lt;/a&gt;, a memory analyzer for Python. Pympler is an amazing library for introspecting your program's memory. Among its many features, it can list the biggest objects in your running program:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pympler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;muppy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;muppy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_objects&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;                                      types |   # objects |   total size
=========================================== | =========== | ============
                        &amp;lt;class 'array.array |        1076 |      2.77 GB
                                &amp;lt;class 'str |       42839 |      7.65 MB
                               &amp;lt;class 'dict |        8604 |      5.43 MB
                      &amp;lt;class 'numpy.ndarray |          48 |      3.16 MB
                               &amp;lt;class 'code |       14113 |      1.94 MB
                               &amp;lt;class 'type |        1557 |      1.62 MB
                               &amp;lt;class 'list |        3158 |      1.38 MB
                                &amp;lt;class 'set |        1265 |    529.72 KB
                              &amp;lt;class 'tuple |        5129 |    336.98 KB
                              &amp;lt;class 'bytes |        2413 |    219.48 KB
                            &amp;lt;class 'weakref |        2654 |    207.34 KB
            &amp;lt;class 'collections.OrderedDict |          65 |    149.85 KB
                 &amp;lt;class 'wrapper_descriptor |        1676 |    130.94 KB
  &amp;lt;class 'traitlets.traitlets.MetaHasTraits |         107 |    123.55 KB
                  &amp;lt;class 'getset_descriptor |        1738 |    122.20 KB
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now that is interesting. Apparently, I was lugging around close to three gigabytes worth of bare-Python &lt;code&gt;array.array&lt;/code&gt;. And these are clearly not Numpy arrays, since those would show up as &lt;code&gt;numpy.ndarray&lt;/code&gt;. But I couldn't find any of these objects in my workspace.&lt;/p&gt;
&lt;p&gt;So let's get a reference to one of these objects, and see who they belong to. This can also be done with Pympler, but I prefer the way &lt;a href="http://mg.pov.lt/objgraph/"&gt;objgraph&lt;/a&gt; does it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;array&lt;/span&gt;
&lt;span class="c1"&gt;# get a list of all objects known to Python:&lt;/span&gt;
&lt;span class="n"&gt;all_objects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;muppy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_objects&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# sort out only `array.array` instances:&lt;/span&gt;
&lt;span class="n"&gt;all_arrays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;all_objects&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;objgraph&lt;/span&gt;
&lt;span class="n"&gt;objgraph&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show_backrefs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_arrays&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'array.png'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt="array" src="http://bastibe.de/static/2015-10/array.png" /&gt;&lt;/p&gt;
&lt;p&gt;It seems that the &lt;code&gt;array.array&lt;/code&gt; object is part of a &lt;code&gt;matlab.double&lt;/code&gt; instance which is not referenced from anywhere but &lt;code&gt;all_objects&lt;/code&gt;. A memory leak.&lt;/p&gt;
&lt;p&gt;After a bit of experimentation, I found the culprit. To illustrate, here's an example: The function &lt;code&gt;leak&lt;/code&gt; passes some data to Matlab, and calculates a float. Since the variables are not used outside of &lt;code&gt;leak&lt;/code&gt;, and the function does not return anything, all variables within the function should get deallocated when &lt;code&gt;leak&lt;/code&gt; returns.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;leak&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;test_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;matlab_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;matlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;eng&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matlab_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pympler has another great feature that can track allocations. The &lt;code&gt;SummaryTracker&lt;/code&gt; will track and display any allocations between calls to &lt;code&gt;print_diff()&lt;/code&gt;. This is very useful to see how much memory was used during the call to &lt;code&gt;leak&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pympler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tracker&lt;/span&gt;
&lt;span class="n"&gt;tr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tracker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SummaryTracker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print_diff&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;leak&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print_diff&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;                     types |   # objects |   total size
========================== | =========== | ============
       &amp;lt;class 'array.array |           1 |      8.00 MB
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And there you have it. Note that this leak is not the Numpy array &lt;code&gt;test_data&lt;/code&gt; and it is not the matlab array &lt;code&gt;matlab_data&lt;/code&gt;. Both of these are garbage collected correctly. But &lt;strong&gt;the Matlab Engine for Python will leak any data you pass to a Matlab function&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This data is not referenced from anywhere within Python, and is counted as &lt;em&gt;leaked&lt;/em&gt; by &lt;code&gt;objgraph&lt;/code&gt;. In other words, the C code inside the Matlab Engine for Python copies all passed data into it's internal memory, but never frees that memory. Not even if you quit the Matlab Engine, or &lt;code&gt;del&lt;/code&gt; all Python references to it. Your only option is to restart Python.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Postscriptum&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I since posted a bug report on Mathworks, and received a patch that fixes the problem. Additionally, Mathworks said that the problem only occurs on Linux.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Thu, 29 Oct 2015 14:18:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2015-10-29-matlab-engine-leaks.html</guid></item><item><title>Eve 0.6.1 has been released</title><link>https://nicolaiarocci.com/eve-0-6-1-has-been-released/</link><description>&lt;p&gt;A new version of &lt;a href="http://python-eve.org"&gt;Eve&lt;/a&gt;, the REST API framework for Humans, has been released today. Following the 0.6 milestone released one month ago, v0.6.1 introduces some fixes and few new important features. Upgrade is strongly encouraged. As always, a &lt;a href="http://python-eve.org/changelog#version-0-6-1"&gt;changelog&lt;/a&gt; with full list of updates is available.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 29 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/eve-0-6-1-has-been-released/</guid></item><item><title>Links - October 29, 2015</title><link>https://faingezicht.com/links/2015/10/29/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 29 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/29/links/</guid></item><item><title>Why Docker?</title><link>https://www.brightball.com/articles/why-docker</link><description>Containers are not a new thing, but implementing them was always a little more complicated than it needed to be. Docker made great leaps in simplification of containers and set the world on fire from there. Let’s look at why.</description><author>Brightball Articles</author><pubDate>Thu, 29 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/why-docker</guid></item><item><title>Pesky "AMD-Action:authenticate:SP" and its Fix</title><link>https://grh.am/2015/pesky-amd-actionauthenticatesp-and-its-fix/</link><description>&lt;p&gt;Over the last few weeks, I&amp;rsquo;ve been plagued with an issue within the OSX El Capitan App Store, that resulted in me being unable to install any updates or install/purchase new applications. At first, I wondered if this was due to my hasty upgrade to the GM of OSX 10.11, which almost certainly was going have a few bugs and issues being the initial release of a new OS.&lt;/p&gt;
&lt;p&gt;After a few attempts at trying to fix the issue using Google, it seemed that although I wasn&amp;rsquo;t the only one being stung by this error message, it also wasn&amp;rsquo;t particularly wide spread. A recurring theme was the use of multiple Volumes on OSX, where the &amp;lsquo;/Users/&amp;rsquo; directory was not where the App Store expected it to be.&lt;/p&gt;</description><author>Graham Stevens – Grh.am</author><pubDate>Thu, 29 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://grh.am/2015/pesky-amd-actionauthenticatesp-and-its-fix/</guid></item><item><title>Qora (#blogtober 28)</title><link>https://rjp.is/blogging/posts/qora-blogtober-28-2-2/</link><description>Qora is a bit Sword &amp;amp; Sworcery but chunkier.
(Excuse the window decorations - I&amp;rsquo;m having to do this in a coffee shop without FRAPS because Spectre is going to make me too sad to play any games when I eventually get home after TWO DAMN HOURS of RELENTLESS DRIVEL.)
I&amp;rsquo;d like to point out here is that there&amp;rsquo;s no voice acting (rapidly becoming a pet hate of mine) in Qora - which means you can have lots of nice lovely textual conversations.</description><author>infrequent oscillations</author><pubDate>Wed, 28 Oct 2015 21:46:15 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/qora-blogtober-28-2-2/</guid></item><item><title>Prison Architect (#blogtober 27)</title><link>https://rjp.is/blogging/posts/prison-architect-blogtober-27-2/</link><description>I went into Prison Architect expecting a subtle, brooding, sneaky moral choice experience much like Papers Please (highly recommended, btw) &amp;hellip; and was promptly set about the head by a two by four as the first mission was to build an execution chamber and then execute someone.
Way to go with the subtle and brooding there, champ.
It&amp;rsquo;s just grim.
But hey ho, maybe that&amp;rsquo;s just the first &amp;ldquo;shocker&amp;rdquo; mission to loosen you up for some lovely subtle &amp;hellip; what&amp;rsquo;s that?</description><author>infrequent oscillations</author><pubDate>Wed, 28 Oct 2015 02:07:09 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/prison-architect-blogtober-27-2/</guid></item><item><title>Links - October 28, 2015</title><link>https://faingezicht.com/links/2015/10/28/links/</link><description>Several comments today: 

First, if you are reading the AVC posts, make sure to read them together. I think the analogy is flawed, but the underlying idea of "collecting the economic surplus of a revolution" is spot on.

Second, I'd like to thank my friend Yoav for pointing out Sapiens. I had skipped the &lt;a href="http://www.econtalk.org/archives/2015/10/yuval_harari_on.html"&gt;EconTalk episode&lt;/a&gt; until he called it the best book he's ever read. I trust his recommendations, even though he doesn't trust mine.

Lastly, Politico's website is kind of annoying, but their &lt;a href="http://www.politico.com/magazine/story/2015/10/evanston-illinois-what-works-213282"&gt;article about transportation-oriented development in Evanston&lt;/a&gt; was super interesting. 

Having lived there for a good chunk of my life, I can tell first hand that Evanston doesn't feel like a suburb. In fact, when discussing this article, I said "Evanston is actually part of the city, it is basically Chicago" and the response I got was "the fact that you think so means that the policy was successful." 

Guess so.</description><author>Avy Faingezicht</author><pubDate>Wed, 28 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/28/links/</guid></item><item><title>[Computing] Why I don't like smartcards, HSMs, YubiKeys, etc.</title><link>https://www.devever.net/~hl/smartcards</link><description>&lt;p&gt;&lt;em&gt;This is a rant about smartcards with some digression into ranting about the integrated circuit industry.&lt;/em&gt;&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Wed, 28 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/smartcards</guid></item><item><title>Copyright, site policies and legal info</title><link>https://stop.zona-m.net/legal-info/</link><description>Cookie Policy Copyright and Terms of Use Privacy Policy Miscellaneous Legal Info  Cookie Policy PREFACE: the European Union saw an actual and very, very serious problem, that is people continuously tracked online in many ways, including &amp;ldquo;cookies&amp;rdquo;&amp;hellip; and &amp;ldquo;fixed&amp;rdquo; it in a terrible way. Italy, where I am based, made it worse. Instead of mandating the addition of cookie management functions in all the very few Web Browsers you may use, it decided to force every website you visit to annoy you with &amp;ldquo;cookie information&amp;rdquo; info banners as follows (see the service request below!</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Tue, 27 Oct 2015 17:56:59 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/legal-info/</guid></item><item><title>Going native with om.next</title><link>https://david.coffee/going-native-with-om.next/</link><description>&lt;p&gt;I mentioned already earlier that I believe &lt;a href="https://github.com/omcljs/om"&gt;om.next&lt;/a&gt; will be the future. Not particular om itself but the idea it implements: demand driven applications. The component declares what data it needs and the server is just there for delivering it. Components don&amp;rsquo;t want to coordinate 20 ajax requests just to gather all the data they need to operate. Components also don&amp;rsquo;t need all of the data your API provides in most cases, so why even the need to download all of it?&lt;/p&gt;
&lt;p&gt;These concepts make sense as the next iteration of server / client architectures but you know where they fit even better? &lt;strong&gt;Mobile Apps!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Especially when load time is critical and data volume limited, downloading big chunks of REST json data can get very annoying. We can&amp;rsquo;t just pump all the jsons our website uses into an app and expect it to be as performant as the web counterpart.&lt;/p&gt;
&lt;p&gt;So, wouldn&amp;rsquo;t it be amazing if our app just says &lt;em&gt;&amp;ldquo;I need the list of available books, but only the title and the image url and nothing else&amp;rdquo;&lt;/em&gt; and it will get exactly that and nothing more?&lt;/p&gt;
&lt;p&gt;With &lt;a href="https://github.com/omcljs/om"&gt;next&lt;/a&gt; around the corner I decided to give it a try with react native. &lt;a href="http://cljsrn.org/"&gt;cljsrn&lt;/a&gt; is already bundling a good amount of resources around the topic clojurescript and react native and &lt;a href="https://github.com/dmotz/natal"&gt;natal&lt;/a&gt; and &lt;a href="http://cljsrn.org/ambly.html"&gt;ambly&lt;/a&gt; already work great for legacy om, so let&amp;rsquo;s make it work for om.next!&lt;/p&gt;
&lt;h3 id="a-stoney-path"&gt;A stoney path&lt;/h3&gt;
&lt;p&gt;After poking a bit around with next and natal, I quickly ran into a deadend because of it&amp;rsquo;s dependency to &lt;code&gt;gdom&lt;/code&gt; and &lt;code&gt;ReactDOM&lt;/code&gt;. Instead of calling &lt;code&gt;React.render&lt;/code&gt;, om.next relies on React 0.14 which splits the rendering logic from the component. Here we&amp;rsquo;re calling &lt;code&gt;ReactDOM.render&lt;/code&gt; instead, which, well, relies on a DOM.&lt;/p&gt;
&lt;p&gt;Luckily after a short chat with &lt;a href="https://github.com/swannodette"&gt;@dnolen&lt;/a&gt; he promptly stripped out &lt;code&gt;ReactDOM&lt;/code&gt; (and &lt;code&gt;gdom&lt;/code&gt; as well) and added functionality that allows us to pass a &lt;code&gt;:root-render&lt;/code&gt; and &lt;code&gt;:root-unmount&lt;/code&gt; function into the reconciler. Whatever we specify here will get used to render and unmount components.&lt;/p&gt;
&lt;p&gt;Reading through the &lt;a href="https://github.com/facebook/react-native/tree/master/Libraries/ReactNative"&gt;react native source&lt;/a&gt; made it clear that 0.14 has not been adapted yet and the rendering and unmounting logic is still inside &lt;code&gt;React&lt;/code&gt;. To plug this into om.next, all we have to do is&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-cljs"&gt;:root-render #(.render js/React %1 %2)
:root-unmount #(.unmountComponentAtNode js/React %)})
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;&amp;hellip;where js/React is the required react-native library.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Another thing that becomes clear is that React Native doesn&amp;rsquo;t render components into DOM references. Instead, it &lt;a href="https://github.com/facebook/react-native/blob/master/Libraries/ReactNative/ReactNative.js#L74-L80"&gt;uses a number&lt;/a&gt; that references back to a component. With the first one being &lt;code&gt;1&lt;/code&gt;, we know exactly what where we have to add our root to:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-cljs"&gt;(om/add-root! reconciler my-component 1)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="wrapping-up"&gt;Wrapping up&lt;/h3&gt;
&lt;p&gt;
&lt;img alt="showcase" class="img-fluid" src="./om.next-native.png" /&gt;

&lt;/p&gt;
&lt;p&gt;The full code looks something like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-cljs"&gt;;; Need to set js/React first so that Om can load
(set! js/React (js/require "react-native/Libraries/react-native/react-native.js"))

(ns future-next.core
  (:require [om.next :as om :refer-macros [defui]]))

;; Reset js/React back as the form above loads in an different React
(set! js/React (js/require "react-native/Libraries/react-native/react-native.js"))

;; Setup some methods to help create React Native elements
(defn view [opts &amp;amp; children]
  (apply js/React.createElement js/React.View (clj-&amp;gt;js opts) children))

(defn text [opts &amp;amp; children]
  (apply js/React.createElement js/React.Text (clj-&amp;gt;js opts) children))


;; Set up our Om UI
(defonce app-state (atom {:app/msg "Hello om.next!"}))

(defui WidgetComponent
  static om/IQuery
  (query [this]
         '[:app/msg])
  Object
  (render [this]
          (let [{:keys [app/msg]} (om/props this)]
            (view {:style {:flexDirection "column" :margin 40}}
                  (text nil msg))
            )))

 (defn read
   [{:keys [state] :as env} key params]
   (let [st @state]
     (if-let [[_ v] (find st key)]
       {:value v}
       {:value :not-found})))

 (def reconciler
   (om/reconciler
    {:state app-state
     :parser (om/parser {:read read})
     :root-render #(.render js/React %1 %2)
     :root-unmount #(.unmountComponentAtNode js/React %)})
   )

(om/add-root! reconciler WidgetComponent 1)

(defn ^:export init []
  ((fn render []
     (.requestAnimationFrame js/window render))))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="https://github.com/dmotz/natal/pull/18"&gt;I submitted a PR&lt;/a&gt; to natal and once that&amp;rsquo;s merged in, all you have to do is &lt;code&gt;natal init&lt;/code&gt; :)&lt;/p&gt;
&lt;p&gt;Can you believe that all of this happened in just 1.5 days?&lt;/p&gt;</description><author>David Mohl</author><pubDate>Tue, 27 Oct 2015 14:47:46 GMT</pubDate><guid isPermaLink="true">https://david.coffee/going-native-with-om.next/</guid></item><item><title>Time Travel</title><link>https://faingezicht.com/articles/2015/10/27/time-travel/</link><description>This week's &lt;a href="http://www.econtalk.org/archives/2015/10/cesar_hidalgo_o.html"&gt;episode of EconTalk&lt;/a&gt; opens with an amazing quote, which I felt was to good not to share:

&gt; It took only 26 minutes for Anna to push Iris into the hands of the nervous but focused medical student who received her. Twenty-six minutes sounds like a short time for delivery. And it is. And I will argue that the trip that Iris made that night was not a 26-minute trip down a few inches of birth canal, but a hundred thousand year journey from a distant past to an alien future. In 26 minutes, Iris traveled from the ancientness of her mother's womb to the modernity of 21st century society. Birth is in essence time travel.
&gt;
&gt;-César Hidalgo, Why Information Grows

During the rest of the interview, César discusses less philosophical, and more concrete topics, including his research on physics, economics, complex networks and data visualization. I had previously played with his &lt;a href="http://atlas.media.mit.edu/en"&gt;Observatory of Economic Complexity&lt;/a&gt; project, and I am very much looking forward to reading about his new work on collective memory.

I definitely know what book I am &lt;a href="http://www.amazon.com/Why-Information-Grows-Evolution-Economies/dp/0465048994"&gt;reading next&lt;/a&gt;.

*Image: "Studies of embryos" by Leonardo da Vinci - Licensed under Public Domain via &lt;a href="https://commons.wikimedia.org/wiki/File:Studies_of_embryos.jpg#/media/File:Studies_of_embryos.jpg"&gt;Wikimedia Commons&lt;/a&gt;*</description><author>Avy Faingezicht</author><pubDate>Tue, 27 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/articles/2015/10/27/time-travel/</guid></item><item><title>Links - October 27, 2015</title><link>https://faingezicht.com/links/2015/10/27/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 27 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/27/links/</guid></item><item><title>Amnesia (#blogtober 26)</title><link>https://rjp.is/blogging/posts/amnesia-blogtober-26-2/</link><description>Finally getting around to Amnesia and &amp;hellip; meh. Games with voice acting really grind my weasels. It&amp;rsquo;s just such a waste of resources and effort and then all your dialog has to be plotted for voice and BLEUGH.
It actually took a while to get to this point - it turns out that you need to turn off &amp;ldquo;Display Scaling for High DPI&amp;rdquo; or the screen will be zoomed and the mouse will jank about like Keith Richards double teaming meth with crack.</description><author>infrequent oscillations</author><pubDate>Mon, 26 Oct 2015 23:42:14 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/amnesia-blogtober-26-2/</guid></item><item><title>Links - October 26, 2015</title><link>https://faingezicht.com/links/2015/10/26/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 26 Oct 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/26/links/</guid></item><item><title>The Long Dark (alpha) (#blogtober 25)</title><link>https://rjp.is/blogging/posts/the-long-dark-alpha-blogtober-25-2/</link><description>The Long Dark is like a first-person Don&amp;rsquo;t Starve - except prettier and more difficult.
This is the only game I&amp;rsquo;ve seen which lets you pick metric (correct!) and 24 hour clock (correct!).
Confusingly, even though the &amp;ldquo;Feels Like&amp;rdquo; went from -20º to -15º whilst I was playing, my temperature was heading downwards faster than everyone&amp;rsquo;s favourite* blue team.
I do like a realistic inventory, though.
You get some good scenery.</description><author>infrequent oscillations</author><pubDate>Mon, 26 Oct 2015 01:00:11 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/the-long-dark-alpha-blogtober-25-2/</guid></item><item><title>Training for under 50 min 10k run</title><link>https://xenodium.com/training-for-under-50-min-10k-run</link><description>&lt;p&gt;Not much training time for an under 50 minute 10k run, but here's an attempt (based on time-to-run's &lt;a href="http://www.time-to-run.com/training/10k/sub50.htm"&gt;sub-50&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;Mon        Tue        Wed            Thu        Fri            Sat        Sun&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Oct 26&lt;/em&gt;   &lt;em&gt;Oct 27&lt;/em&gt;   &lt;em&gt;Oct 28&lt;/em&gt;       &lt;em&gt;Oct 29&lt;/em&gt;   &lt;em&gt;Oct 30&lt;/em&gt;       &lt;em&gt;Oct 31&lt;/em&gt;   &lt;em&gt;Nov 1&lt;/em&gt;
60 min         30 min     2k @ 4.55/k    rest       105 min
2 min rest
✔                         (repeat x 3)
&lt;em&gt;Nov 2&lt;/em&gt;    &lt;em&gt;Nov 3&lt;/em&gt;    &lt;em&gt;Nov 4&lt;/em&gt;        &lt;em&gt;Nov 5&lt;/em&gt;    &lt;em&gt;Nov 6&lt;/em&gt;        &lt;em&gt;Nov 7&lt;/em&gt;    &lt;em&gt;Nov 8&lt;/em&gt;
30 min     30 min     1k @ 4.50/k    30 min     30 min         rest       5k @ 4.55/k
90 sec rest
(repeat x 5)
&lt;em&gt;Nov 9&lt;/em&gt;    &lt;em&gt;Nov 10&lt;/em&gt;   &lt;em&gt;Nov 11&lt;/em&gt;       &lt;em&gt;Nov 12&lt;/em&gt;   &lt;em&gt;Nov 13&lt;/em&gt;       &lt;em&gt;Nov 14&lt;/em&gt;   &lt;em&gt;Nov 15&lt;/em&gt;
10k easy   30 min     1k @ 4.55/k    30 min     30 min         rest       race day
1 min easy
(repeat x 3)&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 25 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/training-for-under-50-min-10k-run</guid></item><item><title>Reading a running training plan</title><link>https://xenodium.com/reading-a-running-training-plan</link><description>&lt;p&gt;A sample from &lt;a href="http://lsanderstri.com/2014/10/15/kona-part-2/"&gt;Kona Part 2's&lt;/a&gt; comments:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;2.5 w/u to 4x(1.25@11.5 w/0.25R@7) to 3x(3.75@10.5 w/0.5R@7) to 2.5 c/d.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Is read from left to right as:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;2.5 mile warm up to four times through 1.25 miles at 11.5 miles per hour with 0.25 miles recovery at 7 miles per hour to three times through 3.75 miles at 10.5 miles per hour with 0.5 miles recovery at 7 miles per hour to 2.5 miles cool down.
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 25 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/reading-a-running-training-plan</guid></item><item><title>Why Medium?</title><link>https://faingezicht.com/articles/2015/10/25/why-medium/</link><description>This week, I was surprised to see a piece by an Amazon SVP on my feed. &lt;a href="https://medium.com/@jaycarney/what-the-new-york-times-didn-t-tell-you-a1128aa78931"&gt;What The New York Times Didn’t Tell You&lt;/a&gt; showed up months after a &lt;a href="http://www.nytimes.com/2015/08/16/technology/inside-amazon-wrestling-big-ideas-in-a-bruising-workplace.html"&gt;*"scathing, blistering, brutal and harsh"*&lt;/a&gt; story about the company appeared on the front page of the New York Times mid August. Other than a leaked internal memo from Jeff Bezos, in which he disowned the Amazon portrayed in the story, there was no official response.

Cue Jay Carney, and his post.

As SVP of Global Corporate Affairs, and the ultimate spokesperson at the Seattle giant, Mr. Carney's job is to keep Amazon's name in good standing. His post and its contents were expected, even if a few weeks late. No surprise there. What seemed remarkable to me is that Carney, and by extension Amazon, decided to publish their account not on their own website, nor on a renowned journal, but on Medium, of all places!

Hours later, the New York Times responded with 1000+ words, not on their own site, but &lt;a href="https://medium.com/@NYTimesComm/dean-baquet-responds-to-jay-carney-s-medium-post-6af794c7a7c6"&gt;on Medium&lt;/a&gt;, to which Carney countered, &lt;a href="https://medium.com/@jaycarney/jay-carney-s-response-to-dean-baquet-c0407042e893"&gt;again on Medium&lt;/a&gt;. We're not talking about a couple of bloggers with some following having a back and forth, but the Executive Editor of the NYT, and the Senior Vice President of a tech giant engaging in a pissing contest online. On Medium! Eventually, things moved back to a more traditional, um, &lt;a href="http://www.nytimes.com/2015/10/20/business/amazon-spars-with-the-times-over-investigative-article.html"&gt;medium&lt;/a&gt;.

The release was clearly a calculated move. Publishing it, not on their own site, as an appeal to their massive user base, and not in any prestigious and high-readership publication, was not a decision taken lightly. At a place like Amazon, there must have been at least some data crunched behind this.

As usual, &lt;a href="https://stratechery.com/2015/in-defense-of-the-new-york-times/"&gt;Ben Thompson hit the nail on the head&lt;/a&gt;, noting that "the placement helped guarantee attention from a certain segment of the public without tying it too explicitly to Amazon," and then went on to describe a broad view of the future of journalism. The more important question, in my opinion, was left unanswered. Why Medium?

For starters, the post was not just an exercise is targeting techies. Although Medium is still a platform mostly frequented by a younger, tech-centered demographic, it is gaining breadth quickly. This makes me think that the goal was not to reach the tech crowd specifically, who would be more likely to find it in a narrower publication. Back in May, Medium boasted 25M monthly users. They can't all be tech bros.

Obviously, Amazon has a great channel for reaching as many people as possible: Its ever-evolving front page has an audience orders of magnitude larger than whatever Medium dreams of providing. Much like the banners asking for donations on Wikipedia every few months, a rightly placed banner on the Amazon front page would surely make the world listen. However, this would come at a cost. An announcement with such a negative connotation would bring unwanted attention, and distract its customers from ordering more Elsa Dolls. Distribution for the sake of distribution, and reach for the sake of reach, were not the driving force here.

Interestingly, Amazon's post is never clear on whether it presents an official version, or just that of an employee with a strong opinion. As the New Yorker &lt;a href="http://www.newyorker.com/business/currency/why-did-jay-carney-use-medium-to-criticize-the-new-york-times"&gt;points out&lt;/a&gt;, during his time at the White House, Carney also opted to tone down the "official-ness" of press releases. Now, he is applying the same strategy at Amazon. Even with the article's first person plural voice, a distracted or careless reader could easily let the extent of its authorship slip. And, let's face it, thanks to Medium's UI, which focuses on the content and nothing else, uninformed readers (which sadly are a majority) would not tell: Carney never states his role in the text, and the reader does not get to see his identity until the very bottom of the page. Had the goal been to publish an official stance, this would have been a really bad way to do it. Medium allowed for more vagueness than a traditional publisher would have, and I believe that was the main objective when selecting how to release the piece.

Everyone else is asking, why publish this at all, and maybe more importantly, why now. I have not been able to come up with any good explanations.

All I know is Ev Williams probably had a great day this past Monday.

*This article was &lt;a href="https://medium.com/@avyfain/why-medium-829bf4e02827"&gt;cross-posted on Medium&lt;/a&gt;*</description><author>Avy Faingezicht</author><pubDate>Sun, 25 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/articles/2015/10/25/why-medium/</guid></item><item><title>2015-10-25</title><link>https://ho.dges.online/pictures/2015-10-25/</link><description>&lt;p&gt;That perfect moment when you realise you have one over on your big brothers&amp;hellip;&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sun, 25 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-10-25/</guid></item><item><title>Gravity Ghost (#blogtober 24)</title><link>https://rjp.is/blogging/posts/gravity-ghost-blogtober-24-2/</link><description>Like one of those old Flash games where you had to propel your penguin between a bunch of planets to hit the black hole1, you have to leave one planet, get the star, and go through the door.
This is why I keep my hair violently short - I&amp;rsquo;m fed up of being harassed by animal spirits for free rides.
My luscious locks have snared me a space bunny!</description><author>infrequent oscillations</author><pubDate>Sat, 24 Oct 2015 23:26:26 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/gravity-ghost-blogtober-24-2/</guid></item><item><title>Gathering Time Series Data</title><link>https://denvaar.dev/posts/gathering_time_series_data.html</link><description>A brief description of an efficient solution to gather new time series data.</description><author>denvaar's website</author><pubDate>Sat, 24 Oct 2015 08:40:09 GMT</pubDate><guid isPermaLink="true">https://denvaar.dev/posts/gathering_time_series_data.html</guid></item><item><title>A Wizard's Lizard (#blogtober 23)</title><link>https://rjp.is/blogging/posts/a-wizards-lizard-blogtober-23-2/</link><description>A Wizard&amp;rsquo;s Lizard – which sounds like a dirty, dirty euphemism – seems to be heavily inspired by another game. See if you can guess which one.
PLOT.
This screen, dark though it may be, contains all the clues you need to know about which game heavily influenced this one.
It all seems to have gone a bit Dark Souls here - I died and now I&amp;rsquo;m unhollow? Or hollow-but-angel?</description><author>infrequent oscillations</author><pubDate>Fri, 23 Oct 2015 22:48:08 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/a-wizards-lizard-blogtober-23-2/</guid></item><item><title>Find binary in PATH using python</title><link>https://xenodium.com/find-binary-in-path-using-python</link><description>&lt;pre&gt;&lt;code class="language-{.python"&gt;import distutils.spawn
print distutils.spawn.find_executable('git')
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;/usr/bin/git
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 23 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/find-binary-in-path-using-python</guid></item><item><title>Links - October 23, 2015</title><link>https://faingezicht.com/links/2015/10/23/links/</link><description/><author>Avy Faingezicht</author><pubDate>Fri, 23 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/23/links/</guid></item><item><title>Antichamber (#blogtober 22)</title><link>https://rjp.is/blogging/posts/antichamber-blogtober-22-2/</link><description>There&amp;rsquo;s probably some trick to Antichamber that I&amp;rsquo;m missing because the only non-obvious puzzle part I managed to figure out were the dreamcatchers and even then the wall had to hint heavily at it.
Which is a shame because it looks lovely. Probably one for the philosophy students.</description><author>infrequent oscillations</author><pubDate>Thu, 22 Oct 2015 22:25:07 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/antichamber-blogtober-22-2/</guid></item><item><title>Tools for Cleaning Up Messy JavaScript</title><link>https://peterlyons.com/problog/2015/10/tools-for-cleaning-up-messy-javascript/</link><description>&lt;p&gt;In my consulting work, I encounter a pretty high quantity and diversity of codebases as client projects flow in and out. For many reasons, it is very common for a project to get increasingly messy with time, and often by the time it drops in my lap, it's a certifiable mess.&lt;/p&gt;
&lt;p&gt;Dealing with a mess can be a huge drag and productivity drain as even the simplest debugging investigation is rife with confusion, duplication, misdirection, etc. Here's a few quick tools tips to help get things organized and clean again.&lt;/p&gt;
&lt;h2 id="esformatter"&gt;esformatter&lt;/h2&gt;
&lt;p&gt;If the overall code style is highly inconsistent or hard to read, it might make sense to hit it with a giant &lt;a href="https://github.com/millermedeiros/esformatter"&gt;esformatter&lt;/a&gt; hammer and just force everything into a single style. The go programming language does this language-wide via &lt;a href="https://golang.org/cmd/gofmt/"&gt;gofmt&lt;/a&gt;. Keep these tips in mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;javascript is interpreted not compiled so if auto-formatting goes wrong and you don't have enough code coverage in unit tests, you might not discover problems until production
&lt;ul&gt;
&lt;li&gt;minimize this risk by autoformatting in small batches and making sure any tests you have continue to pass&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;esformatter and similar tools are still pretty young and could have bugs that change your code in bad ways
&lt;ul&gt;
&lt;li&gt;always carefully inspect the diffs before committing automatic changes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Do the formatting in small batches and group changes into a large number of small git commits
&lt;ul&gt;
&lt;li&gt;after every change, confirm via unit tests if you have them and eslint that the code is still not obviously broken&lt;/li&gt;
&lt;li&gt;keeping the git commits granular will enable you to more effectively bisect the code to track down a specific problem introduced by one of these changes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Do all the work on a branch, and do no manual code changes of any type on this branch
&lt;ul&gt;
&lt;li&gt;For example, don't mix some manual variable renames with automated esformatter changes&lt;/li&gt;
&lt;li&gt;You want to be able to discard the branch entirely without losing and human-authored changes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Get the project done quickly
&lt;ul&gt;
&lt;li&gt;This is a complete recipe for merge conflicts and you'll never get it done doing small bits at a time while active development is happening concurrently. If you need to, just declare a small moratorium on development for a weekend or whatever and get everything formatted and merged before new feature development continues&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="eslint"&gt;eslint&lt;/h2&gt;
&lt;p&gt;I &lt;a href="https://peterlyons.com/problog/2015/10/eslint:-toward-javascript-lint-nirvana"&gt;covered eslint in some detail in my previous post&lt;/a&gt;. Once you've got the code reasonably formatted and consistent, throw eslint at it to get a sense of where bugs and issues may lie. Often times you may be getting hundreds or thousands of errors and warnings. I think focusing on either the most frequent errors (codebase improves the most by fixing these) or least frequent (fixing these can get you to OK on a specific eslint rule quickly) are reasonable approaches. The key thing here psychologically for me is to not get overwhelmed and frustrated and hopeless.&lt;/p&gt;
&lt;p&gt;One nice plugin that can help with initial analysis, triaging, and scheduling is &lt;a href="https://www.npmjs.com/package/eslint-stats"&gt;eslint-stats&lt;/a&gt; which can make it easy to see which problems are most common.&lt;/p&gt;
&lt;h2 id="beautify-with-words"&gt;beautify-with-words&lt;/h2&gt;
&lt;p&gt;True story. A client's codebase was uglified then autoformatted by a previous developer before delivery to the client as "source code". Thus at a glance it looked like source code as it had newlines and indenting, but all the variable names had been minified to single letters. This made it extremely difficult to read. One tool that helped us gradually get back to sanity was &lt;a href="https://www.npmjs.com/package/beautify-with-words"&gt;beautify with words&lt;/a&gt; which finds all those 1-letter variable names and generates a longer, unique, pronounceable (but otherwise gibberish) variable name for them. After that you can easily find and replace all once you understand what an appropriate semantic name for the variable is.&lt;/p&gt;
&lt;h2 id="grasp"&gt;grasp&lt;/h2&gt;
&lt;p&gt;There's a really cool utility called &lt;a href="http://www.graspjs.com/"&gt;grasp&lt;/a&gt; that parses javascript into an abstract syntax tree and allows you to programmatically alter that tree, then generate new source code. Lots of potential for interesting uses here, but so far I've only really used it for the use case of syntax-aware search and replace. The problem with generic text editor search and replace for variables is it will also change that name within a string or a comment or embedded within another word, etc. The bottom line is careless find/replace in a generic text editor can break your code. With grasp, you can tell it to replace just an identifier and it really knows what that means. For example, to rename a variable from &lt;code&gt;user&lt;/code&gt; to &lt;code&gt;account&lt;/code&gt;, we could do:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grasp &amp;#x27;#user&amp;#x27; --replace account
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;My workflow with grasp is as follows.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;highlight a small but coherent and valid javascript snippet in my text editor
&lt;ul&gt;
&lt;li&gt;has to be valid JS to work with grasp. I usually grab an entire function declaration or conditional block&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;copy it into the clipboard&lt;/li&gt;
&lt;li&gt;run grasp in the terminal:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pbpaste | grasp '#user' --replace account | pbcopy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;this pastes the text into grasp's stdin, and copies grasp's stdout back into the clipboard&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;back in my editor just paste the results in, replacing the still-selected original snippet&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="keep-it-clean"&gt;Keep It Clean&lt;/h2&gt;
&lt;p&gt;Hopefully these tools will help you out in the wild cleaning up messy codebases!&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Thu, 22 Oct 2015 19:38:52 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2015/10/tools-for-cleaning-up-messy-javascript/</guid></item><item><title>eslint: toward javascript lint nirvana</title><link>https://peterlyons.com/problog/2015/10/eslint:-toward-javascript-lint-nirvana/</link><description>&lt;p&gt;The world of javascript code linters is a fertile breeding ground for vociferous debate over unimportant details. It's easy to stray into the bad patterns of arguing with colleagues, playing "curly brace police", and other variants. However, used well with the right mindset and team communication, good code linters and autoformatters can be truly valuable additions to your development workflow and tool chain.&lt;/p&gt;
&lt;p&gt;If you haven't yet discovered eslint, it's my pleasure to refer you to &lt;a href="http://eslint.org/docs/about/"&gt;the eslint about page&lt;/a&gt;. Go read the eslint philosophy. It's the strictly correct thing. eslint is "agenda free" and 100% configurable. Earlier tools starting from the grandparent of Douglas Crockford's jslint, then jshint veered off the rails there and eslint is here to take over.&lt;/p&gt;
&lt;p&gt;So getting started with eslint can be as easy as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install --save-dev eslint
echo node_modules &amp;gt;&amp;gt; .eslintignore
PATH=$(pwd)&amp;#x2f;node_modules&amp;#x2f;.bin:$PATH
eslint .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The eslint rules have pretty good, clear names. The docs are solid. I wrote my own custom formatter called &lt;a href="https://www.npmjs.com/package/eslint-formatter-comment"&gt;eslint-formatter-comment&lt;/a&gt; which I use for text editor friendliness and rule-disabling convenience.&lt;/p&gt;
&lt;p&gt;If you want to role with some of the more prolific npm authors, you can decide to start with the &lt;a href="https://github.com/feross/standard"&gt;@feross/standard&lt;/a&gt; configuration by doing &lt;code&gt;npm install --save-dev eslint-config-standard&lt;/code&gt; then adding this to your &lt;code&gt;.eslintrc&lt;/code&gt; JSON file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &amp;quot;extends&amp;quot;: [
    &amp;quot;.&amp;#x2f;node_modules&amp;#x2f;eslint-config-standard&amp;#x2f;eslintrc.json&amp;quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="formatting-with-esformatter"&gt;Formatting With esformatter&lt;/h2&gt;
&lt;p&gt;OK great so eslint has found hundreds of issues with your code. What do you do? Manually fixing them can be very time consuming, tedious, and error prone. eslint now has the &lt;code&gt;--fix&lt;/code&gt; command and can automatically fix up your source code for some (but not all) rules. I haven't tried it out yet as when I first started working with eslint that feature didn't exist. But you should give it a try and hopefully its capabilities will continue to expand with time. However, there's another project &lt;a href="https://github.com/millermedeiros/esformatter"&gt;esformatter&lt;/a&gt; that can do most code style fixes (indentation, braces, spacing, semicolons, etc) automatically.&lt;/p&gt;
&lt;p&gt;When I found esformatter, tried it, and found it to be by-and-large correct and reliable, it was a godsend. I work on so many different client projects as well as some nonprofit codebases where most developers only contribute on a handful of days. This leads to highly inconsistent codebases in terms of format/style. To be able to just define a &lt;code&gt;.esformatter&lt;/code&gt; config and fix up the entire codebase in one fell swoop is really awesome and can be a big morale boost as well. esformatter does have some bugs, but so far they are minor and easy to work around in my experience.&lt;/p&gt;
&lt;h2 id="how-i-roll-with-eslint"&gt;How I Roll With eslint&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;install the stack
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install --save-dev eslint eslint-config-standard eslint-plugin-standard eslint-formatter-comment&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;set up my &lt;code&gt;.eslintrc&lt;/code&gt; with the &lt;code&gt;extends&lt;/code&gt; as above&lt;/li&gt;
&lt;li&gt;set up my &lt;code&gt;.eslintignore&lt;/code&gt; with at least &lt;code&gt;node_modules&lt;/code&gt; and whatever other project-specific paths I need to ignore&lt;/li&gt;
&lt;li&gt;start running it via just &lt;code&gt;eslint .&lt;/code&gt; or a small wrapper script that uses my custom output format&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="atom-text-editor-integration"&gt;Atom Text Editor Integration&lt;/h2&gt;
&lt;p&gt;I have the &lt;code&gt;linter&lt;/code&gt; and &lt;code&gt;linter-eslint&lt;/code&gt; atom plugins installed for good integration with Atom. I can directly spot errors in my code without being visually distracting or overwhelming.&lt;/p&gt;
&lt;p&gt;For esformatter I have the Atom &lt;code&gt;esformatter&lt;/code&gt; plugin and a ctrl-f keystroke defined:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x27;.editor&amp;#x27;:
  &amp;#x27;ctrl-. e r c&amp;#x27;: &amp;#x27;eslint:reload-config&amp;#x27;
  &amp;#x27;ctrl-. l i&amp;#x27;: &amp;#x27;eslint:lint&amp;#x27;
  &amp;#x27;ctrl-f&amp;#x27;: &amp;#x27;esformatter&amp;#x27;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="thoughts-on-feross-standard"&gt;Thoughts on feross/standard&lt;/h2&gt;
&lt;p&gt;@feross/standard is a bit controversial, but the specific choices it puts forward seem good enough to me, and given there are good tools to just automatically format code to that style, I'm OK with just embracing it. I've got 3 medium-sized projects all using it as the baseline and it's OK. I make it even stricter by adding a few more rules, most notably I'm still strongly in the camp of 80-char max line length, so I enable that rule as well. I certainly would have made some different choices, in particular I think double quotes are much better because JSON, but now that I can just hit &lt;code&gt;ctrl-f&lt;/code&gt; and have the correct quotes, it's OK.&lt;/p&gt;
&lt;h2 id="why-do-you-even-care"&gt;Why Do You Even Care?&lt;/h2&gt;
&lt;p&gt;I have had colleagues chastise me for being picky about code format, saying it's a matter of personal choice and not worthwhile to point out or fix. For me, I find consistent style to be a marker of being detail-oriented and paying close attention. If a developer is sloppy or inconsistent with their code formatting, I'm immediately concerned that maybe they aren't paying careful attention to the actual behavior and semantics of their code either. It's so easy to let unused variables, shadowing, and other common errors slip into your code over time, and automated linting provides an easy fix.&lt;/p&gt;
&lt;h2 id="toward-nirvana"&gt;Toward Nirvana&lt;/h2&gt;
&lt;p&gt;Ideally, I'd want to see a single tool like eslint be able to handle all these tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;show errors on the command line&lt;/li&gt;
&lt;li&gt;show errors in the editor&lt;/li&gt;
&lt;li&gt;automatically fix files in place on the command line&lt;/li&gt;
&lt;li&gt;automatically fix files in place in the editor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;eslint seems headed clearly in this direction, but it's not there yet. I would love to see eslint completely subsume esformatter and make it obsolete.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Thu, 22 Oct 2015 18:42:56 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2015/10/eslint:-toward-javascript-lint-nirvana/</guid></item><item><title>MarkRight - a markdown editor in om+electron</title><link>https://david.coffee/markright-a-markdown-editor-in-om-electron/</link><description>&lt;p&gt;If you follow clojurescript development you might have already heard about the next iteration of om, &lt;a href="https://github.com/omcljs/om"&gt;om.next&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;om.next is David Nolens attempt to bring together what big companies like facebook with &lt;a href="https://facebook.github.io/relay/"&gt;relay&lt;/a&gt; and netflix with &lt;a href="https://facebook.github.io/relay/"&gt;falcor&lt;/a&gt; are doing at the moment. I will not go into detail but instead of REST, it implements a architecture in which components clearly declare what kind of data they need to operate. A server / router is then gathering that data and passing it back. Instead of multiple REST endpoints, you&amp;rsquo;ll end up with 1 graph endpoint that understands the client query.&lt;/p&gt;
&lt;p&gt;While still in early alpha, I was looking for an excuse to play around with it - or at least a excuse to use it in the most simple case possible. After scratching my head for a bit I came up with a &lt;strong&gt;markdown editor&lt;/strong&gt;. But why the hell would I want to write a markdown editor?&lt;/p&gt;
&lt;p&gt;When I have to write markdown, I&amp;rsquo;m missing a perfect live preview. I know, there are options out there that give you that either webbased or stuff that just let&amp;rsquo;s you preview what you wrote. The most popular probably being &lt;a href="http://25.io/mou/"&gt;mou&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But I don&amp;rsquo;t like mou and it looks like they seem to charge for it soon. On top of that, I was eyeballing githubs &lt;a href="https://github.com/atom/electron"&gt;electron&lt;/a&gt; (the thing that atom uses) for a while and wanted to give it a try.&lt;/p&gt;
&lt;h2 id="meet-markright"&gt;Meet MarkRight&lt;/h2&gt;
&lt;p&gt;So I played a bit electron and om, created a pull request to &lt;a href="https://github.com/karad/lein_template_descjop/"&gt;descjop&lt;/a&gt; on the way and eventually came up with &lt;strong&gt;MarkRight&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;img alt="markright banner" class="img-fluid" src="https://raw.githubusercontent.com/dvcrn/dmedit/master/resources/markright-banner.png" /&gt;

&lt;/p&gt;
&lt;p&gt;Markright is like the most simple editor you can imagine but it is this simplicity that I love! It is literally powered by 2 (or 3 if you count root) om / react components and all they do is piping your input text in real-time through &lt;a href="https://github.com/chjj/marked"&gt;marked&lt;/a&gt;. It was fun to give &lt;a href="https://codemirror.net/"&gt;codemirror&lt;/a&gt; a spin as well!&lt;/p&gt;
&lt;p&gt;I was really surprised how easy it was to just plug these different components together. The open source community did an amazing job with building and maintaining these cool toys!&lt;/p&gt;
&lt;p&gt;Anyway, here&amp;rsquo;s how it looks:&lt;/p&gt;
&lt;p&gt;
&lt;img alt="screenshot" class="img-fluid" src="https://david.coffee/_Files/images/markright.png" /&gt;

&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s not much to it yet. You can save files, open files and - well - write markdown. There&amp;rsquo;s a lot of things to do but if you like the idea, please feel free to &lt;a href="https://github.com/dvcrn/markright"&gt;contribute at github&lt;/a&gt; :)&lt;/p&gt;</description><author>David Mohl</author><pubDate>Thu, 22 Oct 2015 13:43:17 GMT</pubDate><guid isPermaLink="true">https://david.coffee/markright-a-markdown-editor-in-om-electron/</guid></item><item><title>Java 8 parallel streams API</title><link>https://studiofreya.org/java/java-parallel-streams-api/</link><description>&lt;p&gt;Parallel programming is a very difficult, but sometimes a necessary task. Modern computers contain multiple cores and any complex algorithm that is not performing parallel processing is not exploiting the full potential of the hardware.&lt;/p&gt;
&lt;p&gt;In this Java 8 Streams tutorial we will show you how to convert a &lt;code&gt;Stream&lt;/code&gt; to &lt;code&gt;List&lt;/code&gt; using &lt;code&gt;parallelStream()&lt;/code&gt;, &lt;code&gt;filter()&lt;/code&gt; and &lt;code&gt;collect()&lt;/code&gt;, how to convert an &lt;code&gt;Iterator&lt;/code&gt; to &lt;code&gt;Stream&lt;/code&gt; and count strings.&lt;/p&gt;
&lt;p&gt;The Streams API introduced in Java 8 makes it a lot easier to implement parallel processing. The API does a lot of complex low level processing itself.&lt;/p&gt;</description><author>Studiofreya SSG Site</author><pubDate>Thu, 22 Oct 2015 09:51:16 GMT</pubDate><guid isPermaLink="true">https://studiofreya.org/java/java-parallel-streams-api/</guid></item><item><title>Querying AD Groups with PowerShell</title><link>https://daniellittle.dev/querying-ad-groups-with-powershell</link><description>Getting the list of the AD groups if nice and easy in PowerShell. All the CmdLets are located in the  module which you might not have…</description><author>Daniel Little Dev</author><pubDate>Thu, 22 Oct 2015 05:33:15 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/querying-ad-groups-with-powershell</guid></item><item><title>Indonesia travel bookmarks</title><link>https://xenodium.com/indonesia-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q%3Dborobudur%2Bindonesia&amp;amp;t%3Dffab&amp;amp;iax%3D1&amp;amp;ia%3Dimages"&gt;Borobudur&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://backpackalmanac.com/2018/05/14/hiking-padar-island-in-komodo-national-park-indonesia/"&gt;Hiking Padar Island in Komodo National Park (Indonesia) | The Backpack Almanac&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Rumah_Gadang"&gt;Rumah Gadang&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 22 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/indonesia-travel-bookmarks</guid></item><item><title>Malaysia travel bookmarks</title><link>https://xenodium.com/malaysia-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.tripadvisor.co.uk/Restaurant_Review-g298570-d1164708-Reviews-Coliseum_Cafe-Kuala_Lumpur_Wilayah_Persekutuan.html"&gt;Coliseum Cafe, Kuala Lupur&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://migrationology.com/kek-lok-si-temple-penang/"&gt;How to Visit Penang's Kek Lok Si Temple (and What to Eat)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 22 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/malaysia-travel-bookmarks</guid></item><item><title>Mongolia travel bookmarks</title><link>https://xenodium.com/mongolia-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/mongolia/travel-tips-and-articles/beyond-the-dunes-road-tripping-mongolias-gobi-desert"&gt;Beyond the dunes: road-tripping Mongolia's Gobi Desert&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/archpics/status/881270695614967808"&gt;Terra cotta warriors at Mount Khan, Inner Mongolia&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 22 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/mongolia-travel-bookmarks</guid></item><item><title>Running bookmarks</title><link>https://xenodium.com/running-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://forums.runnersworld.co.uk/discussion/164225/10k-in-under-50-mins"&gt;10k in under 50 mins — Runner's World UK Forum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dcrainmaker.com/2015/11/garmin-fr230-fr235-review.html"&gt;Garmin Forerunner 230 &amp;amp; 235 In-Depth Review (DC Rainmaker)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://barefootrunning.fas.harvard.edu/6FAQ.html"&gt;Harvard's Running barefoot or in minimal footwear FAQ&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://therunningbug.com/fitness/tips-and-advice/how-to-run-a-sub-50-10k-race"&gt;How to run a sub-50 10K - The Running Bug&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.npr.org/sections/13.7/2016/09/14/493803246/is-running-good-or-bad-for-your-health"&gt;Is Running Good Or Bad For Your Health?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.chaser.me.uk"&gt;Mornington Chasers running club&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://entries.opentrack.run/"&gt;Open track: Race Management System&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ironrosey.com/blog-posts/review-newton-gravity-iv-motion-iv/"&gt;Review : Newton Gravity IV &amp;amp; Motion IV | Ramblings of an IronRose&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theraceorganiser.com/listed-races/"&gt;The Race Organiser&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.time-to-run.com/training/10k/sub50.htm"&gt;Training towards a sub 50 minute 10K&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 22 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/running-bookmarks</guid></item><item><title>Media player bookmarks</title><link>https://xenodium.com/media-player-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cmus.github.io"&gt;cmus, a small, fast and powerful console music player for Unix-like OS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mps-youtube/mps-youtube"&gt;mps-youtube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mpv.io/"&gt;mpv (a fork of mplayer2 and MPlayer)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sandilands.info/sgordon/multimedia-on-linux-command-line"&gt;Multimedia on Linux Command Line: wget, PdfTK, ffmpeg, flac, SoX&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plex.tv/"&gt;PLEX&lt;/a&gt; (stream your media everywhere).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item"&gt;Soul – A language and IDE for audio coding &lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 22 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/media-player-bookmarks</guid></item><item><title>Tabletop Bookshelf</title><link>https://june.kim/tabletop-bookshelf/</link><author>june.kim</author><pubDate>Thu, 22 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/tabletop-bookshelf/</guid></item><item><title>Links - October 22, 2015</title><link>https://faingezicht.com/links/2015/10/22/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 22 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/22/links/</guid></item><item><title>The Adventures of Van Helsing (#blogtober 21)</title><link>https://rjp.is/blogging/posts/the-adventures-of-van-helsing-blogtober-21-2/</link><description>Abysmal. Awful. Arse. Atrocious.
I&amp;rsquo;m beginning to associate cut scenes and voice acting with games that should be put into the bin before they&amp;rsquo;re even made.
Also - picking 1440x480 as my screen resolution and only offering 1366x768 as the best option (&amp;ldquo;This change will take effect when the game restarts&amp;rdquo;) is a guaranteed deletion. Sorry chaps, you got one chance and you blew it.</description><author>infrequent oscillations</author><pubDate>Wed, 21 Oct 2015 22:07:44 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/the-adventures-of-van-helsing-blogtober-21-2/</guid></item><item><title>Kyoto travel bookmarks</title><link>https://xenodium.com/kyoto-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.everintransit.com/nishiki-market-tour-kyoto/"&gt;Eating My Way Through Nishiki Market, Kyoto | Ever In Transit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Fushimi_Inari-taisha"&gt;Fushimi Inari Temple&lt;/a&gt;: 4KM mountain trail lined with bright orange shinto gates.&lt;/li&gt;
&lt;li&gt;Golden Pavillion (macha and biscuits at tea house).&lt;/li&gt;
&lt;li&gt;Hakone (day trip for hot baths), see Yuryo spa. Also the pirate boat.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.aaronwilliamson.com/old_web/travel/japan/kibune/kibune.htm"&gt;Kibune&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Kinkaku-ji"&gt;Kinkakuji Temple&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Kiyomizu-dera"&gt;Kiyomizu Temple&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Kuramadera Temple &amp;amp; Kibune Shrine: More peaceful shrine.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.insidekyoto.com/kyoto-itineraries"&gt;Kyoto itineraries&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/document/d/1bQb4GeiTElx0Gsv84wTDQlOVrbkqwTChSnMPMzrCcr4/edit?authkey%3DCJPtzocJ&amp;amp;hl%3Den_US&amp;amp;authkey%3DCJPtzocJ"&gt;Kyoto travel tips (doc)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kyotoguide.com/ver2/walking/walking-top.html"&gt;Kyoto walking maps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Kyoto's train station itself.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Nij%C5%8D_Castle"&gt;Nijo-Jo’&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Nishiki Market: Awesome market. Some say better than Tsukiji.&lt;/li&gt;
&lt;li&gt;Origami master and school &lt;a href="http://www.orizurusalon-yume.com"&gt;http://www.orizurusalon-yume.com&lt;/a&gt; info@orizurusalon-yume.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.orizurusalon-yume.com/"&gt;orizurusalon yume (origami)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Ryokan (&amp;quot;kaiseki&amp;quot; meals).&lt;/li&gt;
&lt;li&gt;Ryōan-ji (竜安寺).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Sanj%C5%ABsangen-d%C5%8D"&gt;Sanjusangendo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://globalhelpswap.com/things-to-do-in-kyoto-japan/"&gt;Things to do in Kyoto, Japan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://maps.google.com/maps/ms?msid%3D202789377275033201812.00049d620c1fcd8fb451e&amp;amp;msa%3D0&amp;amp;ll%3D35.019734,135.756168&amp;amp;spn%3D0.093628,0.181789"&gt;Walking courses (Google maps)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.waraido.com/walking/gion.html"&gt;WaRaiDo Nighttime tour&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 21 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/kyoto-travel-bookmarks</guid></item><item><title>Links - October 21, 2015</title><link>https://faingezicht.com/links/2015/10/21/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 21 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/21/links/</guid></item><item><title>Programming Arduino Uno (ATmega386P) in assembly</title><link>https://gist.github.com/mhitza/8a4608f4dfdec20d3879</link><description>After reading various sources on the topic I've written notes, and a sample project, to illustrate a working setup for the task. Also tried to go a little more in depth in certain parts, to clear up some confusion I've dealt with when researching the topic.</description><author>personal code attic</author><pubDate>Wed, 21 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://gist.github.com/mhitza/8a4608f4dfdec20d3879</guid></item><item><title>Naissancee (#blogtober 20)</title><link>https://rjp.is/blogging/posts/naisancee-blogtober-20-2/</link><description>Naissancee is lovely in a style sense but since I&amp;rsquo;ve already lost the tutorial droid within the first 5 minutes, got stuck in a room I can&amp;rsquo;t get out of without dying -and- being returned to a point two steps before a level load, I&amp;rsquo;m not going to bother playing it any more. Just enjoy the pictures.</description><author>infrequent oscillations</author><pubDate>Tue, 20 Oct 2015 21:51:59 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/naisancee-blogtober-20-2/</guid></item><item><title>Links - October 20, 2015</title><link>https://faingezicht.com/links/2015/10/20/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 20 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/20/links/</guid></item><item><title>Crawl (#blogtober 19)</title><link>https://rjp.is/blogging/posts/crawl-blogtober-19-2/</link><description>I -think- Crawl is some kind of retro-styled take on Dark Souls but &amp;hellip; I didn&amp;rsquo;t really have much of a clue what was going on. Maybe with more reading of instructions and tips it would make sense.
Everyone worships Teok, right?
Pretty sure I&amp;rsquo;ve just had my innards tenderised here.
It does have a nifty death animation.
And then there&amp;rsquo;s something about upgrading monsters based on how much wrath you have?</description><author>infrequent oscillations</author><pubDate>Mon, 19 Oct 2015 21:11:10 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/crawl-blogtober-19-2/</guid></item><item><title>The Leftovers: Season 2</title><link>https://olshansky.info/tv/the_leftovers_season_2/</link><description>Olshansky's review of The Leftovers: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 19 Oct 2015 19:33:10 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_leftovers_season_2/</guid></item><item><title>Links - October 19, 2015</title><link>https://faingezicht.com/links/2015/10/19/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 19 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/19/links/</guid></item><item><title>RocketsRocketsRockets (#blogtober 18)</title><link>https://rjp.is/blogging/posts/rocketsrocketsrockets-blogtober-18-2/</link><description>The visuals are nice but it zooms in and out like a pumping weasel is at the controls and seriously - if I&amp;rsquo;m a rocket ship, left means &amp;ldquo;turn left&amp;rdquo;, it NEVER means &amp;ldquo;fly left&amp;rdquo;. Shame, really, because the visuals are lovely.</description><author>infrequent oscillations</author><pubDate>Sun, 18 Oct 2015 20:42:36 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/rocketsrocketsrockets-blogtober-18-2/</guid></item><item><title>Writings Reborn</title><link>https://urda.com/blog/2015/10/18/writings-reborn</link><description>After a long hiatus, Writings of Urda returns!</description><author>Writings of Urda</author><pubDate>Sun, 18 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://urda.com/blog/2015/10/18/writings-reborn</guid></item><item><title>Capsule (#blogtober 17)</title><link>https://rjp.is/blogging/posts/capsule-blogtober-17-2/</link><description>Capsule might be a contender for peak game of #blogtober. Atmosphere (literally), tension, and an actual story conveyed by recovered emails rather than garish cutscenes, uncanny valley facial animation, and terrible dialog.
You have to get your capsule to the next waypoint without running out of oxygen or power because bad things happen when you run out of either.
Your only help is a sonar ping that will (slowly) identify what&amp;rsquo;s around you.</description><author>infrequent oscillations</author><pubDate>Sat, 17 Oct 2015 21:29:00 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/capsule-blogtober-17-2/</guid></item><item><title>How I build, deploy, and run Spark</title><link>https://manuel.kiessling.net/2015/10/17/how-i-build-deploy-and-run-spark/</link><description>I’m currently tinkering with Spark for my side project JourneyMonitor. The goal is to extract useful metrics from the Selenium runs executed by the platform.  To do so, I’m currently in the process of creating a new Analyze component. I want to build the Spark setup and the jobs using Scala 2.11. Therefore, I had to compile my own version of Spark 1.5.1, put it onto the systems, and run a cluster from that.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Sat, 17 Oct 2015 18:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2015/10/17/how-i-build-deploy-and-run-spark/</guid></item><item><title>Get Emacs to gather links in posts</title><link>https://xenodium.com/get-emacs-to-gather-links-in-posts</link><description>&lt;p&gt;Comments in posts can be a great source of recommendations. Here's a way to extract post links using Emacs and &lt;a href="http://github.com/zweifisch/enlive"&gt;enlive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/get-emacs-to-gather-urls-in-posts/emacs-enlive-url-fetch.gif" /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(require 'enlive) ;; https://github.com/zweifisch/enlive
(require 'org)

(defun ar/input-clipboard-url-or-prompt ()
  &amp;quot;Return a URL from clipboard or prompt user for one.&amp;quot;
  (let* ((clipboard (current-kill 0))
         (url (if (string-match &amp;quot;^https?://&amp;quot; clipboard)
                  clipboard
                (read-string &amp;quot;URL: &amp;quot;))))
    (unless (string-match &amp;quot;^https?://&amp;quot; url)
      (error &amp;quot;Not a URL&amp;quot;))
    url))

(defun ar/url-fetch-anchor-elements (url)
  &amp;quot;Fetch anchor elements in URL as list of alist:
\((title . \&amp;quot;my title\&amp;quot;)
 (url . \&amp;quot;http://some.location.com\&amp;quot;)).&amp;quot;
  (let ((elements (enlive-query-all (enlive-fetch url) [a])))
    (mapcar (lambda (element)
              `((title . ,(enlive-text element))
                (url . ,(enlive-attr element 'href))))
            elements)))

(defun ar/url-view-links-at ()
  &amp;quot;View external links in HTML from prompted URL or clipboard.&amp;quot;
  (interactive)
  (with-current-buffer (get-buffer-create &amp;quot;*links*&amp;quot;)
    (org-mode)
    (view-mode -1)
    (erase-buffer)
    (mapc (lambda (anchor)
            (let-alist anchor
              (when (and .url (string-match &amp;quot;^http&amp;quot; .url))
                (insert (org-make-link-string .url
                                              .title) &amp;quot;\n&amp;quot;))))
          (ar/url-fetch-anchor-elements
           (ar/input-clipboard-url-or-prompt)))
    (delete-duplicate-lines (point-min) (point-max))
    (goto-char (point-min))
    (toggle-truncate-lines +1)
    (view-mode +1)
(switch-to-buffer (current-buffer))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;UPDATE(2019-04-13): Refreshed post with latest code from my &lt;a href="https://github.com/xenodium/dotsies/blob/9cf32157c5fec140218898dfcb11e74f623fec6c/emacs/ar/ar-url.el#L35"&gt;init&lt;/a&gt;. Thanks to &lt;a href="https://twitter.com/sjig"&gt;Gĳs&lt;/a&gt; for pinging.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 17 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/get-emacs-to-gather-links-in-posts</guid></item><item><title>Grounding, part 3: Longer explanations</title><link>http://dimitarsimeonov.com/2015/10/17/grounding-part-3-longer-explanations</link><description>&lt;p&gt;No matter how good we are at explaining, we cannot &lt;em&gt;directly&lt;/em&gt; ground
all concepts for everybody.&lt;/p&gt;

&lt;p&gt;In a video interview, Richard Feynman explained how he thinks about
physics.  One question asked him to explain how electro-magnetic
forces work.  He explained that they exist in the form they do.  There
is &lt;em&gt;no simpler explanation&lt;/em&gt; to the electro-magnetic forces than that,
he said.&lt;/p&gt;

&lt;p&gt;Can we say electro-magnetic forces worked like an everyday object? He
gives a counter example. Both magnetic forces and rubber bands can
attract things together.  He argues that such explanation is more
confusing than helpful.  That rubber bands depend on electro-magnetic
forces to stay together and attract.  But these forces are exactly the
things we were trying to understand in the first place. We are back
where we started from.  We have created a vicious circle of reasoning,
and we trying to step on top of our head.&lt;/p&gt;

&lt;p&gt;A circular explanation never reaches solid ground, and is
ineffective in explaining the purpose.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/wMFPe-DwULM?t=6m2s"&gt;https://youtu.be/wMFPe-DwULM?t=6m2s&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we want to help the other person understand we can take a
detour. Instead of giving a direct answer, we can teach them solid
physics and mathematics first. Once they have understood the basics,
we can introduce the concept.&lt;/p&gt;

&lt;p&gt;Without science foundation, the other side has &lt;em&gt;no common ground&lt;/em&gt;
with the nature of magnetism. Any explanation would be futile, or
even worse - misleading and backfiring in the future.  It is up to us
to find out what they know or don’t know already that can relate to
the idea and use it to explain it.  We need to adjust our message, and
in the case when there is no common ground… we have to build it.&lt;/p&gt;

&lt;p&gt;We can only keep a handful of things in our working memory at a time.
This limits which things we can explain without the other side losing
interest. Still, keeping them interested along the way, makes our job
of explaining so much more interesting. We still need to use clear and
non-misleading examples and logic. But we also need to provide
incentives for other person to put the effort.&lt;/p&gt;

&lt;p&gt;For concepts like this, taking shortcuts in explanation will make them
appear magical. There will always be a hole their comprehension. It is
inevitable that we will need to cover this hole with a
trust-me-this-is-how-it-works. We can gradually fill parts of the hole
with clear, grounded explanation. But we need to be careful not to
create a lot of small and hard to fill holes.&lt;/p&gt;</description><author>D13V</author><pubDate>Sat, 17 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2015/10/17/grounding-part-3-longer-explanations</guid></item><item><title>Persistent Login (the "remember me" checkbox)</title><link>https://www.databasesandlife.com/persistent-login/</link><description>&lt;p class="intro"&gt;It is a requirement of many customer projects of mine to have a "remember me" or "keep me logged in" checkbox on the log-in form. I am not aware of any standard approach to the subject; I suspect every company invents their own (and then blogs about it?) Here's what I do when asked to implement this feature, as online on &lt;a href="https://art.world"&gt;art.world&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here are the requirements as I see them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users should be able to use the &amp;ldquo;remember me&amp;rdquo; function from one computer (e.g. home) but not from others (e.g. internet cafe)&lt;/li&gt;
&lt;li&gt;Users should be able to use the &amp;ldquo;remember me&amp;rdquo; function from as many computers as they like (e.g. home, their phone, ..)&lt;/li&gt;
&lt;li&gt;Typing the user name, password and &amp;ldquo;remember me&amp;rdquo; should remember only this user name and password; thus, if they change their password using another computer, this &amp;ldquo;remember me&amp;rdquo; should stop working.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are some thoughts on various options:&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Sat, 17 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/persistent-login/</guid></item><item><title>Human Resource Machine (#blogtober 16)</title><link>https://rjp.is/blogging/posts/human-resource-machine-blogtober-16-2/</link><description>TL;DR: GLORIOUS. Buy it now. Even if you don&amp;rsquo;t like the game, Tomorrow Corporation deserve all the money they can get to keep making lovely sweet games for ME.
I&amp;rsquo;m more than reasonably sure this is going to be Peak Game for #blogtober. After the surprising depth of Little Inferno, Human Resource Machine was a no-brainer pre-order and here it is.
I think the third one bears a striking resemblance to my current form.</description><author>infrequent oscillations</author><pubDate>Sat, 17 Oct 2015 00:05:18 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/human-resource-machine-blogtober-16-2/</guid></item><item><title>Continuous Integration for Lua with Travis</title><link>https://blog.separateconcerns.com/2015-03-08-travis-lua.html</link><description>&lt;p&gt;&lt;a href="https://travis-ci.org"&gt;Travis&lt;/a&gt; is a Continuous Integration service which is free for Open Source projects and has very good GitHub integration. We will see how to use it for your Lua projects.&lt;/p&gt;
&lt;p&gt;Your test suite will work well with Travis as long as executing it returns 0 on success and nonzero on failure. If you use plain Lua assertions, it is already the case. If you use a test framework, make sure that it works that way. I have added &lt;a href="https://github.com/catwell/cwtest#exit"&gt;a helper&lt;/a&gt; to cwtest for that purpose.&lt;/p&gt;
&lt;p&gt;Travis does not support Lua out of the box, but using it with Lua projects is not hard because &lt;a href="https://github.com/moteus"&gt;moteus&lt;/a&gt; has done all the hard work for you. You just have to clone &lt;a href="https://github.com/moteus/lua-travis-example"&gt;this repository&lt;/a&gt; and copy the &lt;code&gt;.travis&lt;/code&gt; directory to yours.&lt;/p&gt;
&lt;p&gt;After that, you only have to write a single YAML file, &lt;code&gt;.travis.yml&lt;/code&gt;. For example, here is &lt;a href="https://github.com/catwell/haricot/blob/2d5320633c76f14f12c0d8486606de4b9d95c015/.travis.yml"&gt;the one I wrote for Haricot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Most sections should be self-explanatory. &lt;code&gt;install&lt;/code&gt; is where you set up your dependencies. The first line calls moteus’ script which lets you use Lua and LuaRocks. A separate build and test run will occur for every Lua version declared in &lt;code&gt;matrix&lt;/code&gt;; you can comment some lines there if you do not want to test some Lua versions. For Haricot I need &lt;a href="http://kr.github.io/beanstalkd/"&gt;Beanstalk&lt;/a&gt; running in the background so I start it in &lt;code&gt;before_script&lt;/code&gt;. &lt;code&gt;script&lt;/code&gt; is where you run your actual tests.&lt;/p&gt;
&lt;p&gt;To enable Travis, sign up, allow Travis to access your GitHub account, then go to &lt;a href="https://travis-ci.org/profile"&gt;your profile&lt;/a&gt; and flip the switch for your repository:&lt;/p&gt;
&lt;p&gt;&lt;img alt="travis" src="img/travis.png" /&gt;&lt;/p&gt;
&lt;p&gt;After that, commit &lt;code&gt;.travis&lt;/code&gt; and &lt;code&gt;.travis.yml&lt;/code&gt; and push to GitHub. It will trigger a test build, and so will every subsequent commit. If you want, you can now add &lt;a href="https://travis-ci.org/catwell/haricot.png?branch=master"&gt;a badge&lt;/a&gt; with the status of your build to your README or your project’s home page.&lt;/p&gt;</description><author>Separate Concerns</author><pubDate>Fri, 16 Oct 2015 17:30:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2015-03-08-travis-lua.html</guid></item><item><title>OS X Finder Woes</title><link>https://bastibe.de/2015-10-16-finder-woes.html</link><description>&lt;p&gt;&lt;img alt="Mac" src="http://bastibe.de/static/2015-10/Mac.png" /&gt;&lt;/p&gt;
&lt;p&gt;The Mac. It used to be the most streamlined, thought-through general computing device on the market.&lt;/p&gt;
&lt;p&gt;Even it's file management used to be top-notch. There were many cool little touches. One particularly useful feature was the &lt;em&gt;Proxy Icon&lt;/em&gt;--if a window displayed a file's content, that file's icon would show up in the window's title. And you could drag that icon directly onto a thumb drive or email, without having to use the Finder. But the Finder, too, had many neat little features. I loved the fact that when you renamed a file in an alphabetically sorted file list, Finder would not immediately re-shuffle it to its new location, but would wait half a second before doing so. When renaming multiple files, this was really useful, since you could go through them one by one and rename them, simply by pressing arrow keys and return.&lt;/p&gt;
&lt;p&gt;But as you might have guessed from my use of the past tense, these golden days are gone. The Finder used to know a JPEG from a ZIP regardless of file extension. Now it doesn't any more. The Proxy Icon is still draggable, but it will create an alias instead of a copy--perfectly useless on a thumb drive or in an email.&lt;/p&gt;
&lt;p&gt;And with the newest version of OS X, El Capitan, they finally blew it for me. Before, even though the Finder inexplicably never had the ability to cut and paste files, you could always install programs like &lt;a href="http://totalfinder.binaryage.com/"&gt;TotalFinder&lt;/a&gt; to fix that. Not so with El Capitan. The Finder now is holy land, and can not be touched any more by third parties. So no more cut and paste, no more un-hiding system files. No more side-by-side Finder tabs. And brand new with El Capitan as well: No more waiting after renaming. Now, when you rename a file, it is immediately re-sorted to its new position, thus making renaming multiple files terribly inconvenient.&lt;/p&gt;
&lt;p&gt;So, good bye OS X. I updated my work laptop first, and I regret it. I never regretted an OS X update before. My home machine is not going to get the update. It is honestly sad to see my once-beloved Mac platform becoming worse and worse and worse with every new release.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Fri, 16 Oct 2015 12:51:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2015-10-16-finder-woes.html</guid></item><item><title>UX toolbox bookmarks</title><link>https://xenodium.com/ux-toolbox-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://affinity.serif.com/en-gb/ui-design-software/"&gt;Affinity Designer: the perfect tool for UI and UX design&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://affinity.serif.com/en-us/publisher/"&gt;Affinity Publisher – Professional Desktop Publishing Software&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=lWz9G95ITuk&amp;amp;feature=youtu.be&amp;amp;utm_source=designernews"&gt;Build a static site with Material Design Lite&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eye-dropper.kepi.cz/"&gt;Eye dropper Chrome extension (pick colors in browser)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coolors.co/1a181b-5d4d66-703d89-9e2bd8-a304f2"&gt;Generate - Coolors.co&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17869229"&gt;Google, but for colors (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodesign.dev/"&gt;Nodesign.dev | Design less develop more.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.paintcodeapp.com"&gt;PaintCode - Turn your drawings into Objective-C or Swift drawing code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://paletton.com/#uid=30n190kr6u-blKMk5ypvBoeFHhn"&gt;Paletton - The Color Scheme Designer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.myfonts.com/WhatTheFont/"&gt;WhatTheFont! (find out font names)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 16 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/ux-toolbox-bookmarks</guid></item><item><title>My talk at Percona Live 2015</title><link>https://nicolaiarocci.com/my-talk-at-percona-live-2015/</link><description>&lt;p&gt;The slides of my talk at Percona Live 2015 (Amsterdam) are &lt;a href="https://speakerdeck.com/nicola/mongodb-and-rest-apis-a-match-made-in-heaven"&gt;online&lt;/a&gt;. It was titled “MongoDB and REST APIs a Match Made in Heaven” and it was meant as an introduction to Mongo, REST principles and the Eve python framework.&lt;/p&gt;
&lt;p&gt;Overall it has been a pleasant experience, although I found that splitting 300 attendees through seven concurrent tracks ultimately led to too much fragmentation. People often found themselves with 2-3 interesting talks all happening simultaneously, and just had to pick one.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Fri, 16 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/my-talk-at-percona-live-2015/</guid></item><item><title>A Virus Named Tom (#blogtober 15)</title><link>https://rjp.is/blogging/posts/a-virus-named-tom-blogtober-15-2/</link><description>Remember Pipe Mania? Well, A Virus Named Tom is basically a tarted up Pipe Mania with a plot.
See? Plot.
I&amp;rsquo;m stuck here because all the &amp;ldquo;encrypted&amp;rdquo; (aka &amp;ldquo;hidden&amp;rdquo;) tiles are straight pieces and I can&amp;rsquo;t figure out how everything connects up. Plus the rotation of the pieces is done by dragging the little robot around the border and trust me, that gets pretty old pretty damned fast as a control mechanic.</description><author>infrequent oscillations</author><pubDate>Thu, 15 Oct 2015 22:28:41 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/a-virus-named-tom-blogtober-15-2/</guid></item><item><title>Forget fablabs and makerspaces! Who ELSE is promoting Digital DIY in Europe?</title><link>https://stop.zona-m.net/2015/10/forget-fablabs-and-makerspaces-who-else-is-promoting-digital-diy-in-europe/</link><description>&lt;figure&gt;
  &lt;img alt="Forget fablabs and makerspaces! Who ELSE is promoting Digital DIY in Europe? /img/didiy-logo.png" src="https://stop.zona-m.net//img/didiy-logo.png" width="100%" /&gt;
&lt;/figure&gt;
&lt;figure&gt;
  &lt;img alt="Forget fablabs and makerspaces! Who ELSE is promoting Digital DIY in Europe? /img/didiy-logo.png" src="https://stop.zona-m.net//img/didiy-logo.png" width="100%" /&gt;
&lt;/figure&gt;
&lt;p&gt;As some of you may already know, these days I also work in the &lt;a href="http://www.didiy.eu"&gt;H2020 research project &amp;ldquo;Digital DIY&amp;rdquo;&lt;/a&gt;, a world of which 3D printing is only the &lt;em&gt;most fashionable part&lt;/em&gt;, but not the biggest, nor the most important. Among other things, right now we&amp;rsquo;d need to know something that is pretty hard to discover without _local (meaning: &lt;strong&gt;yours&lt;/strong&gt;!) _assistance, because it is &amp;ldquo;hidden&amp;rdquo; behind many different languages and layers of burocratic structures and inertia:&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 15 Oct 2015 13:11:21 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/10/forget-fablabs-and-makerspaces-who-else-is-promoting-digital-diy-in-europe/</guid></item><item><title>Zippered Pouch</title><link>https://june.kim/zippered-clutch/</link><author>june.kim</author><pubDate>Thu, 15 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/zippered-clutch/</guid></item><item><title>Links - October 15, 2015</title><link>https://faingezicht.com/links/2015/10/15/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 15 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/15/links/</guid></item><item><title>The Intelligent Investor</title><link>https://olshansky.info/book/the_intelligent_investor/</link><description>Olshansky's review of The Intelligent Investor by Benjamin Graham</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 15 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/the_intelligent_investor/</guid></item><item><title>Monitoring with Bosun</title><link>https://www.brightball.com/articles/monitoring-with-bosun</link><description>Bosun is a monitoring and alerting system developed by the good folks at Stack Exchange, then open sourced for the rest of us. It’s written in Go, meaning its monitoring agents can run anywhere that Go can drop a binary… which is just about everywhere. So what exactly does it do and how does it compare to the likes of New Relic, CloudWatch, Nagios, Splunk Cloud, Server Density, and other monitoring tools?</description><author>Brightball Articles</author><pubDate>Thu, 15 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/monitoring-with-bosun</guid></item><item><title>Dustforce (#blogtober 14)</title><link>https://rjp.is/blogging/posts/dustforce-blogtober-14-2/</link><description>You have to sweep up leaves. Sadly without actually using your brush - a simple run through is sufficient to magically displace them into a nether dimension.
The jumping and controls are horribly floaty and syrupy and laggy and ugh.
AND it not only doesn&amp;rsquo;t have controller support by default, it let me accidentally assign the same joypad button (&amp;ldquo;pad0_dir2&amp;rdquo; is also a tremendously horribly label) to two different directions.</description><author>infrequent oscillations</author><pubDate>Thu, 15 Oct 2015 00:40:01 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/dustforce-blogtober-14-2/</guid></item><item><title>Links - October 14, 2015</title><link>https://faingezicht.com/links/2015/10/14/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 14 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/14/links/</guid></item><item><title>NextPlayer: A Node.js module for managing player turns</title><link>https://thomashunter.name/posts/2015-10-14-nextplayer-a-node-js-module-for-managing-player-turns</link><author>Thomas Hunter II</author><pubDate>Wed, 14 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2015-10-14-nextplayer-a-node-js-module-for-managing-player-turns</guid></item><item><title>Torchlight (#blogtober 13)</title><link>https://rjp.is/blogging/posts/torchlight-blogtober-13-2/</link><description>A hacky-slashy adventure RPG - kinda like Geneforge but with 90% of the budget spent on 3D modelling and voice actors instead of plot and story.
Although it does have a rudimentary plot.
It does look awfully pretty - but I can see myself playing Geneforge in preference to this just because it&amp;rsquo;s much more satisfying than this melange of mishmash.</description><author>infrequent oscillations</author><pubDate>Wed, 14 Oct 2015 00:50:36 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/torchlight-blogtober-13-2/</guid></item><item><title>Python Fabric</title><link>https://www.danielcorin.com/posts/2015/2015-10-13-python-fabric/</link><description>Python Fabric</description><author>Thought Eddies</author><pubDate>Tue, 13 Oct 2015 10:26:00 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2015/2015-10-13-python-fabric/</guid></item><item><title>My Dream Editor</title><link>https://david.coffee/my-dream-editor/</link><description>&lt;p&gt;Today, let&amp;rsquo;s talk about editors. Why? Because currently there are more editors than anything else. Microsoft decided to launch an editor, github decided to launch an editor - heck, even facebook suddenly invests into editors. We have closed source ones, open source ones, big full powered IDEs and of course the old school family.&lt;/p&gt;
&lt;p&gt;The good thing, I actually like playing with editors. Sometimes I feel like just opening a new tool and test it out. Because of that I discovered SublimeText from NetBeans / PHPStorm. Because of that I also switched from SublimeText to VIM and later back to intellij. I love to constantly improve my workflow and find new ways to get even more productive.&lt;/p&gt;
&lt;p&gt;The annoying thing about testing editors is that well, once you hit VIM you are pretty much in a dead end. From then on each and every editor &lt;strong&gt;has&lt;/strong&gt; to have VIM keybindings. If it doesn&amp;rsquo;t, you can&amp;rsquo;t use it. Naturally I spent a ton of time with VIM - the best vim emulation out there. SublimeText and Atom just couldn&amp;rsquo;t cut it. They add a good amount of sugar into the mix, sugar I really like - but their VIM plugins are just not good enough (yet). So I kept going my way with vim, carefully tweaking my good old &lt;code&gt;.vimrc&lt;/code&gt; as days come by.&lt;/p&gt;
&lt;p&gt;To my big surprise, the editor that won me by storm wasn&amp;rsquo;t vim and it wasn&amp;rsquo;t neovim either. It was something that made me drop my beloved .vimrc without hesitation, something I thought I would never even touch - emacs. Yeah, emacs made me drop all other editors in the year 2015. Ridiculous, right? So what&amp;rsquo;s going on?&lt;/p&gt;
&lt;h1 id="enter-spacemacs"&gt;Enter spacemacs&lt;/h1&gt;
&lt;p&gt;
&lt;img alt="spacemacs" class="img-fluid" src="./spacemacs-python.png" /&gt;

&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/syl20bnr/spacemacs/"&gt;spacemacs&lt;/a&gt; is an amazing pre-configured emacs made for people like me! VIM users!. It uses the power of evil, the arguably best VIM emulation out there and builds a layer of highly productive keybindings on top. Here&amp;rsquo;s how it works:&lt;/p&gt;
&lt;p&gt;In spacemacs, each command is triggered by the spacebar and follows a very innovative mnemonic. &lt;code&gt;spc&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; for example is showing you actions on the current buffer. &lt;code&gt;spc&lt;/code&gt; and &lt;code&gt;p&lt;/code&gt; executes project commands.&lt;/p&gt;
&lt;p&gt;The really cool thing though comes from it&amp;rsquo;s layer system. spacemacs has a ton of &lt;a href="https://github.com/syl20bnr/spacemacs/tree/master/layers"&gt;contributed layers&lt;/a&gt; that &lt;em&gt;just work&lt;/em&gt;. For example without researching anything, I just enabled the react layer and suddenly I had full jsx support, highlighting, linting with eslint and a ton of keybindings! Just like that! Why? Because someone who actually uses react implemented it this way, the way it should be done.&lt;/p&gt;
&lt;p&gt;So many &lt;em&gt;strong&lt;/em&gt; editors give me a ton plugins and what not without actually knowing the ecosystem of the target language / framework just for the sake of supporting as many things as possible.&lt;/p&gt;
&lt;p&gt;And &lt;em&gt;if&lt;/em&gt; the plugin is superb, then the base of the editor is usually weak. Look at VIM: We have so many cool plugins but most of them are a big ugly hack in vimscript that works so-so. Emacs on the other hand is hackable in every little corner. It provides a powerful scripting language in form of &lt;code&gt;elisp&lt;/code&gt; and has a very active community around it.&lt;/p&gt;
&lt;p&gt;I would even argue that most of the layers that ship &lt;strong&gt;with&lt;/strong&gt; spacemacs out of the box are a good amount better than what I hacked together inside my .vimrc.&lt;/p&gt;
&lt;p&gt;I was so impressed by it that I decided to &lt;a href="https://github.com/dvcrn/sublimious"&gt;port parts of it to sublimetext&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My lovestory with spacemacs begins. Where were you all my life, you beauty of an editor?&lt;/p&gt;
&lt;h1 id="what-else"&gt;What else?&lt;/h1&gt;
&lt;p&gt;Here&amp;rsquo;s my &amp;lsquo;mini ranking&amp;rsquo; of editors I like:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/syl20bnr/spacemacs/"&gt;spacemacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/idea/"&gt;intellij&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;vim&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sublimetext.com/"&gt;sublimetext&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://atom.io/"&gt;atom&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><author>David Mohl</author><pubDate>Tue, 13 Oct 2015 10:05:17 GMT</pubDate><guid isPermaLink="true">https://david.coffee/my-dream-editor/</guid></item><item><title>Not My First Post</title><link>https://faingezicht.com/articles/2015/10/13/not-first-post/</link><description>Today, out of curiosity I went back to &lt;a href="http://avc.com/2003/09/my_first_post/"&gt;the first post&lt;/a&gt; in the archive of Fred Wilson's AVC. I was surprised by the terseness, and the simplicity.

Maybe that's all I need to start writing more. Lowering the bar I set for myself. If Fred could do it, way back in September 2003, why shouldn't I?

&gt; I read blogs a lot. And i think they are great. So i am starting a blog. I have no idea if i’ll write a lot in my blog or rarely. I hope its a lot, because i have a lot to say. But we’ll see about that.
&gt;
&gt; -Fred Wilson

Seems like he did have a lot to say. Wilson is one of my favorite bloggers. I read him daily, making his closing statement particularly entertaining in hindsight.

Another inspiring case is Benedict Evans, who five years ago was getting only &lt;a href="http://ben-evans.com/benedictevans/2015/9/14/distribution-and-audience"&gt;~200 monthly page views&lt;/a&gt; and now gets hundreds of thousands of hits per month. However, his strategy was very different: his first posts are in-depth analytical essays, just like the ones he posts in 2015.

I'll aim in between, and settle if I can get even a tenth of their audience.</description><author>Avy Faingezicht</author><pubDate>Tue, 13 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/articles/2015/10/13/not-first-post/</guid></item><item><title>Links - October 13th, 2015</title><link>https://faingezicht.com/links/2015/10/13/links/</link><description>It's not that there were no interesting things to read on the internet this past week, its that I was lazy and have not posted them. 

Here's another catchup post.</description><author>Avy Faingezicht</author><pubDate>Tue, 13 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/13/links/</guid></item><item><title>spacewΛr</title><link>https://mattkeeter.com/projects/spacewar</link><description>Lasers!  Video games!  Hardware!</description><author>Matt Keeter</author><pubDate>Tue, 13 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/projects/spacewar</guid></item><item><title>Heroes by Adam Grant</title><link>https://ho.dges.online/words/commonplace/heroes-by-adam-grant/</link><description>&lt;blockquote&gt;
&lt;p&gt;My childhood hero was Superman. Now, I try not to put people on pedestals – everyone has their Kryptonite. Instead of seeing my role models as heroes, I admire them for specific virtues they exemplify.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Adam Grant&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description><author>ho.dges.online</author><pubDate>Tue, 13 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/heroes-by-adam-grant/</guid></item><item><title>Mirror Moon (blogtober #12)</title><link>https://rjp.is/blogging/posts/mirror-moon-blogtober-12-2/</link><description>Baffling space exploratory puzzle something something.
Possibly the tiniest minimalist title screen yet.
Looking a bit like a low rent NES-inspired Elite Dangerous here.
That&amp;rsquo;s quickly dispelled once you arrive on the first planet.
Except I can&amp;rsquo;t really say anything about the next few screenshots since it&amp;rsquo;s probably spoilery. (I will say that I had to resort to walkthroughs because they do a bloody awful job of letting you know what you&amp;rsquo;re supposed to be doing.</description><author>infrequent oscillations</author><pubDate>Mon, 12 Oct 2015 23:32:54 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/mirror-moon-blogtober-12-2/</guid></item><item><title>How to use Java varargs</title><link>https://studiofreya.org/java/how-to-use-java-varargs/</link><description>&lt;p&gt;The three dots in a method parameter type is a feature called &lt;strong&gt;Java varargs&lt;/strong&gt;. It was introduced in Java 5 and is formally known as variable arity methods or variadic functions.&lt;/p&gt;
&lt;div id="toc-np-container"&gt;
  &lt;p id="toc-np-title"&gt;
    Contents
  &lt;/p&gt;
  &lt;ul class="no-bullets"&gt;
    &lt;li class="header-level-1"&gt;
      &lt;a href="https://studiofreya.com/java/how-to-use-java-varargs/#What-is-varargs"&gt;&lt;span class="toc-np-number"&gt;1&lt;/span&gt;What is varargs&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-1"&gt;
      &lt;a href="https://studiofreya.com/java/how-to-use-java-varargs/#Varargs-parameter-order"&gt;&lt;span class="toc-np-number"&gt;2&lt;/span&gt;Varargs parameter order&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-1"&gt;
      &lt;a href="https://studiofreya.com/java/how-to-use-java-varargs/#Use-varargs-cautiously"&gt;&lt;span class="toc-np-number"&gt;3&lt;/span&gt;Use varargs cautiously&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-2"&gt;
      &lt;a href="https://studiofreya.com/java/how-to-use-java-varargs/#Type-checking"&gt;&lt;span class="toc-np-number"&gt;3.1&lt;/span&gt;Type-checking&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-2"&gt;
      &lt;a href="https://studiofreya.com/java/how-to-use-java-varargs/#Extra-allocations"&gt;&lt;span class="toc-np-number"&gt;3.2&lt;/span&gt;Extra allocations&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-2"&gt;
      &lt;a href="https://studiofreya.com/java/how-to-use-java-varargs/#Unexpected-behavior"&gt;&lt;span class="toc-np-number"&gt;3.3&lt;/span&gt;Unexpected behavior&lt;/a&gt;
    &lt;/li&gt;
    &lt;li class="header-level-1"&gt;
      &lt;a href="https://studiofreya.com/java/how-to-use-java-varargs/#When-to-use-varargs"&gt;&lt;span class="toc-np-number"&gt;4&lt;/span&gt;When to use varargs&lt;/a&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="what-is-varargs"&gt;&lt;span id="What-is-varargs"&gt;What is varargs&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Varargs methods accept zero or more arguments (args) of a given type. Such methods can have a variable number of arguments and thus useful for passing of dynamic data.&lt;/p&gt;</description><author>Studiofreya SSG Site</author><pubDate>Mon, 12 Oct 2015 22:30:44 GMT</pubDate><guid isPermaLink="true">https://studiofreya.org/java/how-to-use-java-varargs/</guid></item><item><title>The Future of Web Dev - React, Falcor, and ES6</title><link>http://engineering.widen.com/blog/future-of-the-web-react-falcor</link><description>The future of web application development looks a bit different than what we are all used to. I'll show you how to build a simple full-stack JavaScript app using Node.js on the backend, React on the frontend, Webpack for client-side module support, and Netflix's Falcor as an efficient and intuitive alternative to the traditional REST API.</description><author>Train of Thought</author><pubDate>Mon, 12 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">http://engineering.widen.com/blog/future-of-the-web-react-falcor</guid></item><item><title>How to get better at software development?</title><link>https://captnemo.in/blog/2015/10/12/get-better-at-software-development/</link><description>&lt;p&gt;I often get a lot of queries from people asking me about how to get started with software development, and how to get better at it. My replies are almost reaching stock-level worthy of copy-paste now, so I thought I might as well write about it publicly.&lt;/p&gt;

&lt;p&gt;What follows is a list of advice I’d give to any person who wants to write software for a living. A lot of it might apply across professions, and a lot of it is tailored to students in universtities. Not everything might apply in your case, YMMV. Take everything with a pinch of salt. Feedback is welcome.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;h3 id="join-a-community"&gt;Join a community.&lt;/h3&gt;
    &lt;p&gt;Highly preferable if its an IRL (In-real-life) community rather than just a chatroom somewhere, but even those are preferable over nothing. Communities have this shared sense of learning, that you don’t enjoy anywhere else. Passive learning is something I talk a lot about, and it only happens because of chance interactions that happen in communities. Even online communities work fairly well, and by online communities I mean places like StackOverflow, AskUbuntu, ServerFault, HackerNews, subreddits etc.
If you don’t have a physical community near you that you can join, maybe its time to start one?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id="contribute-to-open-source-projects"&gt;Contribute to Open Source projects&lt;/h3&gt;
    &lt;p&gt;It doesn’t have to be with your code, or even a large project. Even small javascript npm modules that you might think can be improved deserve some Pull Request love.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id="write-all-code-publicly"&gt;Write all code publicly&lt;/h3&gt;
    &lt;p&gt;Your code not being public should be the exception, not the norm. I’ve found putting almost all my code on github fairly liberating. I keep all my OS configuration and a lot of other things on github.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id="do-tech-talks"&gt;Do tech talks&lt;/h3&gt;
    &lt;p&gt;It doesn’t have to be at a big-name conference, but maybe at a small meetup around you. Good conferences will sponsor your tickets, and as a plus, you get to attend all the talks at that conference for free. Just make sure that you actually &lt;em&gt;do know&lt;/em&gt; what you’re talking about, unlike a lot of talks that happen.
The level of knowledge expected of a speaker is far more, and as a result if you are the one talking about something, you need to get better at it and understand it better, which is a great way of forcing yourself to learn something.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id="stay-updated"&gt;Stay Updated&lt;/h3&gt;
    &lt;p&gt;Reading Hacker News is a fairly certain way of making sure of that. A person doing PHP development should be aware of things like Composer, HHVM, and perhaps the upcoming changes in PHP7 (They’re awesome). As a technologist, part of our job is to stay updated with trends (no matter how insane the JS framework wars sound). The code you will be writing 5 years from now will be in an entirely different framework than what you are using today. This doesn’t mean that you should start learning the ins and outs of every JS framework, but rather that you should be tangentially aware of developments happening in the space. (For eg, following stable updates of Rails even though you are not a Rails developer).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id="learn-more-languages"&gt;Learn more languages&lt;/h3&gt;
    &lt;p&gt;I am a proud polyglot, and I very often realize that knowing more than one language changes your style and more importantly your thinking process significantly. For eg, a Ruby programmer will be fairly comfortable with the idea of metaprogramming compared to a PHP developer, and even more so when it might come to DSL (Domain Specific Languages). Similarly, knowing Haskell or Functional Programming in general teaches you a lot of things that you might re-use back in your JavaScript world.   &lt;br /&gt;
This doesn’t happen unless you know more than one language. Moreoever, its always helpful to have JavaScript as your second language (if you are looking for one), because of its monopoly in front-end development. A lot of technologies (like CORS/JSONP) just don’t make sense unless you understand JavaScript.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id="concepts-matter"&gt;Concepts Matter&lt;/h3&gt;
    &lt;p&gt;I was asking people about good interview questions, and one that I really liked was “How do you write an HTTP server using sockets?”. A lot of developers are stuck in this moat of “programming = software development”. And you can’t get over that unless you start thinking in terms of concepts. This is not me trying to get people to become Architecture Astronauts, but me trying to get people to understand how things work.
I’ve interviewed people who have no idea about how HTTP works, and in my opinion you can’t really be a web developer without knowing HTTP. A fairly good filter for good web developers is whether they know the ins-and-outs of HTTP. And HTTP is not a programming challenge, but rather a conceptual problem.
Similarly, if you work in the frontend, and you don’t know what the Same Origin Policy is, I am not gonna hire you. (“Is it implemented on the browser or the server?” is a another good question). The point I’m trying to make is that you need to get a layer above your language’s standard library and understand how things work. Learning ActiveRecord is awesome, but do you understand how it works?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id="ship-products"&gt;Ship Products&lt;/h3&gt;
    &lt;p&gt;Doesn’t matter if they are small, or made in a hackathon. As long as its shipped, we’re cool. If its not, come back when you’ve shipped it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id="have-side-projects"&gt;Have side projects&lt;/h3&gt;
    &lt;p&gt;This is slightly harder to do, but far more rewarding. Make sure that your side-project is not something you &lt;em&gt;expect&lt;/em&gt; to make money out of, and that it has a fairly reasonable scope. Side projects are an excellent breeding ground for you to try out new technologies, and play around with new languages. Its a really good breakaway from work-things as well, on top of that.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id="read-technical-books"&gt;Read technical books&lt;/h3&gt;
    &lt;p&gt;As a start, I’d recommend everything that codinghorror has suggested &lt;a href="https://blog.codinghorror.com/recommended-reading-for-developers/"&gt;here&lt;/a&gt; and &lt;a href="https://blog.codinghorror.com/programmers-dont-read-books-but-you-should/"&gt;here&lt;/a&gt;. There are a lot of good books listed on hackershelf.com as well. My personal favorite is &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0321965515"&gt;Don’t Make Me Think&lt;/a&gt;, which is a book on Web Usability and something I think every developer and designer should be forced to read.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Thanks&lt;/strong&gt; to &lt;a href="https://shashankmehta.in"&gt;Shashank Mehta&lt;/a&gt; for discussing these ideas
with me and helping me frame this post.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Mon, 12 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/10/12/get-better-at-software-development/</guid></item><item><title>Titan Attacks (#blogtober 11)</title><link>https://rjp.is/blogging/posts/titan-attacks-blogtober-11-2/</link><description>Basically a fancy Space Invaders with upgradable weapons and savable hostages a la Defender.
They&amp;rsquo;re confused. Points win prizes, not perfection. Silly aliens.</description><author>infrequent oscillations</author><pubDate>Sun, 11 Oct 2015 18:56:33 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/titan-attacks-blogtober-11-2/</guid></item><item><title>A new blog</title><link>https://david.coffee/a-new-blog/</link><description>&lt;p&gt;I decided to create another simple blog based on jekyll next to my &lt;a href="https://medium.com/@davidmohl"&gt;medium one&lt;/a&gt;. Why? let me explain.&lt;/p&gt;
&lt;p&gt;Medium is an amazing platform for &lt;strong&gt;writing&lt;/strong&gt;. That&amp;rsquo;s what works really damn good on it. But writing doesn&amp;rsquo;t equal blog. Medium is a magazine - a collection of articles and columns from individual writers. When you see a post about &amp;lsquo;How to set up php&amp;rsquo; with a big editorial picture and a ton of quotes, don&amp;rsquo;t you also think that it kind of feels&amp;hellip; out of place?&lt;/p&gt;
&lt;p&gt;Medium will be the place where I&amp;rsquo;ll write thought through stuff. Stuff that could go into a magazine. On jekyll (here) on the other hand, I can write anything that is somehow tech related:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some guide for a new technology? Here.&lt;/li&gt;
&lt;li&gt;A article on how to work productively? Medium.&lt;/li&gt;
&lt;li&gt;A post on workflow thoughts? Medium.&lt;/li&gt;
&lt;li&gt;Code snippets how to set up one of my projects? Here.&lt;/li&gt;
&lt;li&gt;My thoughts on a certain technology? Here.&lt;/li&gt;
&lt;li&gt;Common mistakes companies make? Medium.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;hellip; you get the drill right? And in general, if you subscribe through RSS it doesn&amp;rsquo;t really matter where the articles come from.&lt;/p&gt;
&lt;p&gt;Now there&amp;rsquo;s just the problem that I really don&amp;rsquo;t blog much in general&amp;hellip;&lt;/p&gt;</description><author>David Mohl</author><pubDate>Sun, 11 Oct 2015 14:39:46 GMT</pubDate><guid isPermaLink="true">https://david.coffee/a-new-blog/</guid></item><item><title>The Floor Is Jelly (blogtober #10)</title><link>https://rjp.is/blogging/posts/the-floor-is-jelly-blogtober-10-2/</link><description>Puts me in mind of a weird cross between the creature innards levels of Loco Roco and Bugaboo The Flea.
Simple - just bounce your way around the jelly floors to reach the curtains (or lift, later.)
This is a cute level - to reach the curtains, you need to properly trampoline yourself with good timing to get a super jump. Just in case the player hasn&amp;rsquo;t realised this is possible, the little frog on the right is demonstrating.</description><author>infrequent oscillations</author><pubDate>Sun, 11 Oct 2015 00:19:24 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/the-floor-is-jelly-blogtober-10-2/</guid></item><item><title>final bits from fOSSa 2015, from Open Education to Ecology</title><link>https://stop.zona-m.net/2015/10/final-bits-from-fossa-2015-open-education-ecology/</link><description>&lt;p&gt;fOSSa 2015 was such a great conference that I and Wouter Tebbens already wrote four other posts about it (see below). Here are the last bits that are worth sharing but did not fit elsewhere.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sat, 10 Oct 2015 16:48:56 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/10/final-bits-from-fossa-2015-open-education-ecology/</guid></item><item><title>Dope</title><link>https://olshansky.info/movie/dope/</link><description>Olshansky's review of Dope</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 10 Oct 2015 16:04:59 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/dope/</guid></item><item><title>Citizen cloud thoughts, after fOSSa 2015</title><link>https://stop.zona-m.net/2015/10/citizen-clouds-and-other-thoughts-from-fossa-2015/</link><description>&lt;p&gt;I had (at least) three big reasons to be at the &lt;a href="https://fossa.inria.fr/program/"&gt;fOSSa 2015 conference&lt;/a&gt;, a couple of weeks ago. Two already covered elsewhere and one, &lt;a href="https://fossa.inria.fr/session/citizen-clouds-towards-a-more-decentralized-internet/"&gt;&amp;ldquo;Citizen Cloud: Towards a more decentralized internet?&amp;quot;&lt;/a&gt;, that deserves its own separate post.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sat, 10 Oct 2015 12:13:12 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/10/citizen-clouds-and-other-thoughts-from-fossa-2015/</guid></item><item><title>C++ std::remove_if with lambda explained</title><link>https://studiofreya.org/cpp/std-remove_if-with-lambda/</link><description>&lt;p&gt;The programmer has the responsibility to remove or resize the elements from the actual container. The only exception is when remove and remove_if are members of a container, which is the case of &lt;a href="https://studiofreya.com/2010/03/31/stdlistremove_if-predicate/"&gt;std::list remove_if&lt;/a&gt;.&lt;/p&gt;</description><author>Studiofreya SSG Site</author><pubDate>Sat, 10 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://studiofreya.org/cpp/std-remove_if-with-lambda/</guid></item><item><title>National Sh**e Day by Half Man Half Biscuit</title><link>https://ho.dges.online/words/commonplace/national-she-day-by-half-man-half-biscuit/</link><description>&lt;p&gt;I try to put everything into perspective,&lt;br /&gt;
Set it against the scale of human suffering,&lt;br /&gt;
And I thought of the Mugabe government&lt;br /&gt;
And the children of the Calcutta railways.&lt;br /&gt;
This works for a while.&lt;br /&gt;
But then I encounter Primark FM&lt;br /&gt;
Overhead a rainbow appears.&lt;br /&gt;
In black and white.&lt;/p&gt;
&lt;p&gt;#theme/funny&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 10 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/national-she-day-by-half-man-half-biscuit/</guid></item><item><title>10 Minute Monitor Ambient Light</title><link>https://justingarrison.com/blog/2015-10-10-10-minute-monitor-ambient-light/</link><description>Ambient lights help with eye strain and glare from overhead lights. This is a simple light you can install</description><author>Justin Garrison's Homepage</author><pubDate>Sat, 10 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2015-10-10-10-minute-monitor-ambient-light/</guid></item><item><title>2015 Predictions</title><link>https://justingarrison.com/blog/2015-10-10-2015-predictions/</link><description>That’s right, I took “technology” out of the title. Why, because I didn’t want to limit myself. As before,</description><author>Justin Garrison's Homepage</author><pubDate>Sat, 10 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2015-10-10-2015-predictions/</guid></item><item><title>What It’s Like to Interview for Tech Jobs</title><link>https://justingarrison.com/blog/2015-10-10-what-it-s-like-to-interview-for-tech-jobs/</link><description>&lt;p&gt;Over the past year I have had great opportunities to interview for positions at companies I respect, and some I didn’t. I wanted to share my experiences to help others looking to go down this job path and some general interviewing tips.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;This post originally appeared on &lt;a href="http://1n73r.net/2014/05/26/interviewing-for-devopssresysadmin-positions/" rel="noopener" target="_blank"&gt;Justin Garrison’s blog&lt;/a&gt;
.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I’ve talked to quite a few companies, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google&lt;/li&gt;
&lt;li&gt;Twitter&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Oculus VR&lt;/li&gt;
&lt;li&gt;Disney Animation Studios&lt;/li&gt;
&lt;li&gt;Beats by Dre&lt;/li&gt;
&lt;li&gt;Tinder&lt;/li&gt;
&lt;li&gt;Digital Ocean&lt;/li&gt;
&lt;li&gt;DeviantArt&lt;/li&gt;
&lt;li&gt;Bass Pro&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each company was different in their approach to interviewing candidates. For most of the companies I didn’t make it past the screening call, but I got job offers from some. Most were for DevOps/Site Reliability Engineer (SRE) positions but for even those that weren’t, the interview process was similar enough to be relevant to my experience. Some companies sought me out, some I applied for, and some were through recruiters I had previously applied through who kept in touch with new opportunities. The companies that found me usually were via &lt;a href="https://www.linkedin.com/in/justingarrison" rel="noopener" target="_blank"&gt;LinkedIn&lt;/a&gt;
 or &lt;a href="http://github.com/rothgar" rel="noopener" target="_blank"&gt;GitHub&lt;/a&gt;
.&lt;/p&gt;</description><author>Justin Garrison's Homepage</author><pubDate>Sat, 10 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://justingarrison.com/blog/2015-10-10-what-it-s-like-to-interview-for-tech-jobs/</guid></item><item><title>Codebase Cop - A Slack Bot Watching Over Your Tickets</title><link>https://blog.tafkas.net/2015/10/10/codebase-cop-a-slack-bot-watching-over-your-tickets/</link><description>At Project-A we are using Codebase as a project management tool together with its version control. Just as with any other tools you can create tickets and organize them in sprints. Our usual (very simplified) workflow includes:
 Sprint planning for tickets Priotizing tickets Developer working on tickets Product managers verifying if the tickets were implemented as intended  Unfortunately, sometimes your backlog keeps growing and tickets are no longer valid, outdated or, in the worst case, just forgotten.</description><author>Tafkas Blog</author><pubDate>Sat, 10 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tafkas.net/2015/10/10/codebase-cop-a-slack-bot-watching-over-your-tickets/</guid></item><item><title>Spy Chameleon (#blogtober 9)</title><link>https://rjp.is/blogging/posts/spy-chameleon-blogtober-9-2-2/</link><description>The screenshots tell pretty much the whole story and I&amp;rsquo;ve got to get up early.
Enjoy.</description><author>infrequent oscillations</author><pubDate>Sat, 10 Oct 2015 00:30:52 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/spy-chameleon-blogtober-9-2-2/</guid></item><item><title>Rogue Engineers Behind Volkswagen Scandal? So what?</title><link>https://stop.zona-m.net/2015/10/rogue-engineers-behind-volkswagen-scandal-so-what/</link><description>&lt;p&gt;Some recent declarations from VW executives about the Volkswagen scandal are half unbelievable, half totally irrelevant. Seriously.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Fri, 09 Oct 2015 15:12:42 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/10/rogue-engineers-behind-volkswagen-scandal-so-what/</guid></item><item><title>Advanced Oracle Troubleshooting v2.5 (with 12c stuff too)</title><link>https://tanelpoder.com/2015/10/09/advanced-oracle-troubleshooting-v2-5-with-12c-stuff-too/</link><description>&lt;p&gt;It took a while (1.5 years since my last class – I’ve been busy!), but I am ready with my &lt;a href="https://tanelpoder.com/seminar/" target="_blank"&gt;Advanced Oracle Troubleshooting training&lt;/a&gt; (version 2.5) that has plenty of updates, including some more modern DB kernel tracing &amp;amp; ASH stuff and of course Oracle 12c topics!&lt;/p&gt;
&lt;p&gt;The online training will take place on &lt;strong&gt;16-20 November&lt;/strong&gt; &amp;amp; **14-18 December 2015 **(Part 1 and Part 2).&lt;/p&gt;
&lt;p&gt;The latest TOC is below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tanelpoder.com/files/AOT25_description.pdf" target="_blank"&gt;/files/AOT25_description.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Seminar registration details:&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Fri, 09 Oct 2015 10:58:08 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2015/10/09/advanced-oracle-troubleshooting-v2-5-with-12c-stuff-too/</guid></item><item><title>Travel blog bookmarks</title><link>https://xenodium.com/travel-blog-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://hiddentraveltreasures.com/"&gt;Hidden Travel Treasures&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://onestep4ward.com/"&gt;One Step 4Ward&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tigrest.com"&gt;Tigrest Travel Blog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 09 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/travel-blog-bookmarks</guid></item><item><title>How to connect your PSP on Linux</title><link>https://gist.github.com/mhitza/81651f49b3a43e6f4554</link><description>Common debugging steps you can try if it doesn't get automounted like it should.</description><author>personal code attic</author><pubDate>Fri, 09 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://gist.github.com/mhitza/81651f49b3a43e6f4554</guid></item><item><title>FEZ (#blogtober 8)</title><link>https://rjp.is/blogging/posts/fez-blogtober-8-2/</link><description>One of the big indies that I&amp;rsquo;ve somehow managed to avoid playing until now.
I wonder if she has any kerosene
Geezer has some cracking industrial strength drugs, it seems.
Um, Lament Configuration, anyone? &amp;ldquo;We have such cubes to show you.&amp;rdquo; &amp;ldquo;This will seem like a memory of 2D!&amp;rdquo; etc. etc.
Then the titular headwear arrives from the Lament giant Devil Square and Gomez can move 2D-wise through 3D. (It&amp;rsquo;ll make sense when you play the game.</description><author>infrequent oscillations</author><pubDate>Fri, 09 Oct 2015 00:52:12 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/fez-blogtober-8-2/</guid></item><item><title>Why I love compilers</title><link>https://bastian.rieck.me/blog/2015/why_i_love_compilers/</link><description>&lt;p&gt;Compilers are getting better and better at interpreting the stupid stuff
I throw at them. Every once in a while, I manage to surprise them and
myself by my stupidity. This time, for your pleasure, a minimum working
example—or rather a minimum non-working example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;namespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;list&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is what &lt;code&gt;clang++&lt;/code&gt; has to say about this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ clang++ --version
clang version 3.6.2 (tags/RELEASE_362/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
$ clang++ -std=c++11 uh-oh.cc
In file included from uh-oh.cc:3:
In file included from /usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/list:61:
In file included from /usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/bits/allocator.h:46:
In file included from /usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/x86_64-unknown-linux-gnu/bits/c++allocator.h:33:
In file included from /usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/ext/new_allocator.h:33:
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/new:111:7: error: 
      'operator new' cannot be declared inside a namespace
void* operator new(std::size_t) _GLIBCXX_THROW (std::bad_alloc)
      ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/new:113:7: error: 
      'operator new[]' cannot be declared inside a namespace
void* operator new[](std::size_t) _GLIBCXX_THROW (std::bad_alloc)
      ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/new:115:6: error: 
      'operator delete' cannot be declared inside a namespace
void operator delete(void*) _GLIBCXX_USE_NOEXCEPT
     ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/new:117:6: error: 
      'operator delete[]' cannot be declared inside a namespace
void operator delete[](void*) _GLIBCXX_USE_NOEXCEPT
     ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/new:119:7: error: 
      'operator new' cannot be declared inside a namespace
void* operator new(std::size_t, const std::nothrow_t&amp;amp;) _GLIBCXX_USE_NOEXCEPT
      ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/new:121:7: error: 
      'operator new[]' cannot be declared inside a namespace
void* operator new[](std::size_t, const std::nothrow_t&amp;amp;) _GLIBCXX_USE_NOEXCEPT
      ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/new:123:6: error: 
      'operator delete' cannot be declared inside a namespace
void operator delete(void*, const std::nothrow_t&amp;amp;) _GLIBCXX_USE_NOEXCEPT
     ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/new:125:6: error: 
      'operator delete[]' cannot be declared inside a namespace
void operator delete[](void*, const std::nothrow_t&amp;amp;) _GLIBCXX_USE_NOEXCEPT
     ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/new:129:14: error: 
      'operator new' cannot be declared inside a namespace
inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
             ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/new:131:14: error: 
      'operator new[]' cannot be declared inside a namespace
inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
             ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/new:135:13: error: 
      'operator delete' cannot be declared inside a namespace
inline void operator delete  (void*, void*) _GLIBCXX_USE_NOEXCEPT { }
            ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/new:136:13: error: 
      'operator delete[]' cannot be declared inside a namespace
inline void operator delete[](void*, void*) _GLIBCXX_USE_NOEXCEPT { }
            ^
uh-oh.cc:8:18: error: no matching constructor for initialization of
      'std::list&amp;lt;int&amp;gt;'
  std::list&amp;lt;int&amp;gt; l = {1,2,3,4};
                 ^   ~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/bits/stl_list.h:697:9: note: 
      candidate constructor template not viable: requires at most 3 arguments, but
      4 were provided
        list(_InputIterator __first, _InputIterator __last,
        ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/bits/stl_list.h:628:7: note: 
      candidate constructor not viable: requires at most 3 arguments, but 4 were
      provided
      list(size_type __n, const value_type&amp;amp; __value,
      ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/bits/stl_list.h:678:7: note: 
      candidate constructor not viable: requires at most 2 arguments, but 4 were
      provided
      list(initializer_list&amp;lt;value_type&amp;gt; __l,
      ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/bits/stl_list.h:604:7: note: 
      candidate constructor not viable: requires single argument '__a', but 4
      arguments were provided
      list(const allocator_type&amp;amp; __a) _GLIBCXX_NOEXCEPT
      ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/bits/stl_list.h:616:7: note: 
      candidate constructor not viable: requires single argument '__n', but 4
      arguments were provided
      list(size_type __n)
      ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/bits/stl_list.h:655:7: note: 
      candidate constructor not viable: requires single argument '__x', but 4
      arguments were provided
      list(const list&amp;amp; __x)
      ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/bits/stl_list.h:667:7: note: 
      candidate constructor not viable: requires single argument '__x', but 4
      arguments were provided
      list(list&amp;amp;&amp;amp; __x) noexcept
      ^
/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/bits/stl_list.h:593:7: note: 
      candidate constructor not viable: requires 0 arguments, but 4 were provided
      list()
      ^
13 errors generated.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Suddenly, everything appears to be broken. No initializer lists even
though C++11 is supported? What the what? Let us check what &lt;code&gt;g++&lt;/code&gt; has to
add:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ g++ --version
g++ (GCC) 5.2.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ -std=c++11 uh-oh.cc
In file included from /usr/include/c++/5.2.0/ext/new_allocator.h:33:0,
                 from /usr/include/c++/5.2.0/x86_64-unknown-linux-gnu/bits/c++allocator.h:33,
                 from /usr/include/c++/5.2.0/bits/allocator.h:46,
                 from /usr/include/c++/5.2.0/list:61,
                 from uh-oh.cc:3:
/usr/include/c++/5.2.0/new:112:41: error: ‘void* {anonymous}::operator new({anonymous}::std::size_t)’ may not be declared within a namespace
   __attribute__((__externally_visible__));
                                         ^
/usr/include/c++/5.2.0/new:114:41: error: ‘void* {anonymous}::operator new []({anonymous}::std::size_t)’ may not be declared within a namespace
   __attribute__((__externally_visible__));
                                         ^
/usr/include/c++/5.2.0/new:116:41: error: ‘void {anonymous}::operator delete(void* ’ may not be declared within a namespace
   __attribute__((__externally_visible__));
                                         ^
/usr/include/c++/5.2.0/new:118:41: error: ‘void {anonymous}::operator delete [](void*)’ may not be declared within a namespace
   __attribute__((__externally_visible__));
                                         ^
/usr/include/c++/5.2.0/new:120:41: error: ‘void* {anonymous}::operator new({anonymous}::std::size_t, const {anonymous}::std::nothrow_t&amp;amp;)’ may not be declared within a namespace
   __attribute__((__externally_visible__));
                                         ^
/usr/include/c++/5.2.0/new:122:41: error: ‘void* {anonymous}::operator new []({anonymous}::std::size_t, const {anonymous}::std::nothrow_t&amp;amp;)’ may not be declared within a namespace
   __attribute__((__externally_visible__));
                                         ^
/usr/include/c++/5.2.0/new:124:41: error: ‘void {anonymous}::operator delete(void*, const {anonymous}::std::nothrow_t&amp;amp;)’ may not be declared within a namespace
   __attribute__((__externally_visible__));
                                         ^
/usr/include/c++/5.2.0/new:126:41: error: ‘void {anonymous}::operator delete [](void*, const {anonymous}::std::nothrow_t&amp;amp;)’ may not be declared within a namespace
   __attribute__((__externally_visible__));
                                         ^
In file included from /usr/include/c++/5.2.0/bits/stl_algobase.h:59:0,
                 from /usr/include/c++/5.2.0/list:60,
                 from uh-oh.cc:3:
/usr/include/c++/5.2.0/new:129:51: error: ‘void* {anonymous}::operator new({anonymous}::std::size_t, void*)’ may not be declared within a namespace
 inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
                                                   ^
/usr/include/c++/5.2.0/new:131:53: error: ‘void* {anonymous}::operator new []({anonymous}::std::size_t, void*)’ may not be declared within a namespace
 inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
                                                     ^
/usr/include/c++/5.2.0/new:135:45: error: ‘void {anonymous}::operator delete(void*, void*)’ may not be declared within a namespace
 inline void operator delete  (void*, void*) _GLIBCXX_USE_NOEXCEPT { }
                                             ^
/usr/include/c++/5.2.0/new:136:45: error: ‘void {anonymous}::operator delete [](void*, void*)’ may not be declared within a namespace
 inline void operator delete[](void*, void*) _GLIBCXX_USE_NOEXCEPT { }
                                             ^
uh-oh.cc: In function ‘int main(int, char**)’:
uh-oh.cc:8:3: error: reference to ‘std’ is ambiguous
   std::list&amp;lt;int&amp;gt; l = {1,2,3,4};
   ^
&amp;lt;built-in&amp;gt;: note: candidates are: namespace std { }
In file included from /usr/include/c++/5.2.0/bits/stl_algobase.h:59:0,
                 from /usr/include/c++/5.2.0/list:60,
                 from uh-oh.cc:3:
/usr/include/c++/5.2.0/x86_64-unknown-linux-gnu/bits/c++config.h:195:1: note:                 namespace &amp;lt;unnamed&amp;gt;::std { }
 {
 ^
uh-oh.cc:8:13: error: expected primary-expression before ‘int’
   std::list&amp;lt;int&amp;gt; l = {1,2,3,4};
         ^
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Interesting. It seems to detect that including a named namespace in an
unnamed namespace was not the best idea. Of course, this is not what I
originally intended when I encountered this error for the first
time—I was rather stupidly including something that in turn
included an STL header.&lt;/p&gt;
&lt;p&gt;It is somewhat amazing to me that the simple addition of an anonymous
namespace results in such an amount of error messages. &lt;a href="http://codegolf.stackexchange.com/questions/1956/generate-the-longest-error-message-in-c"&gt;The folks at
StackExchange even had a contest for this sort of
thing&lt;/a&gt;.
Against their submissions, this problem very much pales in comparison.&lt;/p&gt;
&lt;p&gt;Happy programming—be smarter than me.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Thu, 08 Oct 2015 22:14:00 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/why_i_love_compilers/</guid></item><item><title>Change Emacs shell's CWD with helm projectile</title><link>https://xenodium.com/change-emacs-shells-cwd-with-helm-projectile</link><description>&lt;p&gt;If using Emacs shell and helm projectile, you can wire these up to quickly change your current working directory.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/change-emacs-shells-cwd-with-helm-projectile/change-cwd-with-helm-projectile.gif" /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(require 'helm-projectile)

(defun ar/shell-cd (dir-path)
&amp;quot;Like shell-pop--cd-to-cwd-shell, but without recentering.&amp;quot;
  (unless (string-equal mode-name &amp;quot;Shell&amp;quot;)
    (error &amp;quot;Not in Shell mode&amp;quot;))
  (message mode-name)
  (goto-char (point-max))
  (comint-kill-input)
  (insert (concat &amp;quot;cd &amp;quot; (shell-quote-argument dir-path)))
  (let ((comint-process-echoes t))
    (comint-send-input)))

(defun ar/helm-projectile-shell-cd ()
  &amp;quot;Change shell current working directory using helm projectile.&amp;quot;
  (interactive)
  (unless (string-equal mode-name &amp;quot;Shell&amp;quot;)
    (error &amp;quot;Not in Shell mode&amp;quot;))
  (let ((helm-dir-source (copy-tree  helm-source-projectile-directories-list)))
    (add-to-list 'helm-dir-source '(action . ar/shell-cd))
    (add-to-list 'helm-dir-source '(keymap . nil))
    (add-to-list 'helm-dir-source '(header-line . &amp;quot;cd to directory...&amp;quot;))
    (helm :sources helm-dir-source
          :buffer &amp;quot;*helm-dirs*&amp;quot;
          :candidate-number-limit 10000)))
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 08 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/change-emacs-shells-cwd-with-helm-projectile</guid></item><item><title>Sculpin for Github pages</title><link>https://gist.github.com/mhitza/189cdecacb93ecd83f29</link><description>Repository setup that I've used in the past for static blog publishing via Sculpin. Model inspired by Octopress in it's repository setup.</description><author>personal code attic</author><pubDate>Thu, 08 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://gist.github.com/mhitza/189cdecacb93ecd83f29</guid></item><item><title>The role of a Quality Engineer</title><link>https://stribny.name/posts/the-role-of-a-quality-engineer/</link><author>Posts by Petr Stribny</author><pubDate>Thu, 08 Oct 2015 00:03:39 GMT</pubDate><guid isPermaLink="true">https://stribny.name/posts/the-role-of-a-quality-engineer/</guid></item><item><title>HEAVY BULLETS (#blogtober 7)</title><link>https://rjp.is/blogging/posts/heavy-bullets-blogtober-7-2/</link><description>HEAVY BULLETS (or &amp;ldquo;superneonshootybang&amp;rdquo; as I&amp;rsquo;m now going to call it) is kinda DOOMy but with a twist - you have a revolver, 6 bullets, and the only reloads you get are when you retrieve the ones you&amp;rsquo;ve shot.
There&amp;rsquo;s some plot about something going horribly wrong, yada yada.
Amusingly, the graffiti seems to be from a random selection of anti-corporate &amp;amp; anti-rich slogans.
All the neon lushness makes me happy.</description><author>infrequent oscillations</author><pubDate>Wed, 07 Oct 2015 23:20:15 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/heavy-bullets-blogtober-7-2/</guid></item><item><title>Thermostat reset on Bosch WKD28350GB</title><link>https://xenodium.com/thermostat-reset-on-bosch-wkd28350gb</link><description>&lt;p&gt;My Bosch washer/dryer (WKD28350GB) stopped drying recently. Resetting the dryer's thermostat red breaker did the trick.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/thermostat-reset-on-bosch-wkd28350gb/WKD28350GB-01.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/thermostat-reset-on-bosch-wkd28350gb/WKD28350GB-02.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/thermostat-reset-on-bosch-wkd28350gb/WKD28350GB-03.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/thermostat-reset-on-bosch-wkd28350gb/WKD28350GB-04.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Edit: Similar post &lt;a href="https://www.diynot.com/diy/threads/bosch-wkd28350gb-washer-dryer-no-heat-when-drying.466138/"&gt;here&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 07 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/thermostat-reset-on-bosch-wkd28350gb</guid></item><item><title>Links - October 7th, 2015</title><link>https://faingezicht.com/links/2015/10/07/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 07 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/07/links/</guid></item><item><title>SAN Intro</title><link>https://smcleod.net/2015/10/san-intro/</link><description>&lt;div style="padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
        
        
      &lt;/div&gt;</description><author>smcleod.net</author><pubDate>Wed, 07 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/10/san-intro/</guid></item><item><title>Where’s the Fun in Skateboarding?</title><link>https://huphtur.nl/wheres-the-fun-in-skateboarding/</link><description>&lt;p&gt;Yesterday I enjoyed a great lunch with &lt;a href="http://byparra.com/"&gt;Parra&lt;/a&gt;, one of the guys behind &lt;a href="http://tiredskateboards.com/"&gt;Tired Skateboards&lt;/a&gt;. While reminiscing about our time skating together, he noted that kids nowadays don’t really understand “skateboard humor” anymore.&lt;/p&gt;
&lt;p&gt;The comments on this &lt;a href="http://theridechannel.com/features/2015/10/nyjah-huston-loses-street-league"&gt;tongue-in-cheek article&lt;/a&gt; about Nyjah Huston pretty much prove Parra’s theory. Fair to say we old guys miss &lt;a href="https://en.wikipedia.org/wiki/Big_Brother_%28magazine%29"&gt;Big Brother Magazine&lt;/a&gt;?&lt;/p&gt;</description><author>huphtur</author><pubDate>Wed, 07 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://huphtur.nl/wheres-the-fun-in-skateboarding/</guid></item><item><title>Point Perfect (#blogtober 6)</title><link>https://rjp.is/blogging/posts/point-perfect-blogtober-6-2/</link><description>Ever wanted to fly a mouse cursor into space? Defeat hordes of alien creatures in a series of mini-games? Can you drag-n-drop the alien scum into the bin of destiny?
Then Point Perfect is for you.
You get three rounds of silliness - lowest score ignored - and they all revolve around manipulating your mouse cursor spaceship.
You have no weapons - obvs, you&amp;rsquo;re flying a mouse cursor - and the only way to eliminate aliens is to highlight one (or more if you&amp;rsquo;re nimble) with your targeting skills and let the orbital laser take them out for you.</description><author>infrequent oscillations</author><pubDate>Wed, 07 Oct 2015 00:56:06 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/point-perfect-blogtober-6-2/</guid></item><item><title>How to extract images from a Word Document</title><link>https://www.swilliams.io/w/extract-images-from-word</link><description>&lt;p&gt;After Googling this question and being disappointed at how much work was needed to find a good answer, the only useful post was this old post&lt;sup&gt;&lt;a
            href="#fn-1"&gt;[1]&lt;/a&gt;&lt;/sup&gt; for Word 2007, here is a definitive blog post about the topic. This post assumes use of a Microsoft Word 2013 though the
    method would work on almost any word processor.&lt;/p&gt;
&lt;p&gt;The by far simplest method is to save the document as a webpage. This is done by choosing the correct file type when saving as a new file. This is done as
    normal when saving the file but choosing a different "save as type". Below is a screenshot of saving a document called "Example".&lt;/p&gt;
&lt;figure&gt;
    &lt;img src="savingAsWebPage.png" href="savingAsWebPage.png" alt="The save screen when saving the document." style="height:250px;width:500px;"&gt;
    &lt;figcaption&gt;The save screen when saving the document. Click to view full size.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Next, simply navigate to the folder where you saved the document as a webpage and you should find a new folder called "Example_files" alongside the new .htm
    file. Inside the folder will be every photo within the document in a .jpg format along with some meta data and other stuff you dont need to worry about.&lt;/p&gt;
&lt;p&gt;Hooray!&lt;/p&gt;
&lt;h2&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;a name="fn-1" href="https://cnedelcu.blogspot.com/2013/02/top-3-ways-to-extract-images-from-word-docx-doc-document.html"&gt;Link to older blog post on
            this subject.&lt;/a&gt; It goes into other methods including opening the .docx as a .zip and manually saving each image. However, these are much less time
        efficient.&lt;/li&gt;
&lt;/ol&gt;</description><author>SWilliams.io</author><pubDate>Tue, 06 Oct 2015 04:01:01 GMT</pubDate><guid isPermaLink="true">https://www.swilliams.io/w/extract-images-from-word</guid></item><item><title>The Organ Trail (blogtober #5)</title><link>https://rjp.is/blogging/posts/the-organ-trail-blogtober-5/</link><description>No prizes for guessing what game this is parodying&amp;hellip;
And the intro is pitch perfect.
Yes, he&amp;rsquo;s managed to break his arm driving a car down the road. Damn trails.
Once you&amp;rsquo;re passed the intro (and gunfighting with HORRIFYINGLY BAD CONTROLS), you get to visit some cities&amp;hellip;
And yes, you have to contend with zombies stupid pop culture green monsters who bite the living. Apart from that, it&amp;rsquo;s your bog-standard Oregon Trail-alike (with HORRIFYINGLY BAD SHOOTING CONTROLS.</description><author>infrequent oscillations</author><pubDate>Mon, 05 Oct 2015 19:55:33 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/the-organ-trail-blogtober-5/</guid></item><item><title>The Martian</title><link>https://olshansky.info/movie/the_martian/</link><description>Olshansky's review of The Martian</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 05 Oct 2015 19:11:51 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_martian/</guid></item><item><title>Javascript fetch node sample</title><link>https://xenodium.com/javascript-fetch-node-sample</link><description>&lt;p&gt;Playing with node and fetch:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.javascript"&gt;// Requisite: npm install node-fetch --save
// Save to fetch-demo.js
// Run: node fetch-demo.js

var fetch = require('node-fetch');

fetch(&amp;quot;http://xenodium.com/data/javascript-fetch-node-sample/message.json\n&amp;quot;, {
  method: 'GET',
  timeout: 5000
}).then(function(response) {
  return response.json();
}).then(function(response) {
  console.log('subject: ' + response.subject);
  console.log('body: ' + response.body);
}).catch(function(reason) {
  console.log(reason);
});
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 05 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/javascript-fetch-node-sample</guid></item><item><title>Links - October 5th, 2015</title><link>https://faingezicht.com/links/2015/10/05/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 05 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/05/links/</guid></item><item><title>Delighting In The Bride</title><link>http://evantravers.com/articles/2015/10/05/delighting-in-the-bride/</link><description>&lt;p&gt;&lt;img alt="dress" src="https://images.evantravers.com/articles/2015/10/dress.jpg" /&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;As for the saints in the land, they are the excellent ones, in whom is all my
delight.&lt;/p&gt;
&lt;p&gt;Psalm 16:3&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jesus, teach me to delight in the company and love of the brothers and sisters
I have in Your grace. You were killed by sinners, but it was You who executed
Your plan from before time to make a new people for Yourself, bringing all
nations and tongues under a single banner, the cross itself, once a symbol of
torture and Roman rule, now and forever an emblem of love and Your dominion
over death itself!&lt;/p&gt;
&lt;p&gt;Lord forgive me for my pride and arrogance. I have treated members of Your
precious bride as unlovely, when indeed it was I who have been unloving. I have
quibbled over words, looked down upon past behaviors, sneered at sin. Forgive
me Lord. The family of the church is beautiful and excellent because of Your
grace… and I will learn to celebrate Your goodness in every blood-washed soul.
Train my eyes to see the world as You see it… every man and woman in the scope
of eternity and your matchless grace covering all their life in Your perfect
righteousness.&lt;/p&gt;
&lt;p&gt;You look upon us with love, not because of who we are and what
we've done, but because of who You are and what You've done. I too must learn
to see this truth in those around me. Remove the logs from my eyes, keep me
from being speck-centered in my relationships. Help me to love unconditionally,
so that the world will see and know that I am a Your disciple. Above all else,
may I see every conversation and interaction as a service opportunity, to
glorify and serve You by serving those You love and died for. Thank You for
this challenge and truth. I love You Lord. I pray this in Your life-giving
name, amen.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Mon, 05 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2015/10/05/delighting-in-the-bride/</guid></item><item><title>Race The Sun (#blogtober 4)</title><link>https://rjp.is/blogging/posts/race-the-sun-blogtober-4-2/</link><description>Did you play 3D Deathchase as a child? But now you have a hankering after a thoroughly modern version to replicate that nauseating motion sickness?
Welcome to [Race The Sun].
Ok, that&amp;rsquo;s the title screen and looks nothing like 3D Deathchase. Once you get going, however, &amp;hellip;
You have to avoid the things and pick up the other things and there&amp;rsquo;s moving things and jumpy things and you just keep going until you splatter your intestines over something or the sun goes down.</description><author>infrequent oscillations</author><pubDate>Sun, 04 Oct 2015 18:55:46 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/race-the-sun-blogtober-4-2/</guid></item><item><title>Processing webhook events using Wishbone Part 1: Accept and validate</title><link>https://smetj.net/processing_webhooks_using_wishbone_part_1.html</link><description>&lt;p&gt;Many service providers offer &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Webhook"&gt;webhooks&lt;/a&gt; as a means to integrate their service
into another system.  Webhooks are basically a form of callbacks which can be
used to trigger functionality somewhere else.  In the case of webhooks this is
usually done by submitting some sort structured data like JSON into a …&lt;/p&gt;</description><author>Jelle Smet</author><pubDate>Sun, 04 Oct 2015 16:00:00 GMT</pubDate><guid isPermaLink="true">https://smetj.net/processing_webhooks_using_wishbone_part_1.html</guid></item><item><title>Forest Cloak</title><link>https://june.kim/forest-cloak/</link><author>june.kim</author><pubDate>Sun, 04 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/forest-cloak/</guid></item><item><title>Geneforge (#blogtober 3)</title><link>https://rjp.is/blogging/posts/geneforge-blogtober-3-2/</link><description>After reading the excellent blog of Jeff Vogel for many years, I eventually got around to buying The Geneforge Saga from GOG.
It&amp;rsquo;s a charmingly old-worlde rustic RPG from the days when graphics cards cost as much as a small van and CPUs were the size of a small van.
Fancy splash screen and astonishingly green menu screen for your edification.
Before you start, you have to do the obligatory &amp;ldquo;assign points to categories&amp;rdquo; character creation screen.</description><author>infrequent oscillations</author><pubDate>Sun, 04 Oct 2015 00:21:40 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/geneforge-blogtober-3-2/</guid></item><item><title>Changing File Creation Dates in OSX</title><link>https://bastibe.de/2015-10-03-changing-file-creation-dates.html</link><description>&lt;p&gt;On my last vacation, I have taken a bunch of pictures, and a bunch of video. The problem is, I hadn't used the video camera in a long time, and it believed that all it's videos were taken on the first of January 2012. So in order for the pictures to show up correctly in my picture library, I wanted to correct that.&lt;/p&gt;
&lt;p&gt;For images, this is relatively easy: Most picture libraries support some kind of bulk date changes, and there are a bunch of &lt;a href="http://www.sentex.net/~mwandel/jhead/"&gt;command&lt;/a&gt; &lt;a href="http://owl.phy.queensu.ca/~phil/exiftool/"&gt;line&lt;/a&gt; &lt;a href="http://www.exiv2.org/#util"&gt;utilities&lt;/a&gt; that can do it, too. But none of these tools work for video (exiftool claims be able to do that, but I couldn't get it to work).&lt;/p&gt;
&lt;p&gt;So instead, I went about to change the file creation date of the actual video files. And it turns out, this is surprisingly hard! The thing is, most Unix systems (a Mac is technically a Unix system) don't even know the concept of a file creation date. Thus, most Unix utilities, including most programming languages, don't know how to deal with that, either.&lt;/p&gt;
&lt;p&gt;If you have XCode installed, this will come with &lt;code&gt;SetFile&lt;/code&gt;, a command line utility that can change file creation dates. Note that &lt;code&gt;SetFile&lt;/code&gt; can change &lt;em&gt;either&lt;/em&gt; the file creation date, &lt;em&gt;or&lt;/em&gt; the file modification date, but not both at the same time, as any normal Unix utility would. Also note that &lt;code&gt;SetFile&lt;/code&gt; expects dates in American notation, which is about as nonsensical as date formats come.&lt;/p&gt;
&lt;p&gt;Anyway, here's a small Python script that changes the file creation date (but not the time) of a bunch of video files:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os.path&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;
&lt;span class="c1"&gt;# I want to change the dates on the files GOPR0246.MP4-GOPR0264.MP4&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;426&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;465&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GOPR0&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt;.MP4'&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# extract old date:&lt;/span&gt;
    &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromtimestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getctime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;# create a new date with the same time, but on 2015-08-22&lt;/span&gt;
    &lt;span class="n"&gt;new_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;minute&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# set the file creation date with the &amp;quot;-d&amp;quot; switch, which presumably stands for &amp;quot;dodification&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SetFile -d &amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot; &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%m/&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt;/%Y %H:%M:%S'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;# set the file modification date with the &amp;quot;-m&amp;quot; switch&lt;/span&gt;
    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SetFile -m &amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot; &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%m/&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt;/%Y %H:%M:%S'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><author>bastibe.de</author><pubDate>Sat, 03 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2015-10-03-changing-file-creation-dates.html</guid></item><item><title>Proprietary Software is an Unsafe Building Material</title><link>https://www.danstroot.com/posts/2015-10-03-proprietary-software-is-an-unsafe-building-material</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/volkswagen.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;At one point in time I worked for an organization that banned the use of open source software.  They were concerned that in the event of issues "there would be no support".  At the time they believed that commercial software from companies like IBM, Oracle, Microsoft and SAP was "safer" because there was a commercial entity that stood behind the products they sold and provided support. Now that's changing...&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2015-10-03-proprietary-software-is-an-unsafe-building-material"&gt;Proprietary Software is an Unsafe Building Material&lt;/a&gt; first appeared on &lt;a href="https://www.danstroot.com"&gt;Dan Stroot's Blog&lt;/a&gt;</description><author>Dan Stroot</author><pubDate>Sat, 03 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2015-10-03-proprietary-software-is-an-unsafe-building-material</guid></item><item><title>Seeding a sharing-economy or platform company</title><link>/2015/10/02/Seeding-a-sharing-economy-or-platform-company/</link><description>&lt;p&gt;These days if you&amp;rsquo;re creating a company you likely hope to accomplish more with less people, two ways of doing this fall to: The sharing economy and creating a platform. It&amp;rsquo;s easy to see the case for this when you have such &lt;a href="http://graphics.wsj.com/billion-dollar-club/"&gt;unicorns&lt;/a&gt; like AirBnB or Uber. The opportunity for each of those to compete against hotel chains or taxi services which each need to manage their own inventory is incredibly exciting and revolutionary. In a similar fashion platforms can offer much the same, Heroku&amp;rsquo;s platform and marketplace made it easier than ever for developers to click a button and get everything they needed years ago. It&amp;rsquo;s not just their code, it&amp;rsquo;s everything from &lt;a href="https://www.heroku.com/postgres"&gt;Postgres&lt;/a&gt; to Mongo to &lt;a href="https://elements.heroku.com/addons#logging"&gt;Logging&lt;/a&gt;. Or take the app store as example. Smart phones weren&amp;rsquo;t a new thing when the iPhone came out, but it was only the saviest of users that had apps installed on their windows smartphone or blackberry. The app store made the iPhone different than any other phone by allowing others to build and improve it, turning the iPhone not into a phone but a platform.&lt;/p&gt;
&lt;p&gt;Platforms and the sharing economy both let you get further than having to take on the costs of offering the equivilent all on your own. And while a great idea to venture into one of these two areas, starting them isn&amp;rsquo;t as trivial as simply deciding to. For both of these you have issues with having a two sided market, first you have to convince the providers to come along, then the customers or vice versa. As a result of this two sided market issue the easiest way to actually start is by bootstrapping it yourself – or faking it til you make it.&lt;/p&gt;
&lt;p&gt;What are some good examples of faking this? I&amp;rsquo;m sure you can probably find some good stories going back about AirBnB or Uber, but let&amp;rsquo;s assume times were different then. Let&amp;rsquo;s take a look at a very recent example: &lt;a href="http://techcrunch.com/2015/08/26/lugg-an-app-for-on-demand-short-distance-moves-raises-3-8-million/"&gt;Lugg&lt;/a&gt; which just launched in the latest batch of YC. Lugg is Uber for moving essentially, allowing you to on-demand request furniture moved from one place to another. Early on Lugg built their app, then waited for requests to come in, then the founders got in a truck and moved the furniture themselves. As a customer the founders are likely providing a great experience, without ever having to tip their hat at the ways their hacking the impression of being a large well oiled machine.&lt;/p&gt;
&lt;p&gt;But what about a platform? Slack continues to grow like wildfire as the new medium for communication. These days there&amp;rsquo;s endless integrations for slack, and I expect they&amp;rsquo;ll continue to expand what a platform for communication looks like. But a year ago they were quite a ways from having people show up at their door to add an integration. Sure there were people using them, but to expect github/trello/asana to immediately build an integration for every new flavor of the week tool would be crazy. Yet, without these integrations slack wouldn&amp;rsquo;t be nearly as useful as it is today–and probably wouldn&amp;rsquo;t have seen the growth it&amp;rsquo;s seen. In the early days of a platform the easiest way to get these integrations and partners in place is to show up and build the work yourself. Slack carried the weight early of building these integrations, much as Heroku add-ons showed up at partners offices and help write the code to get them as a provider in the marketplace. And while both Slack and Heroku are larger companies now, it still holds true for smaller ones starting today. &lt;a href="https://www.blockspring.com/"&gt;Blockspring&lt;/a&gt;, a company which aims to make web services available through spreadsheets, had to do very much the same thing building their initial integrations themselves. Now with their rapidly growing user base and already large collection of APIs they may be able to shift the model, but early on that wasn&amp;rsquo;t so much an option.&lt;/p&gt;
&lt;p&gt;If you want to build a platform, start by creating the impression of one while still carrying the load yourself. Yes, move to a true platform as soon as you can, but don&amp;rsquo;t wait for others to show up before you go that route.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Fri, 02 Oct 2015 23:55:56 GMT</pubDate><guid isPermaLink="true">/2015/10/02/Seeding-a-sharing-economy-or-platform-company/</guid></item><item><title>The Bridge (#blogtober 2)</title><link>https://rjp.is/blogging/posts/the-bridge-blogtober-2-2/</link><description>Day two brings The Bridge which brings the lovely charcoal sketch aesthetic to a world of Escher-like puzzles. There&amp;rsquo;s also a Braid-alike &amp;ldquo;turn back time&amp;rdquo; mechanic but I don&amp;rsquo;t know if it becomes relevant to later puzzles or is just a &amp;ldquo;BIG WHOOPSIE UNDO&amp;rdquo; button.
Our hero has fallen asleep under an apple tree. You can see where this is going&amp;hellip;
After a mini-tutorial on the controls (which also serves to wake him up), you trudge off to find his house.</description><author>infrequent oscillations</author><pubDate>Fri, 02 Oct 2015 23:43:01 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/the-bridge-blogtober-2-2/</guid></item><item><title>HTML5 Mobile Apps, Part 5: Ecosystem Opinions</title><link>https://thomashunter.name/posts/2015-10-02-what-i-learned-while-publishing-an-html5-mobile-app-part-55-ecosystem-opinions</link><author>Thomas Hunter II</author><pubDate>Fri, 02 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2015-10-02-what-i-learned-while-publishing-an-html5-mobile-app-part-55-ecosystem-opinions</guid></item><item><title>Grounding, part 2: For humans it means understanding</title><link>http://dimitarsimeonov.com/2015/10/02/grounding-part-2-for-humans-it-means-understanding</link><description>&lt;p&gt;In the previous part I talked about how I encountered &lt;em&gt;grounding&lt;/em&gt; for
the first time, as it relates to a robot, connecting the abstract to
the specific. Here, I’ll look more into how it relates to humans, and
how it helps with understanding.&lt;/p&gt;

&lt;p&gt;Grounding, the act of connecting the abstract to the specific, isn’t
a novel technique about how to transmit information, like for example
encoding morse-code in blinking.  Even if we talked to each other by blinking dots and dashes, instead of pronouncing sounds
with our mouths, we would still attempt to convey different ideas,
symbols and concepts.&lt;/p&gt;

&lt;p&gt;Grounding, actually, is a &lt;em&gt;step&lt;/em&gt; in the communication process which is
about transferring not just information, but also understanding.  To
ground your message means to encode it in terms that the other party
&lt;em&gt;understands&lt;/em&gt; and can relate to.  To make these concepts
understandable we need to ground them in the others’
previous knowledge of the world, by using their own language, and
giving examples that they can understand and relate to.&lt;/p&gt;

&lt;p&gt;Grounding is about the semantics of the communication, and not about
the mechanics.  When the person who hears us, or reads our words, or
perceives our art, when they not only register our words in their
ears, but also understands the essence and meaning of what we are
trying to say, only then we’ve actually reached them effectively, and
made them understand the point we were trying to convey.&lt;/p&gt;

&lt;p&gt;After college, I joined the software industry and started getting a
pretty decent salary.  I was suddenly in a deep sea of complexity,
bombarded by acronyms such as OPT, PTO, HSA, H1B, 401k, IRS, USCIS and
other “fun” things.  Previously, I was living in a somewhat blissful
ignorance of the real-life financial problems and decisions by living
in a constrained and organized academic environment, but as a newly
employed I had to take care of a lot of those nuisances.&lt;/p&gt;

&lt;p&gt;At some point I needed to understand what is 401k.  I had heard that
it is about retirement savings, but didn’t have much motivation and
incentive to learn about it and to contribute.  It seemed like
something I don’t need to worry about yet, and I could take care of it
later.  The “helping” materials from my first job targeted people who
understand the concept, probably through a previous job, and didn’t
include explanations of the simple definitions, leaving out the
“why”’s.  All the information about it was reaching me but I did not
understand what it meant.  The materials directly jumped to
recommendations and strategies, and I found myself utterly confused
and not sure where to start from.  Without grokking the basics, I felt
helpless with the more advanced terminology.&lt;/p&gt;

&lt;p&gt;Unable to connect any of the abstract terms from the materials to my
practical reality, I looked around for other explanations and started
watching Khan Academy videos on finance.  Each video lecture only took
about 10 minutes, and contained a specific imaginary example of a
person adding money to their 401k over time, and considering possible
withdrawal options, based on specific situations. Example situations
included emergencies, switching between different types of IRAs,
investment outcomes and discussed the differences between the types of
retirement investing account - traditional, Roth and 401k.  The
specific examples in each lecture made the terms much more clear,
because it built this imaginary world, similar to the one I live in.
Furthermore, the examples avoided legal jargon, and used words I could
understand.  Maybe they were a little bit less precise and complete
than reading the actual law, but communicated better, at least to a
novice mind like mine.  Watching these video lectures I gained a bunch
of confidence about these saving techniques which opened the
possibility for me to seek more information on the subject.  The
specific examples built a bridge of understanding that I could cross,
starting from the world I knew, to the abstract world of definitions.&lt;/p&gt;

&lt;p&gt;In the information channel above, the grounding is the step after
having transferred the data, and involves decoding the meaning.  It
happens on the receiver’s side, but if we as communicators don’t
present our data in a format that is &lt;strong&gt;easily understandable by the
other side&lt;/strong&gt;, then even if we successfully say our words and they
register the sounds correctly in their ears, they will still be
oblivious about the meaning that we are trying to convey.
Effectively, all our speech would be equivalent to a bumbling noise in
their ears. On the other hand, if we tailor our message to them, we
can help with their understanding.&lt;/p&gt;

&lt;p&gt;Thats also why grounding depends on &lt;strong&gt;who&lt;/strong&gt; we are trying to communicate
to.  There isn’t a single way to explain a concept which would make it
understood by everyone.  To communicate effectively we have to use
explanation and examples that &lt;strong&gt;both sides know and understand&lt;/strong&gt;, and
that really depends on who other side is.  Formulas and definitions
apt to explain basic physics laws to graduate students would not be
clear to preschoolers, and vise versa.  The preschoolers wouldn’t
understand the differential equations, while the graduate students
wouldn’t find the hand-wavy simplistic explanations clear enough to be
practical.&lt;/p&gt;

&lt;p&gt;For the geeks of us, part of the theory of why grounding works this
way is due to Snannon’s noisy channel theorem, which says that
the amount of communication in the channel in the best case is
proportional to the &lt;em&gt;mutual information between the two sides&lt;/em&gt;.  Using
that mutual information would make the other side understand better
the message.&lt;/p&gt;

&lt;p&gt;An interesting corollary is to &lt;strong&gt;avoid adding any information that they
don’t know&lt;/strong&gt;. Using fancy words when speaking to a person who doesn’t
know them would not help them understand the meaning better. Instead,
it will only stroke the speaker’s ego about how smart and
knowledgeable they are to use these words.  Any information that is
unknown to the other side will end up wasted as noise, until they can
understand it.&lt;/p&gt;

&lt;p&gt;In the next parts, I will dive in into more examples of using
grounding in tricky situations.&lt;/p&gt;</description><author>D13V</author><pubDate>Fri, 02 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2015/10/02/grounding-part-2-for-humans-it-means-understanding</guid></item><item><title>#blogtober</title><link>https://rjp.is/blogging/posts/dungeon-souls-2/</link><description>Or &amp;ldquo;let&amp;rsquo;s try #septemblog again&amp;rdquo;. For each day in #blogtober, I&amp;rsquo;m supposed to be playing one of my many unplayed games that I&amp;rsquo;ve accumulated through things like Humble Bundle.
First up is Dungeon Souls - a &amp;ldquo;2-D top-down hack n&amp;rsquo; slash/RPG game&amp;rdquo;. (Not sure why FRAPS isn&amp;rsquo;t capturing the full glory of the title screen there.)
Which is exactly what it says on the tin - you pick your bog-standard class of RPG adventurer,</description><author>infrequent oscillations</author><pubDate>Thu, 01 Oct 2015 23:50:42 GMT</pubDate><guid isPermaLink="true">https://rjp.is/blogging/posts/dungeon-souls-2/</guid></item><item><title>Snail organs, immunity, and ageing</title><link>https://liza.io/snail-organs-immunity-and-ageing/</link><description>&lt;p&gt;Organs! Immune systems! Old age! Dying from old age!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m super excited. I was thinking: &amp;ldquo;How do I implement old age and death, and health in general? Is health just energy? When the snail is out of energy, it dies? But that seems too simplistic.&amp;rdquo;&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 01 Oct 2015 15:54:41 GMT</pubDate><guid isPermaLink="true">https://liza.io/snail-organs-immunity-and-ageing/</guid></item><item><title>Extract dominant colors in images</title><link>https://xenodium.com/extract-dominant-colors-in-images</link><description>&lt;p&gt;There's a handy &lt;a href="https://news.ycombinator.com/item?id%3D10309441"&gt;HN post&lt;/a&gt; pointing to Javier López's &lt;a href="http://javier.io/blog/en/2015/09/30/using-imagemagick-and-kmeans-to-find-dominant-colors-in-images.html"&gt;Using imagemagick, awk and kmeans to find dominant colors in images&lt;/a&gt;. A comment also highlights &lt;a href="https://github.com/andrewgleave/color-extract"&gt;color-extract,&lt;/a&gt; written in Go.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 01 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/extract-dominant-colors-in-images</guid></item><item><title>Links - October 1st, 2015</title><link>https://faingezicht.com/links/2015/10/01/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 01 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/10/01/links/</guid></item><item><title>HTML5 Mobile Apps, Part 4: Live Operations</title><link>https://thomashunter.name/posts/2015-10-01-what-i-learned-while-publishing-an-html5-mobile-app-part-45-live-operations</link><author>Thomas Hunter II</author><pubDate>Thu, 01 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2015-10-01-what-i-learned-while-publishing-an-html5-mobile-app-part-45-live-operations</guid></item><item><title>Anvil: time for a change</title><link>https://zserge.com/posts/anvil-forge-merged/</link><description>Those of you who regularly check my blog may remember that I was going to redesign Anvil from scratch. Unfortunately, it was an unavoidable step. We had performance issues and it turned out that blindly copying modern web metaphors to Android doesn&amp;rsquo;t work well.
I am sorry, I had to change a lot of Anvil APIs since then. Those of you who have their apps written with Anvil 0.0.12 most likely would prefer to stick with the older version.</description><author>zserge's blog</author><pubDate>Thu, 01 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/anvil-forge-merged/</guid></item><item><title>[Computing] The Straight Line Principle</title><link>https://www.devever.net/~hl/straightline</link><description>&lt;p&gt;Which of the following psuedocode examples do you prefer?&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Thu, 01 Oct 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/straightline</guid></item><item><title>Links - September 30th, 2015</title><link>https://faingezicht.com/links/2015/09/30/links/</link><description>Today I discovered an amazing LinkedIn feature that I did not know existed. It is called "Connections In The News". 

With the subject "News about Aaron Dallek" sitting in my inbox, LinkedIn's email really intrigued me. Clicking through took me to a &lt;a href="http://well.blogs.nytimes.com/2015/09/29/take-an-eye-exam-on-your-laptop/"&gt;New York Times article about Opternative&lt;/a&gt;, the startup where I used to work, and where Aaron is CEO.  Quite simply, LinkedIn parsed Aaron's name from the piece, and notified me that one of my contacts was mentioned in it. How the software distinguishes between various people named &lt;a href="https://en.wikipedia.org/wiki/John_Smith"&gt;John Smith&lt;/a&gt;, or whether it tries at all, is unclear to me, but the feature provided me with a pleasant surprise.</description><author>Avy Faingezicht</author><pubDate>Wed, 30 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/30/links/</guid></item><item><title>HTML5 Mobile Apps, Part 3: Distribution</title><link>https://thomashunter.name/posts/2015-09-30-what-i-learned-while-publishing-an-html5-mobile-app-part-35-distribution-and-marketplaces</link><author>Thomas Hunter II</author><pubDate>Wed, 30 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2015-09-30-what-i-learned-while-publishing-an-html5-mobile-app-part-35-distribution-and-marketplaces</guid></item><item><title>Authentication Quickstart with Express, Passport and Sequelize</title><link>https://stribny.name/posts/authentication-quickstart-with-express-passport-and-sequelize/</link><author>Posts by Petr Stribny</author><pubDate>Tue, 29 Sep 2015 21:39:57 GMT</pubDate><guid isPermaLink="true">https://stribny.name/posts/authentication-quickstart-with-express-passport-and-sequelize/</guid></item><item><title>Links - September 29th, 2015</title><link>https://faingezicht.com/links/2015/09/29/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 29 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/29/links/</guid></item><item><title>HTML5 Mobile Apps, Part 2: Performance</title><link>https://thomashunter.name/posts/2015-09-29-what-i-learned-while-publishing-an-html5-mobile-app-part-25-performance</link><author>Thomas Hunter II</author><pubDate>Tue, 29 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2015-09-29-what-i-learned-while-publishing-an-html5-mobile-app-part-25-performance</guid></item><item><title>Grounding, part 1: An intro from a robot</title><link>http://dimitarsimeonov.com/2015/09/29/grounding-part-1-an-intro-from-a-robot</link><description>&lt;p&gt;&lt;em&gt;This is the first part of several essays on the principle of grounding. I feel that this principle helps me communicate
and think better. I’ll try to keep each essay short&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A few years ago I was doing my masters, with the goal of using
language to command robots. I was very excited because the research
was very interesting to me - I needed to understand how to write
software for robots, how the robot works as a system, and various
fascinating aspects of human-robot interaction and linguistics. It
felt super futuristic to be at the meeting point of so many
disciplines.&lt;/p&gt;

&lt;p&gt;Specifically, I was trying to teach a robot to follow some simple
commands such as &lt;code class="language-plaintext highlighter-rouge"&gt;Pick up the cup&lt;/code&gt;.  I was working with a robot which
had two hands, and a 3D scanning sensor for eyes, and was usually
facing a table with a bunch of standard household objects on top of
it.  If the robot was facing a specific table with specific object
configuration, it is possible to program and hard-code the robot arm
to move towards the cup, grab the cup, and then lift it.  However, as
soon as something tiny changes in the configuration, the position of
the cup the robot, or the command, then the hard-coded solution would
no longer work, instead making the robot wave its hands in air
clumsily.  Programming the robot in a single situation may be fun, but
doing the same thing over and over will get boring and annoying quite
fast, and on top of it wouldn’t be effective.&lt;/p&gt;

&lt;p&gt;My task was to make the robot succeed when the cup looks differently,
or is at a different location, or even if the command asked for a
different item.  In each new environment, the robot needed to connect
the abstract symbol for &lt;code class="language-plaintext highlighter-rouge"&gt;cup&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;bowl&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;bottle&lt;/code&gt; from the command to the
sensory information from the environment, figure out the right motions
and execute them.&lt;/p&gt;

&lt;p&gt;Luckily, I didn’t have to start from scratch.  I stepped on the
shoulders of giants, my professor and the senior graduate students,
who had already invented algorithms for this meeting point of
disciplines.  They created techniques for connecting the symbolic
command to the physical reality, albeit for a very different robot, in
a different setting.  My task was to port the algorithm to this new
robot and make sure it works, helping justify the algorithm’s ability
to adapt to new situations.&lt;/p&gt;

&lt;p&gt;The algorithm connected the text of the command and the sensory
perceptions of the robot and its imaginary motions.  This is
&lt;strong&gt;grounding&lt;/strong&gt;, as I came to know it. Grounding is the &lt;em&gt;connecting&lt;/em&gt;
between something completely abstract and symbolic, such as the
symbols for the action &lt;code class="language-plaintext highlighter-rouge"&gt;pick up&lt;/code&gt; and the object &lt;code class="language-plaintext highlighter-rouge"&gt;cup&lt;/code&gt; and on the other
hand the specific sets of 3D pixels and specific hand trajectories and
motor settings. The latter ones exist in the reality, they are very
exact - they are solid ground. The former are just the names of items
or motions and could resolve differently depending on the situation.&lt;/p&gt;

&lt;p&gt;In this project, grounding is the same as name resolution. Finding the
best object which corresponds to the meaning of &lt;code class="language-plaintext highlighter-rouge"&gt;the cup&lt;/code&gt;, given the
whole context of the command gets to be named &lt;code class="language-plaintext highlighter-rouge"&gt;the cup&lt;/code&gt;.  Finding the
best trajectory of the robot hand that corresponds to the action of
&lt;code class="language-plaintext highlighter-rouge"&gt;pick up&lt;/code&gt;, again gets to be named &lt;code class="language-plaintext highlighter-rouge"&gt;pick up&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This connection, the grounding, &lt;strong&gt;bridged the gap between the abstract,
clean and imaginary part&lt;/strong&gt; of the robot’s understanding, the name of
each object and trajectory, &lt;strong&gt;and the concrete, noisy and complicated
physical world&lt;/strong&gt;.  Without crossing this divide somehow, the robot
can’t to do anything of physical importance correctly.  These physical
actions are what made the robot a ROBOT, instead of just a normal
computer.  The algorithm built a bridge for the robot between the
abstract and the concrete, so that the robot can cross it every time
it needs to do something of physical importance.&lt;/p&gt;

&lt;p&gt;The specific algorithm may have been clever, but what I found to be
the really wise part, was the step of connecting the abstract to the
specific.  Every time I was trying explain something and provided
specific examples of my abstract ideas I noticed that not only I was
able to communicate these ideas more clearly, I also understood my
ideas better.  Grounding became a tool for better communicating and a
tool for clearer thinking.&lt;/p&gt;

&lt;p&gt;The next several essays will dive more deeply into the various aspects
and applications of this tool.&lt;/p&gt;</description><author>D13V</author><pubDate>Tue, 29 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2015/09/29/grounding-part-1-an-intro-from-a-robot</guid></item><item><title>Numpy Broadcasting Rules</title><link>https://bastibe.de/2015-09-29-numpy-broadcasting-rules.html</link><description>&lt;p&gt;They say that all arithmetic operations in Numpy behave like their element-wise cousins in Matlab. This is wrong, and seriously tripped me up last week.&lt;/p&gt;
&lt;p&gt;In particular, this is what happens when you multiply an array with a matrix[1] in Numpy:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;     [[  1],           [[1, 2, 3],       [[ 1,    2,   3],
      [ 10],       *    [4, 5, 6],   =    [ 40,  50,  60],
      [100]]            [7, 8, 9]]        [700, 800, 900]]

 [  1,  10, 100]       [[1, 2, 3],       [[  1,  20, 300],
        OR         *    [4, 5, 6],   =    [  4,  50, 600],
[[  1,  10, 100]]       [7, 8, 9]]        [  7,  80, 900]]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;They behave as if each row was evaluated separately, and singular dimensions are repeated where necessary. It helps to think about them as row-wise, instead of element-wise. This is particularly important in the second example, where the &lt;em&gt;whole&lt;/em&gt; 1d-array is multiplied with &lt;em&gt;every row&lt;/em&gt; of the 2d-array.&lt;/p&gt;
&lt;p&gt;Note that this is &lt;em&gt;not&lt;/em&gt; equivalent to multiplying every &lt;em&gt;element&lt;/em&gt; as in &lt;code&gt;[a[n]*b[n] for n in range(len(a))]&lt;/code&gt;. I guess that's why this is called &lt;em&gt;broadcasting&lt;/em&gt;, and not &lt;em&gt;element-wise&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;[1] &amp;quot;matrix&amp;quot; here refers to a 2-d &lt;code&gt;numpy.array&lt;/code&gt;. There is also a &lt;code&gt;numpy.matrix&lt;/code&gt;, where multiplication is matrix multiplication, but this is not what I'm talking about.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Tue, 29 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2015-09-29-numpy-broadcasting-rules.html</guid></item><item><title>Benchmark of Python JSON libraries</title><link>https://artem.krylysov.com/blog/2015/09/29/benchmark-python-json-libraries/</link><description>&lt;aside class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;This post was updated on 2016-08-13: added &lt;span class="docutils literal"&gt;&lt;span class="pre"&gt;python-rapidjson&lt;/span&gt;&lt;/span&gt;; updated &lt;span class="docutils literal"&gt;simplejson&lt;/span&gt; and &lt;span class="docutils literal"&gt;ujson&lt;/span&gt;.&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;A couple of weeks ago after spending some time with Python profiler, I discovered that Python’s &lt;span class="docutils literal"&gt;json&lt;/span&gt; module is not as fast as I expected. I decided to benchmark alternative JSON libraries.&lt;/p&gt;
&lt;section id="libraries"&gt;
&lt;h3&gt;Libraries&lt;a class="headerlink" href="#libraries" title="Permalink to this headline"&gt; #&lt;/a&gt;&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://docs.python.org/3/library/json.html" target="_blank"&gt;json&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.python.org/pypi/simplejson" target="_blank"&gt;simplejson&lt;/a&gt; 3.8.2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.python.org/pypi/ujson" target="_blank"&gt;ujson&lt;/a&gt; 1.35&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.python.org/pypi/python-rapidjson" target="_blank"&gt;python-rapidjson&lt;/a&gt; 0.0.6&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class="docutils literal"&gt;&lt;span class="pre"&gt;python-cjson&lt;/span&gt;&lt;/span&gt;, &lt;span class="docutils literal"&gt;&lt;span class="pre"&gt;yajl-py&lt;/span&gt;&lt;/span&gt; and &lt;span class="docutils literal"&gt;jsonlib&lt;/span&gt; are not included in the benchmark, they are not in active development and don’t support Python 3.&lt;/p&gt;
&lt;p&gt;&lt;span class="docutils literal"&gt;simplejson&lt;/span&gt; and &lt;span class="docutils literal"&gt;ujson&lt;/span&gt; may be used as a drop-in replacement for the standard &lt;span class="docutils literal"&gt;json&lt;/span&gt; module, but &lt;span class="docutils literal"&gt;ujson&lt;/span&gt; doesn’t support advanced features like hooks, custom encoders and decoders.&lt;/p&gt;
&lt;p&gt;You can change your imports this way to use an alternative library:&lt;/p&gt;
&lt;pre class="code python literal-block"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ujson&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/section&gt;
&lt;section id="interpreters"&gt;
&lt;h3&gt;Interpreters&lt;a class="headerlink" href="#interpreters" title="Permalink to this headline"&gt; #&lt;/a&gt;&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Python (CPython) 2.7.12&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python (CPython) 3.5.2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://pypy.org/" target="_blank"&gt;PyPy&lt;/a&gt; 5.3.0&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;ujson is not compatible with PyPy; python-rapidjson is compatible only with Python 3.&lt;/p&gt;
&lt;/aside&gt;
&lt;/section&gt;
&lt;section id="methodology"&gt;
&lt;h3&gt;Methodology&lt;a class="headerlink" href="#methodology" title="Permalink to this headline"&gt; #&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The tests were performed on MacBook Pro Late 2013 (2.6 GHz Intel Core i5, 8 GB 1600 MHz DDR3, Mac OS 10.11.6). Every test runs 100 times.&lt;/p&gt;
&lt;table&gt;
&lt;caption&gt;Test data&lt;/caption&gt;
&lt;colgroup&gt;
&lt;col style="width: 36.4%;" /&gt;
&lt;col style="width: 18.2%;" /&gt;
&lt;col style="width: 45.5%;" /&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th class="head"&gt;&lt;p&gt;File name&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;File size&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span class="docutils literal"&gt;twitter.json&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;632 KB&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Single large JSON (&lt;a class="reference external" href="https://github.com/akrylysov/python-json-benchmark/blob/master/data/twitter.json" target="_blank"&gt;source&lt;/a&gt;)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span class="docutils literal"&gt;&lt;span class="pre"&gt;one-json-per-line.jsons.txt&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;176 KB&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Collection of 1000 JSON objects (&lt;a class="reference external" href="https://github.com/akrylysov/python-json-benchmark/blob/master/data/one-json-per-line.txt" target="_blank"&gt;source&lt;/a&gt;)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I published &lt;a class="reference external" href="https://github.com/akrylysov/python-json-benchmark" target="_blank"&gt;the source code&lt;/a&gt; of the benchmark on GitHub. You can clone it and rerun if you want to check it by yourself or if a new version of an alternative JSON library is released.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="results"&gt;
&lt;h3&gt;Results&lt;a class="headerlink" href="#results" title="Permalink to this headline"&gt; #&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;caption&gt;Python 2.7&lt;/caption&gt;
&lt;colgroup&gt;
&lt;col style="width: 40.0%;" /&gt;
&lt;col style="width: 20.0%;" /&gt;
&lt;col style="width: 20.0%;" /&gt;
&lt;col style="width: 20.0%;" /&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th class="head"&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;json&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;simplejson&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;ujson&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;loads (large obj)&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.140&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.441&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.448&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;dumps (large obj)&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.564&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.630&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.459&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;loads (small objs)&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.190&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.579&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.195&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;dumps (small objs)&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.910&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.641&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.304&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;img alt="" src="https://artem.krylysov.com/images/2015-benchmark-python-json/benchmark-json-python2.png" style="width: 695px; height: 542px;" /&gt;
&lt;table&gt;
&lt;caption&gt;Python 3.5&lt;/caption&gt;
&lt;colgroup&gt;
&lt;col style="width: 33.3%;" /&gt;
&lt;col style="width: 16.7%;" /&gt;
&lt;col style="width: 16.7%;" /&gt;
&lt;col style="width: 16.7%;" /&gt;
&lt;col style="width: 16.7%;" /&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th class="head"&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;json&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;simplejson&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;ujson&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;rapidjson&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;loads (large obj)&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.600&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.698&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.605&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.634&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;dumps (large obj)&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.673&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.629&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.381&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.365&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;loads (small objs)&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.801&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.091&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.322&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.531&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;dumps (small objs)&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.213&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2.038&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.285&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.234&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;img alt="" src="https://artem.krylysov.com/images/2015-benchmark-python-json/benchmark-json-python3.png" style="width: 695px; height: 542px;" /&gt;
&lt;table&gt;
&lt;caption&gt;PyPy 5.3&lt;/caption&gt;
&lt;colgroup&gt;
&lt;col style="width: 50.0%;" /&gt;
&lt;col style="width: 25.0%;" /&gt;
&lt;col style="width: 25.0%;" /&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th class="head"&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;json&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;simplejson&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;loads (large obj)&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.545&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.876&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;dumps (large obj)&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.632&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;3.974&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;loads (small objs)&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.271&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1.651&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;dumps (small objs)&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0.719&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2.404&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;img alt="" src="https://artem.krylysov.com/images/2015-benchmark-python-json/benchmark-json-pypy.png" style="width: 695px; height: 542px;" /&gt;
&lt;aside class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;Results are in seconds.&lt;/p&gt;
&lt;/aside&gt;
&lt;/section&gt;
&lt;section id="conclusion"&gt;
&lt;h3&gt;Conclusion&lt;a class="headerlink" href="#conclusion" title="Permalink to this headline"&gt; #&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The numbers speak for themselves. If your application is dealing with a big amount of JSON data and doesn't use any advanced features of built-in &lt;span class="docutils literal"&gt;json&lt;/span&gt; module, you should probably consider switching to &lt;span class="docutils literal"&gt;ujson&lt;/span&gt;.&lt;/p&gt;
&lt;/section&gt;</description><author>Artem Krylysov</author><pubDate>Tue, 29 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://artem.krylysov.com/blog/2015/09/29/benchmark-python-json-libraries/</guid></item><item><title>One Weird Trick to Write Better Code</title><link>https://etodd.io/2015/09/28/one-weird-trick-better-code/</link><description>&lt;p&gt;Developers hate him!&lt;/p&gt;
&lt;p&gt;
	We'll cover some standard tips and tricks here, but we're not really
	interested in those. We're looking for the One Weird Trick to rule them
	all. Hopefully each trick we encounter brings us closer to coding Mecca.
&lt;/p&gt;
&lt;h3&gt;In the beginning&lt;/h3&gt;
&lt;p&gt;The first video game I ever wrote was called &lt;em&gt;Ninja Wars.&lt;/em&gt;&lt;/p&gt;
&lt;img src="https://etodd.io/assets/ninjawars.png" /&gt;
&lt;p&gt;
	Yes, that is an HTML table of images. I changed the
	&lt;span class="code"&gt;src&lt;/span&gt; attribute to move stuff around.
&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Tue, 29 Sep 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/09/28/one-weird-trick-better-code/</guid></item><item><title>Find a word with regex and WordNet</title><link>https://xenodium.com/find-a-word-with-regex-and-wordnet</link><description>&lt;p&gt;Recently wanted to come up with a random keyword. Querying &lt;a href="http://wordnet.princeton.edu/"&gt;WordNet&lt;/a&gt; and a regular expression did the job.&lt;/p&gt;
&lt;p&gt;Installed WordNet on Mac:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ brew install wordnet
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Want a word ending in &amp;quot;esome&amp;quot;?&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ wn esome -grepn -grepv -grepa -grepr | egrep -o -e &amp;quot;\w*esome\b&amp;quot; | sort | uniq

adventuresome
awesome
blithesome
bunglesome
cuddlesome
esome
fivesome
gruesome
lithesome
lonesome
lovesome
meddlesome
mettlesome
nettlesome
threesome
tiresome
torturesome
troublesome
unwholesome
venturesome
wholesome
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 28 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/find-a-word-with-regex-and-wordnet</guid></item><item><title>Break hard and early</title><link>https://june.kim/pattern/</link><author>june.kim</author><pubDate>Mon, 28 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/pattern/</guid></item><item><title>Links - September 28th, 2015</title><link>https://faingezicht.com/links/2015/09/28/links/</link><description>My apoligies for the lack of links on Friday. Hopefully today's set makes up for that.</description><author>Avy Faingezicht</author><pubDate>Mon, 28 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/28/links/</guid></item><item><title>2D Contouring</title><link>https://mattkeeter.com/projects/contours</link><description>An overview of various algorithms</description><author>Matt Keeter</author><pubDate>Mon, 28 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/projects/contours</guid></item><item><title>HTML5 Mobile Apps, Part 1: Development and Debugging</title><link>https://thomashunter.name/posts/2015-09-28-what-i-learned-while-publishing-an-html5-mobile-app-part-15-development-and-debugging</link><author>Thomas Hunter II</author><pubDate>Mon, 28 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2015-09-28-what-i-learned-while-publishing-an-html5-mobile-app-part-15-development-and-debugging</guid></item><item><title>Python Numeric Performance</title><link>https://bastibe.de/2015-09-28-python-performance.html</link><description>&lt;p&gt;Recently, I was working on a dynamic programming algorithm that involves a lot of number crunching in nested loops. The algorithm looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;y_change_probability_python&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oct_per_sec&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot; ... &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.781&lt;/span&gt;
    &lt;span class="n"&gt;mu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.301&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oct_per_sec&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;y_idx_range_python&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_y_factor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot; ... &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;
    &lt;span class="n"&gt;y_lo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;max_y_factor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;y_hi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;max_y_factor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;y_lo_idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;y_lo&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;y_hi_idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;y_hi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;y_lo_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_hi_idx&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;find_tracks_python&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delta_x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot; ... &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;tracks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correlogram&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;int64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cum_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correlogram&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;max_y_factor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta_x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;correlogram&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;probabilities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y_idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y_pre_idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;y_idx_range_numba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_y_factor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
            &lt;span class="n"&gt;y_pre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_pre_idx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;
            &lt;span class="n"&gt;doubles_per_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log2&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;y_pre&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;delta_x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;probabilities&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_pre_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y_change_probability_numba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doubles_per_x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cost_column&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x_idx&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;cum_cost&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_column&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cost&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_column&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y_pre_idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;y_idx_range_numba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_y_factor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
                &lt;span class="n"&gt;weighted_cum_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cum_cost&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_pre_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cost&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;probabilities&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_pre_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;weighted_cum_cost&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cum_cost&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                    &lt;span class="n"&gt;cum_cost&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;weighted_cum_cost&lt;/span&gt;
                    &lt;span class="n"&gt;tracks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y_pre_idx&lt;/span&gt;
            &lt;span class="n"&gt;cum_cost&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cum_cost&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tracks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cost&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tracks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cum_cost&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I'm not going into the details of what this algorithm does, but note that it iterates over every column and row of the matrix &lt;code&gt;cost_matrix&lt;/code&gt;, and then iterates over another range &lt;code&gt;previous_y_range&lt;/code&gt; for each of the values in &lt;code&gt;cost_matrix&lt;/code&gt;. On the way, it does a lot of basic arithmetic and some algebra.&lt;/p&gt;
&lt;p&gt;The problem is, this is very slow. For a &lt;span class="math"&gt;\(90 \times 200\)&lt;/span&gt; &lt;code&gt;cost_matrix&lt;/code&gt;, this takes about 260 ms. Lots of loops? Lots of simple mathematics? Slow? That sounds like a perfect match for &lt;a href="http://www.numpy.org/"&gt;Numpy&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;If you can express your code in terms of linear algebra, Numpy will execute them in highly-optimized C code. The problem is, translating loops into linear algebra is not always easy. In this case, it took some effort:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;y_change_probability_numpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doubles_per_x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot; ... &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.781&lt;/span&gt;
    &lt;span class="n"&gt;mu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.301&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doubles_per_x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;find_frequency_tracks_numpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delta_x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot; ... &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;tracks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cum_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;max_y_factor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delta_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# allow at most 5 octaves per second (3 sigma)&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# pre-allocate probabilities matrix as minus infinity. This matrix&lt;/span&gt;
    &lt;span class="c1"&gt;# will be sparsely filled with positive probability values, and&lt;/span&gt;
    &lt;span class="c1"&gt;# empty values will have minus infinite probability.&lt;/span&gt;
    &lt;span class="n"&gt;probabilities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ones&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inf&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y_idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;probabilities&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
        &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;
        &lt;span class="n"&gt;y_pre_idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;max_y_factor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                              &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;max_y_factor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;y_pre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_pre_idx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;min_y&lt;/span&gt;
        &lt;span class="n"&gt;doubles_per_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log2&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;y_pre&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;delta_x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;probabilities&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_pre_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y_change_probability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doubles_per_x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;cum_cost&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x_idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;cost_column&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# extract cost_column as 2d-vector!&lt;/span&gt;
        &lt;span class="n"&gt;weighted_cum_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cum_cost&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cost_column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;probabilities&lt;/span&gt;
        &lt;span class="n"&gt;tracks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;weighted_cum_cost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;cum_cost&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cum_cost&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tracks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cost_column&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tracks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cum_corrs&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This code does not look much like the original, but calculates exactly the same thing. This takes about 15 ms for a &lt;span class="math"&gt;\(90 \times 200\)&lt;/span&gt; &lt;code&gt;cost_matrix&lt;/code&gt;, which is about 17 times faster than the original code! Yay Numpy! And furthermore, this code is arguably more readable than the original, since it is written at a higher level of abstraction.&lt;/p&gt;
&lt;p&gt;Another avenue for performance optimization is &lt;a href="http://numba.pydata.org/"&gt;Numba&lt;/a&gt;. Numba applies dark and powerful magic to compile humble Python functions into blazingly fast machine code. It is proper magic, if you ask me. Simply add an innocuous little decorator to your functions, and let Numba do it's thing. If all goes well, your code will work just as before, except with unheard-of performance:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@jit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;nopython&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;y_change_probability_numba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doubles_per_x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="nd"&gt;@jit&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;numba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;int64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;int64&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;nopython&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;y_idx_range_numba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_y_factor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="nd"&gt;@jit&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;numba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;[:,:],&lt;/span&gt; &lt;span class="n"&gt;numba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;nopython&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;find_tracks_numba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delta_t&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;However, Numba is no silver bullet, and does not support all of Python yet. In the present case, it is missing support for &lt;code&gt;enumerate&lt;/code&gt; for Numpy matrices. Thus, I had to rewrite the first two loops like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# python version&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cost_column&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;# numba version&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x_idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;cost_column&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x_idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Another area that proved problematic is N-D slice writing. Instead of using expressions like &lt;code&gt;m1[x,y:y+3] = m2&lt;/code&gt;, you have to write &lt;code&gt;for idx in range(3): m1[x,y+idx] = m2[idx]&lt;/code&gt;. Not a difficult transformation, but it basically forced me to unroll all the nice vectorized code of the Numpy version back to their original pure-Python form. That said, Numba is getting better and better, and many constructs that used to be uncompilable (&lt;code&gt;yield&lt;/code&gt;) are not a problem any more.&lt;/p&gt;
&lt;p&gt;Anyway, with that done, the above code went down from 260 ms to 2.2 ms. This is a 120-fold increase in performance, and still seven times faster than Numpy, with minimal code changes. This is proper magic!&lt;/p&gt;
&lt;p&gt;So why wouldn't you just always use Numba? After all, when it comes down to raw performance, Numba is the clear winner. The big difference between performance optimization using Numpy and Numba is that properly vectorizing your code for Numpy often reveals simplifications and abstractions that make it easier to reason about your code. Numpy forces you to think in terms of vectors, matrices, and linear algebra, and this often makes your code &lt;em&gt;more beautiful&lt;/em&gt;. Numba on the other hand often requires you to make your code &lt;em&gt;less beautiful&lt;/em&gt; to conform to it's subset of compilable Python.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Mon, 28 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2015-09-28-python-performance.html</guid></item><item><title>Searching for swear words in the Enron corpus</title><link>https://bastian.rieck.me/blog/2015/enron_swear_words/</link><description>&lt;p&gt;I recently downloaded &lt;a href="https://www.cs.cmu.edu/~./enron/"&gt;the Enron corpus&lt;/a&gt; to try to visualize
some interesting features. As a first step, I wanted to analyse how many &lt;em&gt;swear words&lt;/em&gt; are used
in the corpus. I wanted to find out if there are some users with a “saltier“ language
than others.&lt;/p&gt;
&lt;h1 id="processing-the-data"&gt;Processing the data&lt;/h1&gt;
&lt;p&gt;I am only using the simplest procedure for walking through the data: First, I defined a list of
offensive words (with a little help &lt;a href="https://en.wikipedia.org/wiki/Category:Profanity"&gt;from Wikipedia&lt;/a&gt;, of course).
Second, I used a basic Python script to process each e-mail, tokenize it, and check the words
against the list of profanity. The counts are then tallied and printed out. Here’s a rough
draft of the script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;collections&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;hashlib&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;nltk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;directory&lt;/span&gt;           &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"maildir/"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;swearWordsPerPerson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;swearWordsTotal&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;swearWords&lt;/span&gt;          &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HeaderParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Swear_words.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;swearWords&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sep&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Processing '&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;'..."&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ignore"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"utf-8"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;text&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;text&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parsestr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headersonly&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_payload&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;text&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"utf-8"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;words&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nltk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;word_tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"utf-8"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;swearWords&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;          &lt;span class="n"&gt;swearWordsPerPerson&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;          &lt;span class="n"&gt;swearWordsTotal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;       &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"...finished"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;swearWordsPerPerson&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"THE SWEARERS&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numSwears&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;swearWordsPerPerson&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;most_common&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"  &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numSwears&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"THE SWEARS&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;swear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;swearWordsTotal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;most_common&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"  &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The conversion of text from each e-mail looks needlessly elaborate, but it is required to ensure
that words in the e-mail headers are not counted. Of course, I am not trying to detect any fancy
things such as messages that have been forwarded multiple times. Furthermore, I have excluded some
words from the list of swears in order not to trigger any false positives. One of the executives is
called “Dick Jenkins”, and some of his co-workers refer to him by his first name,
so…&lt;/p&gt;
&lt;h1 id="the-swearers"&gt;The swearers&lt;/h1&gt;
&lt;p&gt;First, let’s look at a histogram of the &lt;em&gt;absolute&lt;/em&gt; number of swears:&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://bastian.rieck.me/images/enron_swear_words_absolute_histogram.png"&gt;&lt;img height=" caption=" src="https://bastian.rieck.me/images/enron_swear_words_absolute_histogram.png" width="400" /&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;We can see that there are only few people who seem to use many swears. However, this is not
normalized against the number of e-mails each person received. Let’s do this next!&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://bastian.rieck.me/images/enron_swear_words_relative_histogram.png"&gt;&lt;img height=" caption=" src="https://bastian.rieck.me/images/enron_swear_words_relative_histogram.png" width="400" /&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;The pattern is similar, but the outliers are now “normalized” in a sense. If we focus on
a normalized swear count of larger than 0.25 (with a unit of “swears per e-mail”),
we are left with the following persons:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lucci-p   0.33
lenhart-m 0.28
brawner-s 0.27
quigley-d 0.19
ring-a    0.18
dorland-c 0.15
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All the remaining 144 (!) persons use less than 0.15 swear words per e-mail.&lt;/p&gt;
&lt;h1 id="the-swears"&gt;The swears&lt;/h1&gt;
&lt;p&gt;So, what are the top ten swear words in all e-mails? Without further ado, here is a partially
censored list (I don’t want to lose my family-friendly rating):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hell   2033
a**:   1724
sh*t   1583
sex    1521
balls  1235
d*mn    915
b*tch   711
f*ck    690
butt    615
crap    612
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Does this mean that the Enron people like to swear? Unfortunately, no. First of all, the context of
a word is extremely important. In some cases, &lt;em&gt;hell&lt;/em&gt; might be a misspelling of &lt;em&gt;he’ll&lt;/em&gt;.
Second, the swear count might be multiplied by people forwarding (or replying) e-mails without
removing the old content.&lt;/p&gt;
&lt;p&gt;Upon further inspection, it turns out that most of the swear words are used in personal
communications. People are forwarding the usual dirty jokes among their friends and co-workers, who
in turn reply with a salty joke themselves.&lt;/p&gt;
&lt;p&gt;The take-away messages from this experiment are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Figuring out words in context is hard.&lt;/li&gt;
&lt;li&gt;Analysing a corpus such as the Enron e-mails is also hard.&lt;/li&gt;
&lt;li&gt;Natural language is even harder.&lt;/li&gt;
&lt;/ol&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Mon, 28 Sep 2015 01:19:57 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/enron_swear_words/</guid></item><item><title>Macaroons 101: Contextual Confinement</title><link>https://evancordell.com/posts/macaroons-101-contextual-confinement/</link><description>Macaroons, like Fezzes, are cool. If you find yourself disagreeing, it’s possible you’re thinking of the wrong sort of macaroons
, or you’ve yet to be convinced. This is the first in a series of posts in which I intend to explain why macaroons are so interesting. We’ll start by motivating them and defining them, and later expand on the theory behind them and study examples of how they’re applicable in the real world.
The name “macaroon” comes from the Google research paper that introduced them, a play on the ubiquitous browser “cookie.</description><author>Evan Cordell</author><pubDate>Sun, 27 Sep 2015 15:35:45 GMT</pubDate><guid isPermaLink="true">https://evancordell.com/posts/macaroons-101-contextual-confinement/</guid></item><item><title>2015-09-27</title><link>https://ho.dges.online/pictures/2015-09-27/</link><description/><author>ho.dges.online</author><pubDate>Sun, 27 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-09-27/</guid></item><item><title>Hitch</title><link>https://olshansky.info/movie/hitch/</link><description>Olshansky's review of Hitch</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 26 Sep 2015 06:23:32 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/hitch/</guid></item><item><title>Soundcloud's Go best practices (GopherCon 2014)</title><link>https://xenodium.com/soundclouds-go-best-practices-gophercon-2014</link><description>&lt;p&gt;Having watched the &lt;a href="https://www.youtube.com/watch?v%3DY1-RLAl7iOI"&gt;video&lt;/a&gt;, some takeaways:&lt;/p&gt;
&lt;h2&gt;Single GOPATH&lt;/h2&gt;
&lt;h3&gt;$GOPATH/src/github.com/soundcloud/foo&lt;/h3&gt;
&lt;h2&gt;Repo structure&lt;/h2&gt;
&lt;h3&gt;github.com/soundcloud/whatever&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;README.md&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Makefile&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;main.go&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;support.go&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;foo&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;foo.go&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bar.go&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;whatever-server&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;main.go&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;wharever-worker&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;main.go&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Formatting and style&lt;/h2&gt;
&lt;h3&gt;Use gofmt.&lt;/h3&gt;
&lt;h3&gt;Google's codereview &lt;a href="https://github.com/golang/go/wiki/CodeReviewComments"&gt;guidelines&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;Avoid named return parameters.&lt;/h3&gt;
&lt;h3&gt;Avoid make and new (unless you know sizes).&lt;/h3&gt;
&lt;h3&gt;Use struct{} for sentinel values: sets, signal chans.&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Conveys no information in it this part.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Instead of empty interface.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;instead of boolean.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Break long lines at parameters&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;No need to compact.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep trailing coma in last argument.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Flags&lt;/h3&gt;
&lt;pre&gt;&lt;code class="language-go"&gt;func main() {
  var (
    foo = flags.String(&amp;quot;foo\n&amp;quot;, &amp;quot;doch\n&amp;quot;, &amp;quot;...&amp;quot;)
    bar = flat.Int(&amp;quot;bar\n&amp;quot;, 34, &amp;quot;...&amp;quot;)
  )
  flag.Parse()
  // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Logging&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;package log&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Telemetry&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Push model (gets expensive over time)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Graphite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Statsd&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AirBrake&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull model (chosen)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;expvar&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prometheus&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;package testing&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Unit tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;reflect.DeepEqual&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integration&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Use flags for starting services&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;// +build integration&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Code validation&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;On Save&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go fmt&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go import (go fmt++)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On Build&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go vet&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Golint&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go test&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On Deploy&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;go test -tags=integration&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GoCov?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Dependency management&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Unimportant projects&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;go get -d (and hope)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Important&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;VENDOR (ie. copy into your repo)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Git submodules (no!).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git subtrees (seem OK).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tool (godep?).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For binaries (use _vendor subdir)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 26 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/soundclouds-go-best-practices-gophercon-2014</guid></item><item><title>Born Yesterday by Philip Larkin</title><link>https://ho.dges.online/words/commonplace/born-yesterday-by-philip-larkin/</link><description>&lt;p&gt;For Sally Amis&lt;/p&gt;
&lt;p&gt;Tightly-folded bud,&lt;br /&gt;
I have wished you something&lt;br /&gt;
None of the others would:&lt;br /&gt;
Not the usual stuff&lt;br /&gt;
About being beautiful,&lt;br /&gt;
Or running off a spring&lt;br /&gt;
Of innocence and love —&lt;br /&gt;
They will all wish you that,&lt;br /&gt;
And should it prove possible,&lt;br /&gt;
Well, you’re a lucky girl.&lt;/p&gt;
&lt;p&gt;But if it shouldn’t, then&lt;br /&gt;
May you be ordinary;&lt;br /&gt;
Have, like other women,&lt;br /&gt;
An average of talents:&lt;br /&gt;
Not ugly, not good-looking,&lt;br /&gt;
Nothing uncustomary&lt;br /&gt;
To pull you off your balance,&lt;br /&gt;
That, unworkable itself,&lt;br /&gt;
Stops all the rest from working.&lt;br /&gt;
In fact, may you be dull —&lt;br /&gt;
If that is what a skilled,&lt;br /&gt;
Vigilant, flexible,&lt;br /&gt;
Unemphasised, enthralled&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 26 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/born-yesterday-by-philip-larkin/</guid></item><item><title>Is it Secure?</title><link>https://www.danstroot.com/posts/2015-09-26-is-it-secure</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/smart-car-lock.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Most information security practitioners do a poor job explaining the relative nature of security.  Secure relative to what? A bot that looks for un-patched systems? A determined hacker? A nation-state?  Security is a "scale of difficulty" – like mountain climbing. Everest was thought to be unclimbable until Sir Edmund Hillary did it.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2015-09-26-is-it-secure"&gt;Is it Secure?&lt;/a&gt; first appeared on &lt;a href="https://www.danstroot.com"&gt;Dan Stroot's Blog&lt;/a&gt;</description><author>Dan Stroot</author><pubDate>Sat, 26 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2015-09-26-is-it-secure</guid></item><item><title>Why don't we just do solar instead of nuclear?</title><link>http://negfeedback.blogspot.com/2015/09/why-dont-we-just-do-solar-instead-of.html</link><description>I've been seeing a lot of people complaining about the nuclear deal. There seems to be an especially vocal group who feel that &lt;a href="http://businesstech.co.za/news/energy/99316/why-sa-does-not-need-nuclear-energy/"&gt;we should be investing in renewables&lt;/a&gt; rather than nuclear. Some of these people hold up Fukushima as a warning about how bad things can go with nuclear power. There's a lot to say about this topic, and I'm not going to take the time to write a book about it, just drop some links and facts for the interested reader.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
First, Fukushima is &lt;a href="http://www.forbes.com/sites/jamesconca/2015/03/16/the-fukushima-disaster-wasnt-very-disastrous/"&gt;not as bad as you may think&lt;/a&gt;. Specifically, no-one died or is projected to die due to radiation released at Fukushima.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Second, we want less CO₂ to be produced in the production of our electricity needs, we need to move away from fossil fuels. The nuclear advocates and the solar advocates usually agree on this. The problem is that nuclear fills a niche that solar really struggles with: base load. I went hunting for the most recent information on the South African situation, and I came across &lt;a href="http://www.eskom.co.za/CustomerCare/TariffsAndCharges/WhatsNew/Documents/201516%20winter%20time%20of%20use%20changes-general%2009032015.ppt"&gt;this presentation&lt;/a&gt;&amp;nbsp;which shows the problem with South African power quite clearly - there are large peaks in usage in the morning and the afternoon in winter. &lt;a href="http://www.eskom.co.za/Documents/infographic01.png"&gt;This Eskom infographic&lt;/a&gt; has a nicer display of the winter and summer behaviour. I also tried to find good information on the insolation in SA and ended up choosing &lt;a href="https://www.blogger.com/blogger.g?blogID=7479095831591011602# Source: http://www.sauran.net/ShowStation.aspx?station=22"&gt;a weather station in the Richtersveldt&lt;/a&gt; for my data since it is located in a nice open area in the best solar position in the country. When you plot these together, you get this graph:&lt;/div&gt;
&lt;div&gt;
&lt;a href="https://plot.ly/~chthonicdaemon/30/" style="display: block; text-align: center;" target="_blank" title="Power / GW vs Time"&gt;&lt;img alt="Power / GW vs Time" src="https://plot.ly/~chthonicdaemon/30.png" style="width: 792px;" width="792" /&gt;&lt;/a&gt;
    
&lt;/div&gt;
&lt;div&gt;
Notice how the peaks take place at times where there isn't really much sun. This means solar power can't really supply the power for those peaks directly. More importantly, it can't help with the minimum demand at 02:00. We would have to store the energy somehow.&lt;br /&gt;
&lt;br /&gt;
Another issue often bandied about in these conversations is how expensive the nuclear plants would be. The figures &lt;a href="http://mg.co.za/article/2015-07-16-nuke-plan-50-shades-of-arms-deal"&gt;I've heard&lt;/a&gt; are that the nuclear deal is perhaps going to cost around R1.2T for 9.6 GW of nuclear nameplate capacity. People look at that and think "if Solar PV costs around &lt;a href="http://www.pv-magazine.com/news/details/beitrag/us-installed-solar-pv-costs-continue-to-fall_100016490/#axzz3mfykDgjh"&gt;$3/W&lt;/a&gt;, we could build the same solar capacity for a fraction of the price". &amp;nbsp;The problem, of course, is that the &lt;a href="https://en.wikipedia.org/wiki/Capacity_factor"&gt;capacity factors&lt;/a&gt; for the two technologies aren't the same. For nuclear they're around 90%, while for solar they're around 20 %. This means we would need to install around 43 GW of nameplate capacity solar to produce the same amount of electricity, which costs more than R1.2T just by itself at $3/W. Then we would have to pay for the storage and the refitting of our grid to allow for the distributed generation which the solar plants would inevitably represent. I love solar, but we're not at the point where it can do the base load generation we would be purchasing with nuclear.&lt;/div&gt;</description><author>Negative Feedback</author><pubDate>Fri, 25 Sep 2015 17:31:24 GMT</pubDate><guid isPermaLink="true">http://negfeedback.blogspot.com/2015/09/why-dont-we-just-do-solar-instead-of.html</guid></item><item><title>Wild snails around the world</title><link>https://liza.io/wild-snails-around-the-world/</link><description>&lt;p&gt;Did you know that there is an entirely separate formula to calculate the distance between two points on the surface of a sphere? I mean&amp;hellip;it kind of makes sense when you think about it. The shortest distance between two points without accounting for the curvature of the sphere would go right through the sphere itself, making it pretty useless when calculating physical distance on, for example, the surface of the Earth.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Fri, 25 Sep 2015 01:16:16 GMT</pubDate><guid isPermaLink="true">https://liza.io/wild-snails-around-the-world/</guid></item><item><title>Group And Community Projects</title><link>https://venam.net/blog/programming/2015/09/25/group-work.html</link><description>Hello fellow readers,  In this post I'll talk about group and community projects.  Everyone has been part of multiple group projects throughout their life.  From school researches, to university presentations, to work. It's only by sharing ideas and finding common grounds that goals can be achieved.  However, it's hard to maintain cohesion and investment in a group.  There's a multitude of problems that arise, the reader can certainly assert it.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Fri, 25 Sep 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/programming/2015/09/25/group-work.html</guid></item><item><title>Python Code Optimization Tips</title><link>https://denvaar.dev/posts/python_code_optimization_tips.html</link><description>Tips from Guido Van Rossum about code optimization.</description><author>denvaar's website</author><pubDate>Thu, 24 Sep 2015 08:40:09 GMT</pubDate><guid isPermaLink="true">https://denvaar.dev/posts/python_code_optimization_tips.html</guid></item><item><title>Automated Testing of Dotfiles</title><link>https://michael.mior.ca/blog/automated-testing-of-dotfiles/</link><description>&lt;p&gt;Several years ago I started managing my dotfiles based on Zach Holman’s &lt;a href="https://github.com/holman/dotfiles"&gt;dotfiles repo&lt;/a&gt;.
His setup is quite nice and I found it relatively easy to adapt to my own purposes.
My workflow generally consisted of making a bunch of local changes until I was happy and then pushing to my own &lt;a href="https://github.com/michaelmior/dotfiles"&gt;GitHub fork&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The big problem I eventually found is that I wasn’t fully capturing the correct steps to reproduce my environment.
Every time that I tried to install my dotfiles on a new machine, I would be met with several errors that I would eventually resolve.
The fix would not always result in something which was reproducible on another machine.
I wanted a solution that would let me automatically test that my dotfiles would cleanly install every time I pushed to GitHub, so I turned to &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Traditional CI services would have been a bit of a pain to use with all the packages that needed to be installed.
&lt;a href="https://hub.docker.com/r/michaelmior/dotfiles/"&gt;Docker Hub&lt;/a&gt; made things nice and easy.
My &lt;a href="https://github.com/michaelmior/dotfiles/blob/a9eae90d466958948a53b3b583d69eba844ed8f7/Dockerfile"&gt;Dockerfile&lt;/a&gt; simply installs the necessary OS packages, adds a new user and then tries to run my install script.
I currently don’t have any other testing other than to ensure that the script exits without error, but this has already saved me a lot of trouble.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: I have since switched to using &lt;a href="https://travis-ci.org/michaelmior/dotfiles"&gt;Travis CI&lt;/a&gt; as I do with my other projects. It turns out this is easier than I expected. I still haven’t explicitly added any tests but even being able to confirm that the installation steps succeed is useful to ensure nothing breaks.&lt;/p&gt;</description><author>Michael Mior</author><pubDate>Thu, 24 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://michael.mior.ca/blog/automated-testing-of-dotfiles/</guid></item><item><title>Links - September 24th, 2015</title><link>https://faingezicht.com/links/2015/09/24/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 24 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/24/links/</guid></item><item><title>Bash SSH host management</title><link>https://www.danielcorin.com/posts/2015/2015-09-23-bash-ssh-host-management/</link><description>Bash SSH host management</description><author>Thought Eddies</author><pubDate>Wed, 23 Sep 2015 21:03:00 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2015/2015-09-23-bash-ssh-host-management/</guid></item><item><title>Me and Earl and the Dying Girl</title><link>https://olshansky.info/movie/me_and_earl_and_the_dying_girl/</link><description>Olshansky's review of Me and Earl and the Dying Girl</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 23 Sep 2015 20:57:25 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/me_and_earl_and_the_dying_girl/</guid></item><item><title>Mr. Robot: Season 1</title><link>https://olshansky.info/tv/mr._robot_season_1/</link><description>Olshansky's review of Mr. Robot: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 23 Sep 2015 18:07:05 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/mr._robot_season_1/</guid></item><item><title>Sync pip with Mac OS updates</title><link>https://xenodium.com/sync-pip-with-mac-os-updates</link><description>&lt;p&gt;My pip installation recently broke after a Mac OS update.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;$ pip
Traceback (most recent call last):
  File &amp;quot;/usr/local/bin/pip\n&amp;quot;, line 5, in &amp;lt;module&amp;gt;
    from pkg_resources import load_entry_point
  File &amp;quot;/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py\n&amp;quot;, line 2793, in &amp;lt;module&amp;gt;
    working_set.require(__requires__)
  File &amp;quot;/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py\n&amp;quot;, line 673, in require
    needed = self.resolve(parse_requirements(requirements))
  File &amp;quot;/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py\n&amp;quot;, line 576, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: pip==1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Updating my pip installation fixes the break:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ sudo easy_install -U pip
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 23 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/sync-pip-with-mac-os-updates</guid></item><item><title>Links - September 23rd, 2015</title><link>https://faingezicht.com/links/2015/09/23/links/</link><description>I am amazed by the fact that &lt;a href="http://blogs.wsj.com/digits/2015/09/18/silicon-valleys-economic-indicator-caltrain-ridership/"&gt;Caltrain ridership tracks the Nasdaq&lt;/a&gt;. This is the kind of relationship that I would never think about on my own, but once I read it, it clicked and makes perfect sense. I wonder if similar correlations can be found for other cities and their public transit.</description><author>Avy Faingezicht</author><pubDate>Wed, 23 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/23/links/</guid></item><item><title>Wooden Table</title><link>https://june.kim/wooden-table/</link><author>june.kim</author><pubDate>Tue, 22 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/wooden-table/</guid></item><item><title>Links - September 22nd, 2015</title><link>https://faingezicht.com/links/2015/09/22/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 22 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/22/links/</guid></item><item><title>Replacing Junos Pulse with OpenConnect</title><link>https://smcleod.net/2015/09/replacing-junos-pulse-with-openconnect/</link><description>&lt;p&gt;In an attempt to avoid using the Juniper Pulse (Now Pulse Secure) VPN client we tried OpenConnect but found that DNS did not work correctly when connected to the VPN.
This bug has now been resolved recently but has not made it&amp;rsquo;s way into a new build, in fact there have been no releases for 6 months.&lt;/p&gt;
&lt;p&gt;Luckily the OpenConnect was not too difficult to build from source.&lt;/p&gt;
&lt;h2 id="build-openconnect-on-osx"&gt;Build OpenConnect on OSX&lt;/h2&gt;
&lt;h3 id="remove-old-openconnect-and-install-deps"&gt;Remove old openconnect and install deps&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew remove openconnect
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install libxml2 lzlib openssl libtool libevent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="build-openconnect"&gt;Build openconnect&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget git.infradead.org/users/dwmw2/openconnect.git/snapshot/0f1ec30d17aa674142552e275bf3fac30d891b39.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar zxvf 0f1ec30d17aa674142552e275bf3fac30d891b39.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; openconnect-0f1ec30
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LIBTOOLIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;glibtoolize ./autogen.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/opt/gettext/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="to-connect"&gt;To connect&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo openconnect --juniper -u myusername www.myserver.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;re comfortable with allowing admin users to run openconnect without entering a sudo password, add the following using &lt;code&gt;sudo visudo&lt;/code&gt;:&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Tue, 22 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/09/replacing-junos-pulse-with-openconnect/</guid></item><item><title>As a Customer, I Want To See Up-to-Date Costs I've Incurred, Using a Web Application</title><link>https://www.databasesandlife.com/as-a-customer-i-want-to-see-up-to-date-costs-ive-incurred-using-a-web-application/</link><description>&lt;p class="intro"&gt;I think it's important, that in a software development company, as all others, customers get transparent up-to-the-minute information about what costs they have incurred. Alas my company can't provide that at the moment, due to our tooling (this is a deficiency, or at least difference of opinion, between me and LiquidPlanner, the tool we use for tracking time.) This is the email I sent to LiquidPlanner support explaining my position:&lt;/p&gt;
&lt;p&gt;I and my team do work. We use LiquidPlanner to track our done time. I can export the timesheet data and write invoices to my customers once a month. So far so good.&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Tue, 22 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/as-a-customer-i-want-to-see-up-to-date-costs-ive-incurred-using-a-web-application/</guid></item><item><title>Identifying redundant edges in a dependency graph</title><link>https://blog.tafkas.net/2015/09/22/identifying-redundant-edges-in-a-dependency-graph/</link><description>An ETL import graph is build on logical dependencies of the jobs to each other. So typically a SQL transformation job depends on all the previous jobs that create the tables used in the query. But once there are a certain number of jobs, dependencies often get a bit more complicated and some of them become redundant in the process.
A simple example can be seen in the dependency graph from figure, where the three red edges are redundant.</description><author>Tafkas Blog</author><pubDate>Tue, 22 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tafkas.net/2015/09/22/identifying-redundant-edges-in-a-dependency-graph/</guid></item><item><title>Black Mirror: Season 2</title><link>https://olshansky.info/tv/black_mirror_season_2/</link><description>Olshansky's review of Black Mirror: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 21 Sep 2015 17:30:12 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/black_mirror_season_2/</guid></item><item><title>Black Mirror: Season 1</title><link>https://olshansky.info/tv/black_mirror_season_1/</link><description>Olshansky's review of Black Mirror: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 21 Sep 2015 17:30:02 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/black_mirror_season_1/</guid></item><item><title>RAM is the new disk – and how to measure its performance – Part 2 – Tools</title><link>https://tanelpoder.com/2015/09/21/ram-is-the-new-disk-and-how-to-measure-its-performance-part-2-tools/</link><description>&lt;p&gt;[ &lt;a href="https://tanelpoder.com/2015/08/09/ram-is-the-new-disk-and-how-to-measure-its-performance-part-1/" target="_blank"&gt;part 1&lt;/a&gt; | part 2 | &lt;a href="https://tanelpoder.com/2015/11/30/ram-is-the-new-disk-and-how-to-measure-its-performance-part-3-cpu-instructions-cycles/" target="_blank"&gt;part 3&lt;/a&gt; ]&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://tanelpoder.com/2015/08/09/ram-is-the-new-disk-and-how-to-measure-its-performance-part-1/" target="_blank"&gt;previous article&lt;/a&gt; I explained that the main requirement for high-speed in-memory data scanning is column-oriented storage format for in-memory data. SIMD instruction processing is just icing on the cake. Let&amp;rsquo;s dig deeper. This is a long post, you&amp;rsquo;ve been warned.&lt;/p&gt;
&lt;h2 id="test-environment"&gt;Test Environment&lt;/h2&gt;
&lt;p&gt;I will cover full test results in the next article in this series. First, let&amp;rsquo;s look into the test setup, environment and what tools I used for peeking inside CPU hardware.&lt;/p&gt;
&lt;p&gt;I was running the tests on a relatively old machine with 2 CPU sockets, with 6-core CPUs in each socket (2s12c24t):&lt;/p&gt;
&lt;pre&gt;$ egrep "MHz|^model name" /proc/cpuinfo | sort | uniq -c
     24 cpu MHz		: &lt;strong&gt;2926.171&lt;/strong&gt;
     24 model name	: Intel(R) Xeon(R) CPU           X5670  @ &lt;strong&gt;2.93GHz
&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;The CPUs support SSE4.2 SIMD extensions (but not the newer AVX stuff):&lt;/p&gt;
&lt;pre&gt;$ grep ^flags /proc/cpuinfo | egrep "avx|sse|popcnt" | sed 's/ /\n/g' | egrep "avx|sse|popcnt" | sort | uniq
popcnt
sse
sse2
sse4_1
&lt;strong&gt;sse4_2&lt;/strong&gt;
ssse3
&lt;/pre&gt;
&lt;p&gt;Even though the /proc/cpuinfo above shows the CPU clock frequency as 2.93GHz, these CPUs have Intel Turboboost feature that allows some cores run at up to 3.33GHz frequency when not all cores are fully busy and the CPUs aren&amp;rsquo;t too hot.&lt;/p&gt;
&lt;p&gt;Indeed, the &lt;em&gt;turbostat&lt;/em&gt; command below shows that the CPU core executing my Oracle process was running at 3.19GHz frequency:&lt;/p&gt;
&lt;pre&gt;# turbostat -p sleep 1
pk cor CPU    %c0  &lt;strong&gt;GHz&lt;/strong&gt;  TSC SMI    %c1    %c3    %c6 CTMP   %pc3   %pc6
             6.43 3.02 2.93   0  93.57   0.00   0.00   59   0.00   0.00
 0   0   0   4.49 3.19 2.93   0  95.51   0.00   0.00   46   0.00   0.00
 0   1   1  10.05 3.19 2.93   0  89.95   0.00   0.00   50
 0   2   2   2.48 3.19 2.93   0  97.52   0.00   0.00   45
 0   8   3   2.05 3.19 2.93   0  97.95   0.00   0.00   44
 0   9   4   0.50 3.20 2.93   0  99.50   0.00   0.00   50
 0  10   5 &lt;strong&gt;100.00 &lt;span style="color: #ff0000;"&gt;3.19&lt;/span&gt;&lt;/strong&gt; 2.93   0   0.00   0.00   0.00   59
 1   0   6   6.25 2.23 2.93   0  93.75   0.00   0.00   44   0.00   0.00
 1   1   7   3.93 2.04 2.93   0  96.07   0.00   0.00   43
 1   2   8   0.82 2.15 2.93   0  99.18   0.00   0.00   44
 1   8   9   0.41 2.48 2.93   0  99.59   0.00   0.00   41
 1   9  10   0.99 2.35 2.93   0  99.01   0.00   0.00   43
 1  10  11   0.76 2.36 2.93   0  99.24   0.00   0.00   44

&lt;/pre&gt;
&lt;p&gt;I will come back to this CPU frequency turbo-boosting later when explaining some performance metrics.&lt;/p&gt;
&lt;p&gt;I ran the experiments in Oct/Nov 2014, so used a relatively early Oracle 12.1.0.2.1 version with a bundle patch (19189240) for in-memory stuff.&lt;/p&gt;
&lt;p&gt;The test was deliberately very simple as I was researching raw in-memory scanning and filtering speed and was not looking into join/aggregation performance. I was running the query below with different hints and parameters to change access path options:&lt;/p&gt;
&lt;pre&gt;SELECT COUNT(cust_valid) FROM customers_nopart c WHERE cust_id &amp;gt; 0
&lt;/pre&gt;</description><author>Tanel Poder Blog</author><pubDate>Mon, 21 Sep 2015 11:20:18 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2015/09/21/ram-is-the-new-disk-and-how-to-measure-its-performance-part-2-tools/</guid></item><item><title>So you want to work remotely...</title><link>https://josh.works/so-you-want-to-work-remotely</link><description>&lt;h2 id="joshs-rules-for-getting-a-sweet-remote-job"&gt;Josh’s “rules” for getting a sweet remote job&lt;/h2&gt;

&lt;p&gt;A few weeks ago, I met a fantastic guy who is contemplating next steps for work. He is great at what he does, and is thinking about what direction to go in his life. He’s young, and thought working remotely sounded pretty cool. I agreed, and then spent the next week or two thinking about what’s required to work remotely. &lt;/p&gt;

&lt;p&gt;Here’s the email I sent trying to explain all of this.&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;Hi {redacted},&lt;/p&gt;

&lt;p&gt;Prepare yourself for a long email. I’ve had a lot of thoughts rolling around my head related to this, and you’re getting them all. I’m going to work on cleaning this up and maybe sticking it online as a blog post for later. I’ve talked with many people about working remotely, so… here are some thoughts:&lt;/p&gt;

&lt;p&gt;Glad you got the bug for remote working!&lt;/p&gt;

&lt;p&gt;There’s lots of good things that come with working remotely, but there are lots of real and perceived barriers.&lt;/p&gt;

&lt;p&gt;So, let me offer some more encouragement and advice. &lt;/p&gt;

&lt;p&gt;First, there’s the matter of framing how you go about working remotely. Obviously you want to work remotely, but put yourself in the shoes of a prospective employer. They don’t care if you work remotely or not - they want you to do great work for them and make them an effective, profitable organization. &lt;/p&gt;

&lt;p&gt;So, if I can make up the imaginary &lt;strong&gt;Josh’s Rules of Getting a Remote Job&lt;/strong&gt;, this is what they’d be:&lt;/p&gt;

&lt;h3 id="rule-1-getting-a-remote-job-is-exactly-the-same-as-getting-a-regular-job-but-a-little-harder"&gt;Rule 1: Getting a remote job is exactly the same as getting a regular job, but a little harder&lt;/h3&gt;

&lt;p&gt;Companies that hire remotely tend to be younger, agile-er, and smaller. So every employee matters. Making a bad hire can be catastrophic in terms of
&lt;a href="http://resources.dice.com/report/the-cost-of-bad-hiring-decisions/"&gt;money&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Opportunity_cost"&gt;opportunity cost&lt;/a&gt;. Your job is to make it very, very obvious that hiring YOU is a great decision. In fact, you want to be so good at what you do that passing up on you is a terrible decision. &lt;/p&gt;

&lt;p&gt;This right here is the difference in mental approaches from an “average” job hunter and a high-performing job hunter. &lt;/p&gt;

&lt;p&gt;The average person talks about all the reasons that they’re qualified to do the work, how quick they are to learn, how happy they are for the opportunity, etc. None of this puts a CEO/hiring manager/team lead at ease. They think:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Of course this person wants to work at my company. I have a kick-ass, quickly growing company and pay my employees well. &lt;strong&gt;I am looking for more than “just” a willing person.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id="rule-2-a-top-performing-employee-approaches-a-job-opportunity-the-same-way-a-consultant-approaches-a-possible-gig"&gt;Rule 2: A top-performing employee approaches a job opportunity the same way a consultant approaches a possible gig.&lt;/h3&gt;

&lt;p&gt;First, qualify the opportunity. Is this something that you could do well?&lt;/p&gt;

&lt;p&gt;Next, assuming it’s a job they could do well, get into “proposal” stage. &lt;/p&gt;

&lt;p&gt;Tell them (in as many words)&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If I were hired to do this job, these are the things that I would do, these are the projects I would work on, and here’s the impact it would have on the company’s bottom line.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you can walk someone down the path from “Hire me” to “I’ll help you make \($,\)$/year more than you would otherwise”, if the the amount you’ll make them is 3x your annual salary, you’re in a pretty good place.&lt;/p&gt;

&lt;p&gt;All of a sudden, rather than the risk being:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;hire this person and it might not work out&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The risk becomes becomes:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;If I don’t hire this person, I might miss this opportunity to make $$$&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By framing the conversation like this, you’re showing that you are aware of their needs as a business, and that you’ll hit the ground running. You don’t need your hand held, you’re able to execute ideas as appropriate. &lt;/p&gt;

&lt;p&gt;By the way - none of this should be construed as a suggestion to “make up BS”. There are plenty of ways you can make contributions to a company and help them retain users, get new users, save money, earn more money, grow accounts, bring in new business, hire better people, keep existing employees longer, etc.&lt;/p&gt;

&lt;p&gt;This is another topic for another time, though. Just know that &lt;em&gt;you need to focus on the value you provide to a company.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id="rule-3-a-top-performing-employee-has-concrete-numbers-and-stories-showing-their-skill"&gt;Rule 3: A top-performing employee has concrete numbers and stories showing their skill. &lt;/h3&gt;

&lt;p&gt;You’ll be asked about your prior experience at your current job. Don’t just say “I did {job} at {company}”. That’s boring. That makes you a risky hire. &lt;/p&gt;

&lt;p&gt;You’ll say something like&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When I was a {position} at {company}, I was tasked with {responsibility}. Not only did I do that task well, but I took on a few side projects to increase the effectiveness of the team, and decrease the friction of some processes. For example… {story showing how you made improvements that impacted the business, with figures to back it up}.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id="rule-4-your-online-persona-is-the-primary-thing-that-will-get-you-hired-craft-a-good-one"&gt;Rule 4: Your online persona is the primary thing that will get you hired. Craft a good one. &lt;/h3&gt;

&lt;p&gt;When you see a job opportunity go by, you don’t just submit a resume and let it go. You find the person in charge of hiring, or someone on the team, or the company CEO, and you send them a short email. In that email, you make it easy for them to discover how competent and skilled you are. &lt;/p&gt;

&lt;p&gt;That could be as simple as a link to your personal website in your signature. A personal website is extremely useful for showing a lot of things at once:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Tech savvy&lt;/strong&gt; (it is simultaneously extremely complicated and unbelievably easy to set up a personal website. Try to get &lt;code class="language-plaintext highlighter-rouge"&gt;firstNameLastName.com&lt;/code&gt;. If not, look for &lt;code class="language-plaintext highlighter-rouge"&gt;firstName.com&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;firstNameLastName.io&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;firstName.io&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;firstNameLastName.is&lt;/code&gt;, etc. Look around. Find people that have strong personal brands, see what their URL is, and try to get that. (If Jekyll interests you, I wrote this guide to building a personal website in Jekyll: &lt;a href="/build-a-personal-site-with-jekyll"&gt;Build a Personal Website in Jekyll - A Detailed Guide For First-Timers&lt;/a&gt;)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Room to show that you can communicate effectively.&lt;/strong&gt; Remote companies live and die on the written word. Can you communicate something interesting via text? What do you write about? It doesn’t matter, as long as you might be helping someone. Before you publish anything, answer this question: “Does what I’m about to publish have the potential to help someone?”&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the answer is yes, publish.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Showcase your non-writing skills&lt;/strong&gt;. Do you put cool stuff on Instagram and Twitter? Well, put those on your personal website. Do you read a lot? Make book recommendations and include a reason or two for why someone should read the book. Are you athletic? There’s ways to show that too. &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;The skills required to work remotely tend to overlap heavily with the skills required to create a website.&lt;/strong&gt; 
&lt;a href="http://www.wsj.com/articles/SB10001424053111903480904576512250915629460"&gt;Software is eating the world&lt;/a&gt;, so get conversant in the technology.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;You don’t have to go full web-developer to put a website online, just as you don’t need to be a software engineer to work at a software company&lt;/strong&gt;. But know the tools available to you that allow you to be effective at technical tasks. The idea behind using &lt;a href="https://webflow.com/"&gt;Webflow&lt;/a&gt; or &lt;a href="https://www.squarespace.com/"&gt;Squarespace&lt;/a&gt; to publish a website is the same as using &lt;a href="https://www.kissmetrics.com/"&gt;KissMetrics&lt;/a&gt; or &lt;a href="https://www.fullstory.com"&gt;FullStory&lt;/a&gt; to gather customer data.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Phew. That’s it for now.&lt;/p&gt;

&lt;p&gt;-Josh&lt;/p&gt;

&lt;p&gt;PS All of this is general advice. You’ll need to become a specialist. That’s hard work. Holy crap, it’s hard. That is a whole other topic. But this is maybe a helpful starting point.&lt;/p&gt;

&lt;p&gt;Want to soak in the wisdom of experts? Use &lt;a href="https://feedly.com/"&gt;https://feedly.com&lt;/a&gt; to subscribe to the websites of people that seem to know what they’re talking about. &lt;/p&gt;

&lt;p&gt;Read what they think about things, and you’ll be wiser for it. :)&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Mon, 21 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/so-you-want-to-work-remotely</guid></item><item><title>Links - September 21st, 2015</title><link>https://faingezicht.com/links/2015/09/21/links/</link><description>I can't recommend &lt;a href="http://www.theatlantic.com/magazine/archive/2015/10/how-david-hume-helped-me-solve-my-midlife-crisis/403195/"&gt;Gopnik's article&lt;/a&gt; enough. It is a really interesting read about history, faith, and human life. If you read any online article today, this should be it.</description><author>Avy Faingezicht</author><pubDate>Mon, 21 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/21/links/</guid></item><item><title>Chinatown treats review</title><link>https://xenodium.com/chinatown-treats-review</link><description>&lt;h2&gt;Recommended? yep&lt;/h2&gt;
&lt;p&gt;There's a corner in Chinatown hosting some truly superb treats. If you get caught in the rush between Newport court and Newport place, you'd likely fail to notice some the awesome street food stands.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/chinatown-treats/chinatown.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/chinatown-treats/newport-court.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;Chilly squid&lt;/h2&gt;
&lt;p&gt;I've walked past this place many times and never noticed it. They serve a handful of items, but the grilled chilly squid skewers caught my attention. They're grilled, brushed with chilly sauce and finished with sprinkled sesame and cumin seeds. Super tasty.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/chinatown-treats/squid-stand.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/chinatown-treats/chilly-squid-1.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/chinatown-treats/chilly-squid-2.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;Pancake + Crisp + Egg + Hot chillies = Jiān Bǐng 煎餅&lt;/h2&gt;
&lt;p&gt;I first had these delicious breakfast savory pancakes at a Beijing street food stall. Never expected to randomly find Jiān Bǐng in London. It's a crepe with an additional egg spread, hoisin sauce, chilly sauce, hot chillies, topped with spring onions and coriander, all wrapping a wonderfully crispy bread cracker. And.. it's awesome.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/chinatown-treats/pancake-3.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;Tai Yaki&lt;/h2&gt;
&lt;p&gt;Chinatown Bakery is hard to miss. Pedestrian traffic slows down as we all fall under the spell of the Tai Yaki machine. This wonderful assembly line produces fish-shaped sweet waffles filled with custard. They are the perfect dessert after some savory street snacks. You can get a bag of 4 for £2.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/chinatown-treats/fish-1.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/chinatown-treats/fish-4.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;All near each other&lt;/h2&gt;
&lt;p&gt;All these delights are within a stone's throw away from each other.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/chinatown-treats/pano.png" /&gt;&lt;/p&gt;
&lt;h2&gt;Useful?&lt;/h2&gt;
&lt;p&gt;Was this post useful to you? do &lt;a href="https://twitter.com/xenodium/status/646101779281801216"&gt;reply&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;Better suggestion?&lt;/h2&gt;
&lt;p&gt;London is full of overhyped, gimmicky, and unnecessarily expensive restaurants. Very few deliver truly awesome food (even those expensive ones). Got suggestions? I'd love to hear from you &lt;a href="https://twitter.com/xenodium"&gt;@xenodium&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 20 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/chinatown-treats-review</guid></item><item><title>Building a MicroBus application</title><link>https://daniellittle.dev/building-a-microbus-application</link><description>I often like to think of software architecture as the art of structuring software. It's goal being to meet requirements while at the same…</description><author>Daniel Little Dev</author><pubDate>Sat, 19 Sep 2015 08:31:08 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/building-a-microbus-application</guid></item><item><title>Taking up the writing habit again</title><link>https://benovermyer.com/blog/2015/09/taking-up-the-writing-habit-again/</link><description>&lt;p&gt;A few days ago, I migrated all of my blog posts from my last primary blog on WordPress.com to this blog. In the process, I read over a lot of old posts. I noticed something interesting: back in 2007 and 2008, I was writing blog posts with fair regularity. Now, it's a rarity. The blog posts back then were fairly journal-like in character. They told a story of what I was working on, how I felt on certain subjects, and described some of my adventures in games I was playing at the time. The blog posts I wrote in the recent past trend towards the same thing when they're more frequent. When I choose to try and write something &lt;em&gt;useful&lt;/em&gt;, like the Laravel on Docker post, it takes a lot longer, a lot more effort, and is a lot more intimidating to start on. So as I sit here sipping on my orange pekoe black tea, listening to relaxing acoustic guitar, and writing these words, I'm thinking that I should allow myself to write journal-style posts again. This, if for no other reason than to ingrain that old writing habit. It'll be easier to write the big, important stuff if the simple stuff - the writing - comes naturally, right?&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sat, 19 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/09/taking-up-the-writing-habit-again/</guid></item><item><title>2015-09-19/01</title><link>https://ho.dges.online/pictures/2015-09-19-01/</link><description/><author>ho.dges.online</author><pubDate>Sat, 19 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-09-19-01/</guid></item><item><title>2015-09-19/02</title><link>https://ho.dges.online/pictures/2015-09-19-02/</link><description>&lt;p&gt;Ed in his natural environment.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 19 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-09-19-02/</guid></item><item><title>2015-09-19/03</title><link>https://ho.dges.online/pictures/2015-09-19-03/</link><description/><author>ho.dges.online</author><pubDate>Sat, 19 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-09-19-03/</guid></item><item><title>More location and temperature stuff</title><link>https://liza.io/more-location-and-temperature-stuff/</link><description>&lt;p&gt;I realized I didn&amp;rsquo;t actually include any implementation details when writing my sleepy post about stable locations and temperature the other night. I figured I&amp;rsquo;d elaborate on that now.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Fri, 18 Sep 2015 20:10:43 GMT</pubDate><guid isPermaLink="true">https://liza.io/more-location-and-temperature-stuff/</guid></item><item><title>React bookmarks</title><link>https://xenodium.com/react-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/dailyjs/11-mistakes-ive-made-during-react-native-redux-app-development-8544e2be9a9"&gt;11 mistakes I’ve made during React Native / Redux app development&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=10962784"&gt;9 things every React.js beginner should know (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://camjackson.net/post/9-things-every-reactjs-beginner-should-know"&gt;9 things every React.js beginner should know&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://css-tricks.com/snippets/css/a-guide-to-flexbox/"&gt;A Complete Guide to Flexbox&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wix/react-native-navigation"&gt;A complete native navigation solution for React Native with optional redux support - nav bars, tabs, drawer, modals&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mrn.js.org/"&gt;A Material Design style React Native component library&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/syrusakbary/react-native-refresher/blob/master/README.md"&gt;A pull to refresh ListView for React Native&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nerds.airbnb.com/facebook-react-native/"&gt;Adam Wolf's React Native talk&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://moduscreate.com/aligning-children-using-flexbox-in-react-native/"&gt;Aligning Children using Flexbox in React Native&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://egghead.io/lessons/react-applying-basic-styles-in-react-native"&gt;Applying baisc styles in react native (video)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://egghead.io/lessons/react-applying-basic-styles-in-react-native"&gt;Applying Basic Styles in React Native&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/floydophone/status/649786438330945536"&gt;Avoid premature fluxing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/enaqx/awesome-react/"&gt;Awesome React: a collection of awesome things regarding React ecosystem&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/babel/babel-eslint"&gt;babel-eslint&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/infinite-red/beginner-s-guide-to-using-cocoapods-with-react-native-46cb4d372995#.i87ebbwl0"&gt;Beginner’s Guide to Using CocoaPods with React Native&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/delivery-com-engineering/react-native-in-an-existing-ios-app-delivered-874ba95a3c52#.kin2ke23s"&gt;Beyong React Native's &amp;quot;getting started guide&amp;quot;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.bonnieeisenman.com/"&gt;Bonnie Eisenman's blog (some react)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://corbt.com/posts/2015/12/22/breaking-up-heavy-processing-in-react-native.html"&gt;Breaking up Heavy Processing in React Native (Blog post)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=cI9bDvDEsYE"&gt;Brent Vatne - Building li.st for Android with Exponent and React Native at react-europe 2016&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tadeuzagallo.com/blog/react-native-bridge/"&gt;Bridging in React Native: An in-depth look into React Native's core&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tech.taskrabbit.com/blog/2015/10/18/building-react-native-apps/"&gt;Building React Native Apps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://makeitopen.com/tutorials/building-the-f8-app"&gt;Bulding the F8 app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/adamterlson/cairn"&gt;Cairn: a tiny library for React Native replacing default styling syntax&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/the-exponent-log/coding-apps-with-react-native-at-exponent-7a5922da27bf#.udrk6kz05"&gt;Coding Apps with React Native at Exponent&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://codewinds.com/blog/2015-04-02-emacs-flycheck-eslint-jsx.html"&gt;Configuring Emacs to use eslint and babel with flycheck for javascript and React.js JSX&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/markerikson/react-redux-links"&gt;Curated tutorial and resource links I've collected on React, Redux, ES6, and more&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=xsSnOQynTHs"&gt;Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@shaheenghiassy/deep-diving-react-native-debugging-ea406ed3a691"&gt;Deep Diving React Native Debugging&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ilikekillnerds.com/2015/02/developing-react-js-components-using-es6/"&gt;Developing React.js Components Using ES6&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rebeccahughes/react-native-device-info"&gt;Device Information for React Native iOS and Android&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://engineering.hexacta.com/didact-learning-how-react-works-by-building-it-from-scratch-51007984e5c5"&gt;Didact: a DIY guide to build your own React – Hexacta Engineering&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/"&gt;ECMAScript 5 Strict Mode, JSON, and More&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Intellicode/eslint-plugin-react-native"&gt;ESLint plugin for React Native&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gcazaciuc/eslint-plugin-flowtype"&gt;eslint-plugin-flowtype&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://exponentjs.com/"&gt;Exponentjs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/coodoo/flowery"&gt;Flowery: prettifies the result generated by Facebook Flow&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.krawaller.se/img/flux-diagram.png"&gt;Flux diagram&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://egghead.io/series/getting-started-with-redux"&gt;Getting Started with Redux (30 lessons)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/joshdover/235714771d94509a83609b16d232014a"&gt;Idiomatic React Testing Patterns&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/react-native/commit/1303e6d0392e8bc4da1198c98fc8cd7ad488b81c"&gt;Implement XHR timeout for Android and IOS natively&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/react-native/commit/e4c53c28aea7e067e48f5c8c0100c7cafc031b06"&gt;Improved shadow performance on iOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11093275"&gt;Learn Raw React – No JSX, No Flux, No ES6, No Webpack (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/DianQK/LearnRxSwift/blob/master/README.md"&gt;LearnRxSwift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/react-native/issues/499#issuecomment-128836161"&gt;ListView rendering issue&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/marcshilling/react-native-image-picker"&gt;Native image/photo picker for react native&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=dOSwHABLvdM"&gt;Native react navigation in every platform&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/geirman/offlineMovies"&gt;OfflineMovies: retrieves movies from an api and caches the result offline&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://corbt.com/posts/2015/09/16/one-day-with-react-native-for-android.html"&gt;One day with React Native for Android&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v%3Dfh_Y4mPivuM"&gt;Optimizing React Native views (Screencast)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=fh_Y4mPivuM"&gt;Optimizing React Native views (Screencast)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://facebook.github.io/react/docs/context.html"&gt;Passing info automatically through a tree&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@sharathprabhal/progressive-image-loading-in-react-native-ecc88e724343#.ffudiaxf3"&gt;Progressive image loading&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://reactscript.com/categories/layout/"&gt;React and React Native Layout Components - ReactScript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kriasoft/react-component-starter"&gt;React Component Starter Kit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://iamdustan.com/2016/01/18/react-custom-renderers/"&gt;React Custom Renderers (Blog post)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://facebook.github.io/react/contributing/design-principles.html"&gt;React Design Principles&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/naoufal/react-native-accordion"&gt;React Native accordion&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mastermoo/react-native-action-button"&gt;React Native action button&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/react-weekly/react-native-and-typescript-ad57b7413ead#.w5lky7jol"&gt;React Native and Typescript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://browniefed.com/blog/2015/08/01/react-native-animated-listview-row-swipe/"&gt;React Native Animated ScrollView Row Swipe Actions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zaicheng.me/2016/06/20/react-native-initial-setup/"&gt;React Native App initial setup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/delivery-com-engineering/react-native-in-an-existing-ios-app-dynamic-routing-7013e03fa9ad#.cyv7v7oez"&gt;React Native in an Existing iOS App: Dynamic Routing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ericvicenti/react-native-community/"&gt;React Native in the Github Community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://moduscreate.com/react-native-layout-system/"&gt;React Native Layout System&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lelandrichardson/react-native-maps"&gt;React Native Mapview component for iOS + Android&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/react-native-material-design/react-native-material-design"&gt;React Native Material Design (react-native-material-design)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/xinthink/react-native-material-kit"&gt;React Native Material Design (xinthink)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://us10.campaign-archive2.com/?u%3Ddb0dd948e2b729ee62625b1a8&amp;amp;id%3Dfbfe8b6010&amp;amp;e%3Dc7b5ce9f56"&gt;React Native Newsletter - Issue #24&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://us10.campaign-archive2.com/?u%3Ddb0dd948e2b729ee62625b1a8&amp;amp;id%3D674b414994&amp;amp;e%3Dc7b5ce9f56"&gt;React Native Newsletter - Issue #25&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rnpm/rnpm"&gt;React Native Package Manager (rnpn)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rnplay.org/"&gt;React Native Playground&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://npm.taobao.org/package/react-native-scrollable-decorator"&gt;React Native scrollable decorator&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/marty-wang/react-native-toolkit"&gt;React Native Toolkit (navigation examples)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.raywenderlich.com/99473/introducing-react-native-building-apps-javascript"&gt;React Native Tutorial: Building Apps with JavaScript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@Jpoliachik/react-native-s-layoutanimation-is-awesome-4a4d317afd3e#.97zx978rl"&gt;React Native’s LayoutAnimation is Awesome&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://aeflash.com/2015-02/react-tips-and-best-practices.html"&gt;React Tips and Best Practices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=14144142"&gt;React-Move – Animate anything in React (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lwansbrough/react-native-camera"&gt;react-native-camera: A Camera component for React Native&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aksonov/react-native-redux-router"&gt;react-native-redux-router (replace push/pop screens with easy syntax)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.reactjsprogram.com/"&gt;React.js Program: A project based, linear approach to learning React.js and the React.js ecosystem&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://react.parts/native"&gt;react.parts/native feed&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=dwP1TNXE6fc"&gt;Reactive Programming Overview&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aerofs/react-native-auto-updater"&gt;ReactNativeAutoUpdater&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rackt/redux"&gt;Redux: Predictable state container for JavaScript apps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jlongster.com/Removing-User-Interface-Complexity,-or-Why-React-is-Awesome"&gt;Removing User Interface Complexity, or Why React is Awesome&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@elieslama/responsive-design-in-react-native-876ea9cd72a8#.cjpedynak"&gt;Responsive Design in React Native&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rnplay.org/"&gt;rnplay.org: Test and share React Native code samples&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bartonhammond/snowflake"&gt;Snowflake (React iOS/Android + Redux + Jest testable + parse.com + bitrise.io)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hharnisc.github.io/2015/04/15/react-native-and-meteor.html"&gt;Some Thoughts On Gluing React Native and Meteor (Blog post)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.schibsted.pl/2015/10/testing-react-native-components-with-jest/"&gt;Testing react Native with jest&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.firebase.com/blog/2016-01-20-tutorial-firebase-react-native.html"&gt;The beginners guide to React Native and Firebase (Blog post)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/swlh/the-case-for-flux-379b7d1982c6#.109lf7s2a"&gt;The Case for Flux&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Reactive-Extensions/RxJS"&gt;The Reactive Extensions for JavaScript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.reactivemanifesto.org/"&gt;The reactive manifesto&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://facebook.github.io/react/docs/thinking-in-react.html"&gt;Thinking in React&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getsiphon.com/blog/2016/01/20/future-of-app-development/"&gt;Thoughts on the future of mobile app development (Blog post)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/the-react-native-log/tips-for-styling-your-react-native-apps-3f61608655eb#.tg2qh13vd"&gt;Tips for styling your React Native apps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stanleycyang.github.io/technology/reactjs/native/ios/2015/10/04/react-native-tutorial-with-navigation-and-animation.html"&gt;Tutorial: Handcrafting an iOS Application with React Native (and lots of love)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@jcfrancisco/unit-testing-react-native-components-a-firsthand-guide-cea561df242b#.arff9dygw"&gt;Unit Testing React Native Components: A Firsthand Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/infinite-red/using-redux-saga-to-simplify-your-growing-react-native-codebase-2b8036f650de#.382a5inf8"&gt;Using redux-saga To Simplify Your Growing React Native Codebase&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/shoutem/ways-to-pass-objects-between-native-and-javascript-in-react-native-c3dcae7bf4f5"&gt;Ways to pass objects between native and JavaScript in React Native&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.zmxv.com/2015/09/what-i-learned-from-building-react.html"&gt;What I learned from building with React&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=QQRDcYsN4xs"&gt;Why React Native is Better than Native for Your Mobile Application&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://addyosmani.com/writing-modular-js/"&gt;Writing Modular JavaScript With AMD, CommonJS &amp;amp; ES Harmony&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/johnmastro/react-snippets.el"&gt;Yasnippets for React&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 18 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/react-bookmarks</guid></item><item><title>Links - September 18th, 2015</title><link>https://faingezicht.com/links/2015/09/18/links/</link><description/><author>Avy Faingezicht</author><pubDate>Fri, 18 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/18/links/</guid></item><item><title>Getting to Know Fiddler: Part VIII: It isn't all rainbows and unicorns</title><link>https://joshuarogers.net/articles/2015-09/getting-know-fiddler-part-viii/</link><description>Roughly a year ago I posted what I expected to be the last entry in my Fiddler series. Each of the seven entries had focused on various ways that Fiddler could help improve our development life cycle. They represented the highlight reel.
All isn't perfect though, and where there is a highlight reel, there tends to be outtakes as well. So, here goes: here's a few ways you can use Fiddler to slow down your development process.</description><author>Joshua Rogers</author><pubDate>Thu, 17 Sep 2015 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2015-09/getting-know-fiddler-part-viii/</guid></item><item><title>Links - September 17th, 2015</title><link>https://faingezicht.com/links/2015/09/17/links/</link><description>I started a new book this week, which means my time has shifted from online consumption to staring at &lt;a href="http://www.amazon.com/Primates-Memoir-Neuroscientists-Unconventional-Baboons/dp/0743202414"&gt;dead trees&lt;/a&gt;. More on that soon.</description><author>Avy Faingezicht</author><pubDate>Thu, 17 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/17/links/</guid></item><item><title>Walls by Urusla K Le Guin</title><link>https://ho.dges.online/words/commonplace/walls-by-urusla-k-le-guin/</link><description>&lt;blockquote&gt;
&lt;p&gt;“Like all walls, it was ambiguous, two-faced. What was inside it and was was outside it depended upon which side of it you were on.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Urusla K Le Guin, The Dispossessed.&lt;/em&gt;&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Thu, 17 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/walls-by-urusla-k-le-guin/</guid></item><item><title>Bringing snail stables down to Earth</title><link>https://liza.io/bringing-snail-stables-down-to-earth/</link><description>&lt;p&gt;SnailLife snail stables have always lived in the ether - in some virtual universe with no physical location. Since I&amp;rsquo;m trying to make SnailLife based in reality, users&amp;rsquo; snail stables should also be based in real locations. This is why now, upon registration, the user&amp;rsquo;s physical location is used as the location of their snail stable.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Wed, 16 Sep 2015 21:28:31 GMT</pubDate><guid isPermaLink="true">https://liza.io/bringing-snail-stables-down-to-earth/</guid></item><item><title>Chef's Table: Season 1</title><link>https://olshansky.info/tv/chefs_table_season_1/</link><description>Olshansky's review of Chef's Table: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 16 Sep 2015 16:58:44 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/chefs_table_season_1/</guid></item><item><title>Narcos: Season 1</title><link>https://olshansky.info/tv/narcos_season_1/</link><description>Olshansky's review of Narcos: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 16 Sep 2015 16:58:38 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/narcos_season_1/</guid></item><item><title>Chinese rice vinegar</title><link>https://xenodium.com/chinese-rice-vinegar</link><description>&lt;p&gt;Note to self to buy &lt;a href="http://www.amazon.co.uk/dp/B00OG3L7N6/ref%3Dsr_1_1?ie%3DUTF8&amp;amp;qid%3D1442442376&amp;amp;sr%3D8-1&amp;amp;"&gt;Gold Plum Chinkiang Vinegar&lt;/a&gt;. Awesome with dim sum.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/chinese-rice-vinegar/chinkiang-vinegar.jpg" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 16 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/chinese-rice-vinegar</guid></item><item><title>Links - September 16th, 2015</title><link>https://faingezicht.com/links/2015/09/16/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 16 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/16/links/</guid></item><item><title>Heroku Data Links with Postgres and Redis</title><link>https://www.brightball.com/articles/heroku-data-links-with-postgres-and-redis</link><description>PostgreSQL has a great feature called Foreign Data Wrappers (FDW) that allows it to connect directly to outside systems. Although the setup can be a little complicated, once it’s available you can run queries with joins or subqueries against them, insert data, create views, etc. Heroku has dramatically simplified the process of using FDW with PostgreSQL and Redis thanks to Data Links. Let’s try it out.</description><author>Brightball Articles</author><pubDate>Wed, 16 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/heroku-data-links-with-postgres-and-redis</guid></item><item><title>PostgreSQL replication using Bucardo</title><link>https://srijan.ch/postgresql-replication-using-bucardo</link><description>Keeping a live replica of selected PostgreSQL tables using Bucardo</description><author>Srijan Choudhary, all posts</author><pubDate>Tue, 15 Sep 2015 21:05:00 GMT</pubDate><guid isPermaLink="true">https://srijan.ch/postgresql-replication-using-bucardo</guid></item><item><title>Portable Book Stand</title><link>https://june.kim/book-stand/</link><author>june.kim</author><pubDate>Tue, 15 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/book-stand/</guid></item><item><title>Links - September 15th, 2015</title><link>https://faingezicht.com/links/2015/09/15/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 15 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/15/links/</guid></item><item><title>What's in a Name?</title><link>https://xavd.id/blog/post/whats-in-a-name/</link><description>undefined&lt;br /&gt;&lt;br /&gt;&lt;a href="https://xavd.id/blog/post/whats-in-a-name/"&gt;Read the whole thing&lt;/a&gt;.</description><author>The David Brownman Blog</author><pubDate>Tue, 15 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xavd.id/blog/post/whats-in-a-name/</guid></item><item><title>Links - September 14th, 2015</title><link>https://faingezicht.com/links/2015/09/14/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 14 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/14/links/</guid></item><item><title>Eigenfaces reconstructions</title><link>https://bastian.rieck.me/blog/2015/eigenfaces_reconstruction/</link><description>&lt;p&gt;While learning about &lt;a href="https://en.wikipedia.org/wiki/Principal_component_analysis"&gt;&amp;ldquo;principal component analysis&amp;rdquo;&lt;/a&gt;
for the first time, I also encountered the intriguing world of &lt;em&gt;eigenfaces&lt;/em&gt;. Briefly put, back in
the mists of time—at least in computer science terms—&lt;a href="https://www.cs.ucsb.edu/~mturk"&gt;Matthew
Turk&lt;/a&gt; and &lt;a href="http://web.media.mit.edu/~sandy"&gt;Alex Pentland&lt;/a&gt; came up
with an ingenious approach towards face recognition and classification. At it’s core, the
method consists of nothing but an eigenvalue decomposition. Let me briefly outline the steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Acquire a set of images showing faces. I am assuming that the images are grey-scale because this
means that we do not have to think about different colour channels.&lt;/li&gt;
&lt;li&gt;Treat each digital image as a vector in a high-dimensional space by “flattening” the
image vector. An image of dimensions 192 ×64 pixels becomes a 12288-dimensional vector,
for example.&lt;/li&gt;
&lt;li&gt;Calculate the &lt;em&gt;mean face&lt;/em&gt; of the data set and subtract it from all images. This corresponds to
centring the distribution of faces.&lt;/li&gt;
&lt;li&gt;Put all vectors into a matrix. The result is a matrix with as many rows as the dimensions
of the faces, and as many columns as there are faces.&lt;/li&gt;
&lt;li&gt;Calculate the eigenvalue decomposition of the sample covariance matrix. This step hides a clever
trick: We do not calculate the sample covariance matrix of the original matrix, which would be a
square matrix with the row dimension of the original data, for example 12288 ×12288.
Instead, we calculate the &lt;em&gt;transpose&lt;/em&gt; of this matrix, which uses the column dimension of the
original data. This matrix will hence only have as many rows and columns as there are faces in the
data. It can be shown that an any eigenvector of this matrix multiplied with the original matrix
yields an eigenvector of the large covariance matrix.&lt;/li&gt;
&lt;li&gt;Of course, we do not use &lt;em&gt;all&lt;/em&gt; eigenvalues and eigenvectors but rather only as many until we have
reached, say, 95% of explained variance. This removes a surprisingly large amount of data.&lt;/li&gt;
&lt;li&gt;If we have the reduced eigensystem, we can project any &lt;em&gt;new&lt;/em&gt; face to the (reduced) basis of
eigenvectors. This allows us to embed them in what Turk and Pentland call the “face
space”.&lt;/li&gt;
&lt;li&gt;The projection permits us to decide whether something is a face at all by checking whether it is
sufficiently close to the other vectors in “face space”. Furthermore, it permits &lt;em&gt;face
classification&lt;/em&gt; by assigning a known face to its nearest neighbour (or to its nearest class of
faces). These operations only require basic vector multiplication operations, so they are very
cheap.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Such a pretty neat algorithm deserves a neat implementation. I tried to write one myself in Python.
You can find the code in the &lt;a href="https://github.com/Pseudomanifold/Eigenfaces"&gt;&lt;em&gt;Eigenfaces&lt;/em&gt; repository on my GitHub
profile&lt;/a&gt;. As always, it is licensed under an MIT
license. Note that the script currently only supports the &lt;em&gt;reconstruction&lt;/em&gt; aspect of faces. It will
randomly partition input data into training and test data, perform the eigensystem calculations on
the training data, and attempt the reconstruction on the test data.&lt;/p&gt;
&lt;p&gt;I used a classical database of faces, the &lt;em&gt;Yale faces&lt;/em&gt; data, which has been preprocessed by &lt;a href="http://vismod.media.mit.edu/vismod/classes/mas622-00/datasets"&gt;some
nice folks at MIT&lt;/a&gt;. In the
repository, I only included the original and cropped variants of the faces—the preprocessed
data set contains much more.&lt;/p&gt;
&lt;p&gt;The results are interesting and highlight some of problems with the approach. Since the
eigendecomposition is completely agnostic concerning any sorts of facial features, it may
“learn” the wrong thing. Input data needs to be chosen carefully and should ideally be
already cropped. Otherwise, the reconstruction quality is not very great. For example, this happens
when I train on 100 out of 165 images with 95% explained variance:&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://bastian.rieck.me/images/eigenfaces_example_original.png"&gt;&lt;img alt="Example reconstruction on original data" src="https://bastian.rieck.me/images/eigenfaces_example_original.png" /&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;We can see that our reconstruction (left) captures mostly the uninteresting stuff, namely the
position of the head, as well as some lighting details, in comparison to the original (right).
Here”s a similar example with the &lt;em&gt;cropped&lt;/em&gt; faces:&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://bastian.rieck.me/images/eigenfaces_example_cropped.png"&gt;&lt;img alt="Example reconstruction on cropped data" src="https://bastian.rieck.me/images/eigenfaces_example_cropped.png" /&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;This version is much better. Of course, it also contains the ghostly remains of the glasses, but all
in all, the reconstruction is more true to the original.&lt;/p&gt;
&lt;p&gt;For such a conceptually simple algorithm, these are rather nice results. It is very intriguing to
see how well even simple classifiers can perform. If you want to play with the algorithm yourself,
please &lt;a href="https://github.com/Pseudomanifold/Eigenfaces"&gt;grab a copy of the repository&lt;/a&gt;.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 13 Sep 2015 16:53:04 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/eigenfaces_reconstruction/</guid></item><item><title>A walk from the subway station — inspired by The Hunger Games</title><link>https://olshansky.info/posts/2015-09-12-a-walk-from-the-subway-station-inspired-by-the-hunger-games/</link><description>Prior to my senior year in College, I made my way through the Hunger Games Trilogy. I read all three books back-to-back in a relatively…</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 13 Sep 2015 09:12:08 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/posts/2015-09-12-a-walk-from-the-subway-station-inspired-by-the-hunger-games/</guid></item><item><title>Use ImageMagick to batch-resize images</title><link>https://xenodium.com/use-imagemagick-to-batch-resize-images</link><description>&lt;p&gt;Using percentage:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ mogrify -resize 10% *.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Using dimensions:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ mogrify -resize 120x120 *.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lots of other alternatives from ImageMagick's &lt;a href="http://www.imagemagick.org/script/command-line-processing.php#geometry"&gt;documentation&lt;/a&gt;:&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;-resize   scale%
-resize   scale-x%xscale-y%
-resize   width
-resize   xheight
-resize   widthxheight
-resize   widthxheight^
-resize   widthxheight!
-resize   widthxheight&amp;gt;
-resize   widthxheight&amp;lt;
-resize   area@&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Fix image aspect ratios for Instagram:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ mogrify -resize 1080x1350 -gravity center -extent 1080 *.jpg
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 13 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/use-imagemagick-to-batch-resize-images</guid></item><item><title>Trip Report: New River Gorge</title><link>https://josh.works/climbing/2015/09/13/2015-9-13-trip-report-new-river-gorge/</link><description>&lt;p&gt;Kristi and I are spending a few weeks in Fayetteville, WV, home of the New River Gorge. There’s fantastic climbing here. I climbed with good friends, and was absolutely humbled by how strong they all are. (My defense, at least for the next few weeks, is that I’ve not climbed consistently for 4.5 months)&lt;/p&gt;

&lt;p&gt;I’ve been climbing regularly this last week, trying to recondition my skin and muscles. I’ve got a long list of projects to work on (thanks Brian and Christian) so the next few weeks should be productive.&lt;/p&gt;

&lt;p&gt;I got on a lot of hard climbs, and made it to the actual tops of few of them. Sent nothing. Lots of room for improvement.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Walking through the rainy woods to climb." src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_56036951e4b0b3ab8e420c8d_1443064146553__img.jpg_" /&gt; Walking through the rainy woods to climb.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 13 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/climbing/2015/09/13/2015-9-13-trip-report-new-river-gorge/</guid></item><item><title>Anvil: move fast and break things</title><link>https://zserge.com/posts/anvil-breaking-changes/</link><description>Dear users, those who were early followers of Anvil. I&amp;rsquo;m now heavily working on the next version of Anvil, but it&amp;rsquo;s likely to make you rewrite your code, and I&amp;rsquo;m deeply sorry about that.
Below I will describe why the changes are necessary and I hope you will find that your code would not be modified a lot and embrace the benefist it brings.
how anvil works now Currently we have Renderables which have a view() method returning a virtual layout.</description><author>zserge's blog</author><pubDate>Sun, 13 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/anvil-breaking-changes/</guid></item><item><title>SSD Storage - Two Months In Production</title><link>https://smcleod.net/2015/09/ssd-storage-two-months-in-production/</link><description>&lt;p&gt;Over the last two months I&amp;rsquo;ve been running selected IO intensive servers off the the SSD storage cluster, these hosts include (among others) our:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primary Puppetmaster&lt;/li&gt;
&lt;li&gt;Gitlab server&lt;/li&gt;
&lt;li&gt;Redmine app and database servers&lt;/li&gt;
&lt;li&gt;Nagios servers&lt;/li&gt;
&lt;li&gt;Several Docker database host servers&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reliability"&gt;Reliability&lt;/h3&gt;
&lt;p&gt;We haven&amp;rsquo;t had any software or hardware failures since commissioning the storage units.&lt;/p&gt;
&lt;p&gt;During this time we have had 3 disk failures on our HP StoreVirtual SANs that have required us to call the supporting vendor and replace failed disks.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Sun, 13 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/09/ssd-storage-two-months-in-production/</guid></item><item><title>Aloha</title><link>https://olshansky.info/movie/aloha/</link><description>Olshansky's review of Aloha</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 12 Sep 2015 10:46:48 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/aloha/</guid></item><item><title>Citizenfour</title><link>https://olshansky.info/movie/citizenfour/</link><description>Olshansky's review of Citizenfour</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 12 Sep 2015 10:39:06 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/citizenfour/</guid></item><item><title>Orange Is the New Black: Season 3</title><link>https://olshansky.info/tv/orange_is_the_new_black_season_3/</link><description>Olshansky's review of Orange Is the New Black: Season 3</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 12 Sep 2015 10:35:11 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/orange_is_the_new_black_season_3/</guid></item><item><title>Nintendo PowerFest (1994) Reunion Tournament</title><link>https://kernelcurry.com/blog/nintendo-powerfest-1994-reunion-tournament/</link><description>&lt;p&gt;A few weekends ago, I flew into Arizona to attend the &lt;a href="https://gameonexpoaz.com/?utm_source=kernelcurry.com&amp;amp;utm_medium=referral&amp;amp;utm_campaign=nintendo-powerfest-1994-reunion-tournament" title="Game On Retro Expo]"&gt;Game On Retro Expo&lt;/a&gt; with some old friends. Among this group was Dorion Whitlock (1994 Nintendo PowerFest finalist and old roommate) and Mike Iarossi (1994 Nintendo PowerFest first place winner). To say the least, I forgot how much fun it is playing video games with your friends.&lt;/p&gt;
&lt;p&gt;The main draw for the Game On Retro Expo was the 1994 PowerFest Reunion Tournament. Everyone at the expo was able to play a reproduction of the 1994 champion cartridge in hopes of qualifying for the Reunion tournament on Sunday. This cartridge was time capped at about six minutes and consisted of the lost level in Mario, five laps in Mario Kart, and Ken Griffey Jr. Home Run Derby. The top ten scoring players of the weekend qualified and the winner of the tournament played Mike Iarossi, the 1994 champion, on the real 1994 cartridge.&lt;/p&gt;</description><author>KernelCurry</author><pubDate>Sat, 12 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kernelcurry.com/blog/nintendo-powerfest-1994-reunion-tournament/</guid></item><item><title>The Lanyard By Billy Collins</title><link>https://ho.dges.online/words/commonplace/the-lanyard-by-billy-collins/</link><description>&lt;p&gt;The other day I was ricocheting slowly&lt;br /&gt;
off the blue walls of this room,&lt;br /&gt;
moving as if underwater from typewriter to piano,&lt;br /&gt;
from bookshelf to an envelope lying on the floor,&lt;br /&gt;
when I found myself in the L section of the dictionary&lt;br /&gt;
where my eyes fell upon the word lanyard.&lt;/p&gt;
&lt;p&gt;No cookie nibbled by a French novelist&lt;br /&gt;
could send one into the past more suddenly -&lt;br /&gt;
a past where I sat at a workbench at a camp&lt;br /&gt;
by a deep Adirondack lake&lt;br /&gt;
learning how to braid long thin plastic strips&lt;br /&gt;
into a lanyard, a gift for my mother.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 12 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/the-lanyard-by-billy-collins/</guid></item><item><title>2015-09-12</title><link>https://ho.dges.online/pictures/2015-09-12/</link><description>&lt;p&gt;Moody me.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 12 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-09-12/</guid></item><item><title>Links - September 11th, 2015</title><link>https://faingezicht.com/links/2015/09/11/links/</link><description/><author>Avy Faingezicht</author><pubDate>Fri, 11 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/11/links/</guid></item><item><title>Get Going with Laravel on Docker</title><link>https://benovermyer.com/blog/2015/09/get-going-with-laravel-on-docker/</link><description>&lt;p&gt;&lt;em&gt;This post was updated May 14th, 2016 to significantly rework the tutorial.&lt;/em&gt; Docker is slowly taking over the world of web infrastructure. It makes working with multiple different services easy, and the problem of “works in dev, not in prod” goes away, since you have the same environment on your local machine as you do in the production infra. It also makes things like trying out web apps without deploying them to servers really easy. Ever wanted to just check out a personal demo of, say, WordPress or Ghost? Docker makes that simple. Docker can be intimidating to start out with. It's a complex beast, but once you've gotten it set up a couple times, it'll become second nature. This article will walk through the entire process of having a completely new and fresh Mac OS X environment all the way to running Docker container with your own Laravel application. It's a long tutorial, so grab a big mug of coffee and put on your favorite track and let's get to work. &lt;em&gt;Note: This tutorial is for OS X. A lot of the pre-req stuff is different for Windows, so if you're running that OS, you might be better off using Docker Toolbox. Until the new Docker App comes out, anyway.&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="prerequisites"&gt;Prerequisites&lt;/h1&gt;
&lt;p&gt;The first step is getting some basic tools installed. OS X comes with git and Ruby installed, but we need to make a slight adjustment to our Ruby environment, and we'll need Homebrew to install some other things.&lt;/p&gt;
&lt;h2 id="homebrew"&gt;Homebrew&lt;/h2&gt;
&lt;p&gt;Let's start with Homebrew. Paste this into a terminal prompt:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;ruby -e &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Running that will install Homebrew. Next, we'll need Homebrew Cask:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;brew install caskroom/cask/brew-cask&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is used to install binary applications that otherwise you'd use a GUI for.&lt;/p&gt;
&lt;h2 id="virtualbox"&gt;Virtualbox&lt;/h2&gt;
&lt;p&gt;Let's install this via Homebrew Cask to make things easy.&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;brew cask install virtualbox&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="enter-docker"&gt;Enter Docker&lt;/h1&gt;
&lt;p&gt;Now we get to the meat of it - installing Docker and the other tools necessary to work with containers. We're going to be using a wrapper called dinghy for this. You could use the official &lt;a href="https://www.docker.com/toolbox" rel="external"&gt;Docker Toolbox&lt;/a&gt;, but the default VM that it provides, boot2docker, relies on vboxfs, which makes real-time updates (like &lt;code&gt;gulp watch&lt;/code&gt;) really slow.&lt;/p&gt;
&lt;h2 id="install-docker-toolbox"&gt;Install Docker Toolbox&lt;/h2&gt;
&lt;p&gt;When I originally wrote this post, Docker Toolbox made some questionable assumptions about how people were using Docker for development. Those have now been corrected, and it's safe to go ahead and install Docker Toolbox. You can get that here: &lt;a href="https://www.docker.com/products/docker-toolbox" rel="external"&gt;https://www.docker.com/products/docker-toolbox&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="docker-is-installed-now-what"&gt;Docker is installed! Now what?&lt;/h2&gt;
&lt;p&gt;Now everything is all set up and ready to get container-ing. In the next section, we'll create a basic Laravel app to get a proper Docker workflow going.&lt;/p&gt;
&lt;h1 id="gettingsetupforlaravel"&gt;Getting set up for Laravel&lt;/h1&gt;
&lt;p&gt;For this tutorial, we're going to use the Laravel framework. This will demonstrate how to use multiple containers while not requiring us to write a ton of code to get started.&lt;/p&gt;
&lt;h2 id="install-composer"&gt;Install Composer&lt;/h2&gt;
&lt;p&gt;PHP is installed by default with OS X, but you're going to need Composer also. Thankfully, it's a quick install:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make sure that composer is in your PATH in your bash/zsh profile. Look for this line: &lt;code&gt;~/.composer/vendor/bin&lt;/code&gt; If it's nowhere in the file, you'll need to add something like this near the bottom of the file:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;export PATH=&amp;quot;$PATH:~/.composer/vendor/bin&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="install-the-laravel-cli-tool"&gt;Install the Laravel CLI tool&lt;/h2&gt;
&lt;p&gt;This tool makes starting new Laravel projects much easier and faster:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;composer global require laravel/installer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="start-a-new-laravel-project"&gt;Start a new Laravel project&lt;/h2&gt;
&lt;p&gt;In a directory that makes sense for you (I use &lt;code&gt;~/Source/&lt;/code&gt; for my code projects), run this shell command:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;laravel new docker-app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will create a new Laravel project called “docker-app” in a new docker-app directory. You're now ready to Docker-ize this app!&lt;/p&gt;
&lt;h1 id="dockerize"&gt;Docker-ize!&lt;/h1&gt;
&lt;p&gt;The next step is to create four files that we'll use to describe our container environment. These files are &lt;code&gt;nginx-vhost.conf&lt;/code&gt;, &lt;code&gt;supervisord.conf&lt;/code&gt;, &lt;code&gt;Dockerfile&lt;/code&gt;, and &lt;code&gt;docker-compose.yml&lt;/code&gt;. Each of these is at the root of your project. The contents of each file is as follows:&lt;/p&gt;
&lt;h2 id="nginx-vhost-conf"&gt;nginx-vhost.conf&lt;/h2&gt;
&lt;p&gt;We're using nginx as the web server for this app. We could use Apache, but for this exercise, we'll stick with nginx. The below file configures the virtualhost that will expose our Laravel app to the container.&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;server {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; listen 80;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; listen [::]:80 default ipv6only=on;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; root /srv/www/public;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; index index.php;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; # Disable sendfile as per https://docs.vagrantup.com/v2/synced-folders/virtualbox.html&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; sendfile off;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; # Add stdout logging&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; error_log /dev/stdout info;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; access_log /dev/stdout;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; location / {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; try_files $uri $uri/ /index.php$is_args$args;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; location ~ .php$ {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; try_files $uri =404;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; fastcgi_split_path_info ^(.+.php)(/.+)$;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; fastcgi_pass unix:/var/run/php5-fpm.sock;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; fastcgi_param SCRIPT_NAME $fastcgi_script_name;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; fastcgi_index index.php;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; include fastcgi_params;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; location ~* .(jpg|jpeg|gif|png|css|js|ico|xml)$ {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; expires 5d;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; # deny access to . files, for security&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; location ~ /. {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; log_not_found off;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; deny all;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="supervisord-conf"&gt;supervisord.conf&lt;/h2&gt;
&lt;p&gt;We're using Supervisor to run nginx and PHP-FPM. It makes things a little cleaner and easier. Below is the config file for Supervisor.&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;[supervisord]&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;nodaemon=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;[program:php5-fpm]&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;command=/usr/sbin/php5-fpm&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;autostart=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;autorestart=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;priority=5&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;[program:nginx]&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;command=/usr/sbin/nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;autostart=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;autorestart=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;priority=10&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;stdout_events_enabled=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;stderr_events_enabled=true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="dockerfile"&gt;Dockerfile&lt;/h2&gt;
&lt;p&gt;For a guide to the syntax you see below, check out the &lt;a href="https://docs.docker.com/reference/builder/" rel="external"&gt;official Docker documentation for Dockerfiles&lt;/a&gt;.&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;FROM ubuntu:14.04&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;ENV DEBIAN_FRONTEND noninteractive&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get update -y&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get install -y software-properties-common&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN add-apt-repository ppa:nginx/development&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get update -y&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get upgrade -y&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get install -y supervisor nginx php5-fpm php5-cli php5-curl php5-gd php5-mysql php5-memcached php5-mcrypt&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Clean up to reduce container size&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get remove --purge -y software-properties-common&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get autoremove -y&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get clean&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN apt-get autoclean&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN echo -n &amp;gt; /var/lib/apt/extended_states&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN rm -rf /var/lib/apt/lists/*&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN rm -rf /usr/share/man/??&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN rm -rf /usr/share/man/??_*&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Configure php-fpm to not run as a daemon&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN sed -e 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN sed -e 's/;listen.owner/listen.owner/' -i /etc/php5/fpm/pool.d/www.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN sed -e 's/;listen.group/listen.group/' -i /etc/php5/fpm/pool.d/www.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Configure nginx to not run as a daemon&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN echo &amp;quot;daemon off;&amp;quot; &amp;gt;&amp;gt; /etc/nginx/nginx.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# This next line lets nginx write to your working directory&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN usermod -u 1000 www-data&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Configure nginx virtualhost&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN rm -Rf /etc/nginx/conf.d/*&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN rm -Rf /etc/nginx/sites-available/default&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;ADD ./nginx-vhost.conf /etc/nginx/sites-available/default.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Add the application code into the container&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;ADD . /srv/www&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Configure Supervisor&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;ADD ./supervisord.conf /etc/supervisor/conf.d/supervisor.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Fix permissions&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;RUN chown -Rf www-data:www-data /srv/www/&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Set our working directory&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;WORKDIR /srv/www&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# Expose Ports&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;EXPOSE 80&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;# And finally, run the command to kickstart everything&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;CMD [&amp;quot;/usr/bin/supervisord&amp;quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above file is telling Docker how to build the container. It includes nginx and PHP-FPM, but it leaves database and cache store to other containers. The container's main job is to serve the Laravel application at &lt;code&gt;/srv/www&lt;/code&gt; in the container on port 80 using nginx and PHP-FPM.&lt;/p&gt;
&lt;h2 id="docker-compose-yml"&gt;docker-compose.yml&lt;/h2&gt;
&lt;p&gt;This file is what Docker Compose will use to build our stack and link up the containers the app needs to function. It defines three containers - web, db, and cache. The “volumes” part of the web container's definition here will map your source code directory on your host to the container's app directory, which will let you update your container by editing files on your host without having to rebuild the container. Under the db container, you'll see the “environment” section. This is a list of environment variables that will be set in the MySQL container. The two blank ones will use the environment variable of the same name on your host to set them inside the container, which is far more secure than putting these values into version control! Just make sure that you set them! That'll happen in your bash/zsh profile, with lines like this:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;export MYSQL_ROOT_PASSWORD=supersecurepassword1&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;export MYSQL_PASSWORD=anothersecurepassword2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alright. Without further ado, here's the &lt;code&gt;docker-compose.yml&lt;/code&gt; file:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;web:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; build: .&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; ports:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; - &amp;quot;8080:80&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; volumes:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; - .:/srv/www&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; links:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; - db&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; - cache&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;db:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; image: mysql:5.6&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; environment:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;  MYSQL_ROOT_PASSWORD:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;  MYSQL_DATABASE: dockerapp&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;  MYSQL_USER: dockerapp&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;  MYSQL_PASSWORD:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;cache:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt; image: memcached:latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="configure-your-laravel-app"&gt;Configure your Laravel app&lt;/h1&gt;
&lt;p&gt;Laravel 5.0 and later uses a &lt;code&gt;.env&lt;/code&gt; file to configure the app. This is where you'll give your app the settings it needs to talk to the other services (in this case, memcached and MySQL).&lt;/p&gt;
&lt;h2 id="env"&gt;.env&lt;/h2&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;APP_ENV=local&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;APP_DEBUG=true&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;APP_KEY=dhBKg8eSVZ3tH5yuz6z40j13X13YWTJf&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;DB_HOST=db&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;DB_DATABASE=dockerapp&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;DB_USERNAME=dockerapp&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;DB_PASSWORD=anothersecurepassword2&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;CACHE_DRIVER=memcached&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;SESSION_DRIVER=memcached&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;QUEUE_DRIVER=sync&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MEMCACHED_HOST=cache&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MAIL_DRIVER=smtp&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MAIL_HOST=mailtrap.io&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MAIL_PORT=2525&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MAIL_USERNAME=null&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MAIL_PASSWORD=null&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span&gt;MAIL_ENCRYPTION=null&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="run-your-new-application-container"&gt;Run your new application container&lt;/h1&gt;
&lt;p&gt;Alright, we're just about ready for the finale. First we need to run Docker Compose against our app to get it running.&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;docker-compose build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will build your container and fetch the other two from Docker Hub. It shouldn't take too long - the longest part will be downloading mysql and memcached containers. Then, put your containers online:&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;docker-compose up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now try visiting &lt;a href="http://192.168.99.100:8080" rel="external"&gt;http://192.168.99.100:8080&lt;/a&gt; in your browser of choice. You might have to change the IP address to match that of your Docker machine (&lt;code&gt;docker-machine ip default&lt;/code&gt; will give you that). You should see the Laravel welcome screen, and your work here is complete. &lt;em&gt;Note: don't worry that your command prompt didn't come back. This runs in the foreground, so you'll need to use a new tab in your terminal app for other things. Or, you can use the daemon mode instead:&lt;/em&gt;&lt;/p&gt;
&lt;pre class="giallo" style="color: #F8F8F2; background-color: #282A36;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span&gt;docker-compose up -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Congratulations, you're now working with Docker!&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Fri, 11 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/09/get-going-with-laravel-on-docker/</guid></item><item><title>V3 Technology Awards: Vote for Canonical!</title><link>https://kyrofa.com/posts/v3-technology-awards-vote-for-canonical/</link><description>I&amp;rsquo;m pleased to announce that Canonical has made the shortlist in several categories for the V3 Technology Awards! Now it&amp;rsquo;s all in your hands: Go and Vote for Canonical! Note that voting closes at 5pm on Friday, October 9th.
The categories in which we made the shortlist are:
 Best cloud computing provider  We made this as an overall company: Canonical   Best business software provider  We also made this as an overall company: Canonical   Best Internet of Things product  Made this as Canonical Snappy Ubuntu Core    Thank you for your support!</description><author>kyrofa's blog</author><pubDate>Fri, 11 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/v3-technology-awards-vote-for-canonical/</guid></item><item><title>Pesaro, Microsoft and OpenOffice: the consequences</title><link>https://stop.zona-m.net/2015/09/pesaro-microsoft-and-openoffice-the-consequences/</link><description>&lt;p&gt;A few days ago I summarized the most &lt;a href="https://stop.zona-m.net/2015/09/microsoft-vs-openoffice-in-pesaro-first-lets-recap"&gt;questionable or uncertain points of the software odissey of the City of Pesaro,&lt;/a&gt; saying that I&amp;rsquo;d also post questions and consequences, both for the City and Open Source advocates, not mentioned yet in this story. For Pesaro, the road forward has little or nothing to do with the initial topic, that is Open Source Software in Public Administration. The advocates, instead, should rethink some of their strategies. Let&amp;rsquo;s start from Pesaro, but what follows applies to practically every city.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 10 Sep 2015 09:03:11 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/09/pesaro-microsoft-and-openoffice-the-consequences/</guid></item><item><title>Moonwalking With Einstein</title><link>https://june.kim/moonwalking-with-einstein/</link><author>june.kim</author><pubDate>Thu, 10 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/moonwalking-with-einstein/</guid></item><item><title>Thinking, Fast and Slow</title><link>https://june.kim/thinking-fast-and-slow/</link><author>june.kim</author><pubDate>Thu, 10 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/thinking-fast-and-slow/</guid></item><item><title>Links - September 10th, 2015</title><link>https://faingezicht.com/links/2015/09/10/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 10 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/10/links/</guid></item><item><title>The bias of list creation in the form of class methods</title><link>https://nutcroft.mataroa.blog/blog/bias-list-creation-class-methods/</link><description>&lt;p&gt;It's interesting how human biases carry on to writing code and how they evolve in this transition.&lt;/p&gt;
&lt;p&gt;Recently, at my job, we wanted to create a metrics endpoint. In order to do this task, we copy-pasted the controller implementation from the users-list endpoint to the metrics one.&lt;/p&gt;
&lt;p&gt;Of course, after using such a technique we had to comb through the users-list code and check for possible edits or removal of parts of code that are not useful for the metrics functionality.&lt;/p&gt;
&lt;p&gt;However, there is a psychological phenomenon that caused us hours tracking a bug! In this phenomenon, given a list and being asked to divide, depending on your way of operation, different sets of lists will be created, even with the same comparing function.&lt;/p&gt;
&lt;p&gt;To illustrate this, let us assume you have a list and someone asks you to &lt;em&gt;create a new list&lt;/em&gt; with the most important items.&lt;/p&gt;
&lt;p&gt;You have two ways of operating:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create an empty new list and check out every item of the original list. If it is important, copy it into the new list.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Duplicate the original list. Check out every item of the new list, and if it not important remove it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you pick the first way, you will have a shorter &lt;em&gt;important&lt;/em&gt; list than the second way. The reason is that on those items that you are torn whether they are important, you will act with the default action. In the first case, the default is not copying them to the new list. In the second case, the default action is not removing them from the new list.&lt;/p&gt;
&lt;p&gt;A way which wouldn't cause a bias is one with no default action. In this case, it would be to create two new lists. One is the unimportant items and the other the important ones. Subsequently, there is no default aka &lt;em&gt;easier&lt;/em&gt; act; either you write the item in the first list or in the second.&lt;/p&gt;
&lt;p&gt;This phenomenon applies to the way we wrote the new endpoint controller. Essentially, the &lt;em&gt;list&lt;/em&gt; was the list of methods in the controllers and the way we operated was the second one, using duplication.&lt;/p&gt;
&lt;p&gt;As a result, the new list of methods was larger. The default action of not removing code/methods that &lt;em&gt;might be useful later&lt;/em&gt; was followed. One of them was to keep the pagination functionality enabled. However, the dummy data set in our local installation was smaller than the production one. As a result, it wasn't possible to get new metrics summaries in the production after a few, because the request was actually only for page 1. We had to dive through the stack, front, back layers and check database durability (&lt;a href="http://www.sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/"&gt;sorry Mongo&lt;/a&gt;) in order to locate this extra method at the end.&lt;/p&gt;</description><author>nutcroft</author><pubDate>Thu, 10 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nutcroft.mataroa.blog/blog/bias-list-creation-class-methods/</guid></item><item><title>Links - September 9th, 2015</title><link>https://faingezicht.com/links/2015/09/09/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 09 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/09/links/</guid></item><item><title>OpenConfig Interfaces - Some Examples</title><link>https://rob.sh/post/213/</link><description>&lt;p&gt;I&amp;rsquo;ve talked a little on this site before about what we&amp;rsquo;re trying to achieve with &lt;a href="http://www.openconfig.net"&gt;OpenConfig&lt;/a&gt;. However, one of the observations that it&amp;rsquo;s easy to make is that YANG models alone don&amp;rsquo;t really achieve anything in terms of making the network more programmable. To make the network more programmable, we need to have tooling that helps us create instances of those modules, manipulate them, and then serialise the into a format that can be used to transmit data that conforms to the model to a device.&lt;/p&gt;</description><author>rob.sh</author><pubDate>Wed, 09 Sep 2015 02:23:00 GMT</pubDate><guid isPermaLink="true">https://rob.sh/post/213/</guid></item><item><title>Lucky 7 review</title><link>https://xenodium.com/lucky-7-review</link><description>&lt;h2&gt;Recommended? yep&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.lucky7london.co.uk"&gt;Lucky 7&lt;/a&gt; is a small nostalgic American diner on Westbourne Park road. I like the vibe, the space, and the unpretentious waiting staff. I go to Lucky 7 often enough, originally for the buttermilk pancakes, but the list of favorites on the menu keeps growing.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/lucky-7-review/lucky-7-menu-board.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/lucky-7-review/lucky-7-staff.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Smileys by &lt;a href="https://openclipart.org/detail/219291/smile"&gt;w.dyer&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Buttermilk Banana pancakes&lt;/h2&gt;
&lt;p&gt;These are my favorite pancakes in London by far. Banana buttermilk pancakes and a few free coffee refills usually sort me out until dinner time. Add a side of bacon if extra hungry. You probably don't need it though.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/lucky-7-review/lucky-7-coffee.jpg" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/lucky-7-review/lucky-7-pancakes.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;Reuben sandwich&lt;/h2&gt;
&lt;p&gt;The reuben has been on Lucky 7's specials menu for months now. Not had many of these in London, but compared to The Brass Rail's, this reuben was a clear winner. The sandwich is huge and comes with fries. My girlfriend and I struggled to finish one between the two of us.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://localhost:8787/alvaro/lucky-7-review/lucky-7-reuben-fries.jpg" title="1" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://localhost:8787/alvaro/lucky-7-review/lucky-7-reuben-cross-section.jpg" title="1" /&gt;&lt;/p&gt;
&lt;h2&gt;Vanilla milkshake (add malt!)&lt;/h2&gt;
&lt;p&gt;This milkshake hits the spot every time, but it's filling. You almost have to decide between the shake and an actual meal. If you must have it, add malt. Sorry, no picture.&lt;/p&gt;
&lt;h2&gt;Huevos Rancheros&lt;/h2&gt;
&lt;p&gt;This is a breakfast dish I can equally make (better?) at home, but Lucky 7 wins hands down every time I'm feeling particularly lazy. Sorry, no picture.&lt;/p&gt;
&lt;h2&gt;Useful?&lt;/h2&gt;
&lt;p&gt;Was this post useful to you? do &lt;a href="https://twitter.com/xenodium/status/643139264302186497"&gt;reply&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;Better suggestion?&lt;/h2&gt;
&lt;p&gt;London is full of overhyped, gimmicky, and unnecessarily expensive restaurants. Very few deliver truly awesome food (even those expensive ones). Got suggestions? I'd love to hear from you &lt;a href="https://twitter.com/xenodium"&gt;@xenodium&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 08 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/lucky-7-review</guid></item><item><title>Links - September 8th, 2015</title><link>https://faingezicht.com/links/2015/09/08/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 08 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/08/links/</guid></item><item><title>Managing bash aliases</title><link>https://www.danielcorin.com/posts/2015/2015-09-07-managing-bash-aliases/</link><description>Managing bash aliases</description><author>Thought Eddies</author><pubDate>Tue, 08 Sep 2015 00:05:00 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2015/2015-09-07-managing-bash-aliases/</guid></item><item><title>Microsoft vs OpenOffice in Pesaro: first, let's recap</title><link>https://stop.zona-m.net/2015/09/microsoft-vs-openoffice-in-pesaro-first-lets-recap/</link><description>&lt;figure&gt;
  &lt;img alt="Microsoft vs OpenOffice in Pesaro: first, let's recap /img/pesaro-retrocessione.png" src="https://stop.zona-m.net//img/pesaro-retrocessione.png" width="100%" /&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Pesaro" target="_blank"&gt;Pesaro&lt;/a&gt; is a town of about 100 thousands people on the northern adriatic coast of Italy. Its Public Administration has been facing lots of critics from Free/Open Source software supporters because, in the last five years, it changed twice the same, important part of its ICT infrastructure. Both those changes bring consequences and open issues, &lt;em&gt;both for the critics and for Pesaro, &lt;/em&gt;that have had little or no coverage at all so far, especially outside Italy (1). Before talking about them, however, it is necessary to summarize what happened.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Mon, 07 Sep 2015 06:38:04 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/09/microsoft-vs-openoffice-in-pesaro-first-lets-recap/</guid></item><item><title>A Pattern Language</title><link>https://june.kim/pattern-language/</link><author>june.kim</author><pubDate>Mon, 07 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/pattern-language/</guid></item><item><title>Links - September 7th, 2015</title><link>https://faingezicht.com/links/2015/09/07/links/</link><description>I spent most of last week moving to my new apartment in San Francisco, which meant I had no time to post links.

Here's a big list to make up for a lost week:</description><author>Avy Faingezicht</author><pubDate>Mon, 07 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/09/07/links/</guid></item><item><title>60 hours in Edinburgh (festival time)</title><link>https://www.planetjones.net/blog/07-09-2015/60-hours-in-edinburgh-at-festival-time.html</link><description>A 60 hour visit to Edinburgh, our old hunting ground during the August festival season.</description><author>Jonathan Jones homepage: planetjones.net</author><pubDate>Mon, 07 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.planetjones.net/blog/07-09-2015/60-hours-in-edinburgh-at-festival-time.html</guid></item><item><title>Elixir binary search</title><link>https://www.danielcorin.com/posts/2015/2015-09-06-elixir-binary-search/</link><description>Elixir binary search</description><author>Thought Eddies</author><pubDate>Sun, 06 Sep 2015 22:08:00 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2015/2015-09-06-elixir-binary-search/</guid></item><item><title>What do USA special forces and Mexican drug lords have in common?</title><link>https://stop.zona-m.net/2015/09/what-do-usa-special-forces-and-mexican-drug-lords-have-in-common/</link><description>&lt;p&gt;Apparently, they both don&amp;rsquo;t know enough of how the Internet and digital (meta) data work.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sun, 06 Sep 2015 08:24:27 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/09/what-do-usa-special-forces-and-mexican-drug-lords-have-in-common/</guid></item><item><title>Why Automate Code Reviews?</title><link>https://www.danstroot.com/posts/2015-09-06-why-automate-code-reviews</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/better_code.png" /&gt;&lt;br /&gt;&lt;br /&gt;Ask a programmer to review 10 lines of code, they'll make 10 suggestions. Ask them to review 1,000 lines of code and they'll say "it looks good!"&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2015-09-06-why-automate-code-reviews"&gt;Why Automate Code Reviews?&lt;/a&gt; first appeared on &lt;a href="https://www.danstroot.com"&gt;Dan Stroot's Blog&lt;/a&gt;</description><author>Dan Stroot</author><pubDate>Sun, 06 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2015-09-06-why-automate-code-reviews</guid></item><item><title>The Free Software icon that we need the most. Fifteen years ago</title><link>https://stop.zona-m.net/2015/09/the-free-software-icon-that-we-need-the-most-fifteen-years-ago/</link><description>&lt;p&gt;Today, while cleaning up old backups, I found a text file named as this post, which I saved on November 17th, 2000, but never used. Cannot remember what I was planning to do with it, but here it goes. A bit naive, surely dated (just look at which Free Software &lt;strong&gt;companies&lt;/strong&gt; I was suggesting to go for help&amp;hellip;) but still interesting, considering how things stand today. Here it goes, unchanged:&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sat, 05 Sep 2015 19:51:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/09/the-free-software-icon-that-we-need-the-most-fifteen-years-ago/</guid></item><item><title>Snail stable breeding brands</title><link>https://liza.io/snail-stable-breeding-brands/</link><description>&lt;p&gt;I haven&amp;rsquo;t made a SnailLife update in a while, but I had a good reason! For about half a month I&amp;rsquo;ve been working on an entry into the &lt;a href="http://js13kgames.com"&gt;js13kGames&lt;/a&gt; challenge. I&amp;rsquo;ve entered the challenge annually since it started and this year was meant to be no exception. Unfortunately&amp;hellip;I wasn&amp;rsquo;t really into it this year. It felt like work, and with things at actual work being so busy I found myself not having the time or motivation to sit down and work on it after I get home.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 05 Sep 2015 11:18:05 GMT</pubDate><guid isPermaLink="true">https://liza.io/snail-stable-breeding-brands/</guid></item><item><title>Surely You're Joking, Mr. Feynman</title><link>https://june.kim/mr-feynman/</link><author>june.kim</author><pubDate>Fri, 04 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/mr-feynman/</guid></item><item><title>Benchmarking Go in the cloud</title><link>https://zserge.com/posts/go-cloud-benchmark/</link><description>Benchmarking Go in the cloud Go now seems to be a natural choice for writing your next microservice or web app. It&amp;rsquo;s mature and fast.
But where would you host your app? In this post I will compare some popular PaaS (platform-as-a-service) and how the same primitive Go web app performs on each of them.
Go I&amp;rsquo;m using the latest Go compiler and the latest version of Gin framework with zero-allocation router.</description><author>zserge's blog</author><pubDate>Fri, 04 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/go-cloud-benchmark/</guid></item><item><title>Missionary Service</title><link>https://sean.lane.sh/posts/2015/09/Missionary-Service/</link><description>&lt;p&gt;I spent two years in South America where I served as a Missionary for The Church of Jesus Christ of Latter-Day Saints in Asunción, Paraguay&lt;/p&gt;
&lt;p&gt;My missionary service in Paraguay has been one of the defining experiences in my life. I&amp;rsquo;m very grateful for the opportunity to have met some amazing people and share a message that means the world to me. Below are some albums from different areas where I resided over the course of my two year mission.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mission Area&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.flickr.com/photos/seanlane/albums/72157662946047064"&gt;Puente Kyjha, Canindeyu&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;March - June 2010&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.flickr.com/photos/seanlane/albums/72157672470705445"&gt;Aratiri, Capiatá, Central&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;June - December 2010&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.flickr.com/photos/seanlane/albums/72157671543789532"&gt;Mariano Roque Alonso, Central&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;December 2010 - January 2011&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.flickr.com/photos/seanlane/albums/72157671577405651"&gt;Campo Grande, Asunción, Distrito Capital&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;January - July 2011&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.flickr.com/photos/seanlane/albums/72157671544396622"&gt;Horqueta, Concepción&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;July - November 2011&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.flickr.com/photos/seanlane/albums/72157672380509406"&gt;Tayuasape, San Lorenzo, Central&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;November 2011 - February 2012&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description><author>Posts on Sean Lane</author><pubDate>Fri, 04 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://sean.lane.sh/posts/2015/09/Missionary-Service/</guid></item><item><title>[Computing] On Nexuses</title><link>https://www.devever.net/~hl/nexuses</link><description>&lt;p&gt;Nexuses are an underrecognised utility in computing, despite the fact that they
are commonly used and absolutely essential to usable computer systems. A nexus,
broadly, is some sort of infrastructural system which is consumed by many
different applications written by many different people. Many of these might be
called “platforms”, but there are plenty of nexuses which would not be called
platforms.&lt;/p&gt;</description><author>devever.net/~hl</author><pubDate>Fri, 04 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.devever.net/~hl/nexuses</guid></item><item><title>ZLog asynchronous I/O support</title><link>https://makedist.com/posts/2015/09/04/zlog-asynchronous-i/o-support/</link><description>Bringing zlog into the future with a new asynchronous interface.</description><author>Noah Watkins</author><pubDate>Fri, 04 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2015/09/04/zlog-asynchronous-i/o-support/</guid></item><item><title>Building a Redis clone in Haskell</title><link>https://honza.pokorny.ca/2015/09/building-a-redis-clone-in-haskell/</link><description>&lt;p&gt;In this post, we will attempt to make a simplified clone of &lt;a href="http://redis.io"&gt;Redis&lt;/a&gt; in Haskell.
Here is a set of requirements that we will aim to fullfill:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get&lt;/code&gt; and &lt;code&gt;set&lt;/code&gt; operations&lt;/li&gt;
&lt;li&gt;Multi-threaded&lt;/li&gt;
&lt;li&gt;Atomic&lt;/li&gt;
&lt;li&gt;Redis compatible (implement the Redis protocol)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We should be able to use the &lt;code&gt;redis-cli&lt;/code&gt; tool to connect to our server and
issue commands to it.&lt;/p&gt;
&lt;p&gt;We are going to omit many features that Redis has.  For example, there will be
no disk persistence.  We will accomplish this with about 100 lines of Haskell.&lt;/p&gt;
&lt;h2 id="getting-started-stack"&gt;Getting started: stack&lt;/h2&gt;
&lt;p&gt;We are going to use &lt;a href="https://github.com/commercialhaskell/stack"&gt;stack&lt;/a&gt; to build our project.  Stack is a new build tool for
Haskell projects.  We can also use it to create all the necessary files that
make up a Haskell project.  You can find the installation &lt;a href="https://github.com/commercialhaskell/stack/wiki/Downloads"&gt;instructions&lt;/a&gt; here.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s create our project.  We will call our server &lt;em&gt;Redish&lt;/em&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-nil"&gt;$ stack new Redish simple
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This will create a directory &lt;code&gt;Redish/&lt;/code&gt; with a few files in it.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-nil"&gt;Redish/
    LICENSE
    README.md
    Redish.cabal
    Setup.hs
    src/
        Main.hs
    stack.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can use stack to build this project and run it:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-nil"&gt;$ stack build
Redish-0.1.0.0: configure
Configuring Redish-0.1.0.0...
Redish-0.1.0.0: build
Preprocessing executable 'Redish' for Redish-0.1.0.0...
[1 of 1] Compiling Main             ( src/Main.hs, .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/Redish/Redish-tmp/Main.o )
Linking .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/Redish/Redish ...
Reidhs-0.1.0.0: install
Installing executable(s) in
/Users/&amp;lt;user&amp;gt;/&amp;lt;dirs&amp;gt;/Redish/.stack-work/install/x86_64-osx/lts-3.2/7.10.2/bin
$ stack exec Redish
hello world
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="types"&gt;Types&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start by defining our types.  Redish is an in-memory database so we will
need a representation of our database.  For a simple key-value store, all that
we need is a simple map.  Let&amp;rsquo;s create a few aliases.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #81a1c1; font-weight: bold;"&gt;type&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Value&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;ByteString&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #81a1c1; font-weight: bold;"&gt;type&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Key&lt;/span&gt;   &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;ByteString&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #81a1c1; font-weight: bold;"&gt;type&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;DB&lt;/span&gt;    &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Map&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Key&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, we will need to represent the commands that our server knows how to
handle.  The command data structure can be a &lt;code&gt;get&lt;/code&gt;, a &lt;code&gt;set&lt;/code&gt; or unknown.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #81a1c1; font-weight: bold;"&gt;data&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Command&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Get&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;             &lt;span style="color: #81a1c1;"&gt;|&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Set&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Key&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;             &lt;span style="color: #81a1c1;"&gt;|&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Unknown&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;             &lt;span style="color: #81a1c1; font-weight: bold;"&gt;deriving&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Eq&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Show&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="software-transactional-memory"&gt;Software transactional memory&lt;/h2&gt;
&lt;p&gt;Now that we have our types in places, we need to write a few functions to
operate on them.  We need a way to insert data and to query our database.&lt;/p&gt;
&lt;p&gt;First things first though.  Since by default everything in Haskell is immutable,
how can we change the value of our in-memory database?  We can&amp;rsquo;t simply
overwrite the old value with the new one.  The compiler won&amp;rsquo;t let us.  The
answer is software transactional memory, or STM for short.&lt;/p&gt;
&lt;p&gt;STM allows us to atomically change a value in our program.  The atomic part is
important.  Many parts of the code can update this value and we have no way of
knowing when and how often they might do so.  STM allows us to perform atomic
updates.  This way any updates to our database will be run sequence even when
coming from different threads.  The only cost is that we have to perform any
updates within the context of &lt;code&gt;IO&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Our &lt;code&gt;DB&lt;/code&gt; type will be become &lt;code&gt;TVar DB&lt;/code&gt;.  The &lt;code&gt;TVar&lt;/code&gt; type represents the
mutable reference.  Next, let&amp;rsquo;s create the initial value in the &lt;code&gt;main&lt;/code&gt;
function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;main&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;IO&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;main&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    database &lt;span style="color: #81a1c1; font-weight: bold;"&gt;&amp;lt;-&lt;/span&gt; atomically &lt;span style="color: #81a1c1;"&gt;$&lt;/span&gt; newTVar &lt;span style="color: #81a1c1;"&gt;$&lt;/span&gt; fromList &lt;span style="color: #eceff4;"&gt;[(&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;"__version__"&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; &lt;span style="color: #a3be8c;"&gt;"0.1.0"&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will create a &lt;code&gt;Map&lt;/code&gt; with a key of &lt;code&gt;__version__&lt;/code&gt; which has the value
&lt;code&gt;0.1.0&lt;/code&gt;.  Then, it wraps that &lt;code&gt;Map&lt;/code&gt; in a &lt;code&gt;TVar&lt;/code&gt; and atomically assigns it
to the &lt;code&gt;database&lt;/code&gt; variable.  Each time we want to write or read the
&lt;code&gt;database&lt;/code&gt; value, we have to use &lt;code&gt;IO&lt;/code&gt;.  Let&amp;rsquo;s create a helper for atomically
reading this value:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;atomRead&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;TVar&lt;/span&gt; a &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;IO&lt;/span&gt; a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;atomRead&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; atomically &lt;span style="color: #81a1c1;"&gt;.&lt;/span&gt; readTVar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And let&amp;rsquo;s make a function to update a value in the database.  This takes a
function that does the updating and runs it through the STM machinery.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;updateValue&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;DB&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;DB&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;)&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;TVar&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;DB&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;IO&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;updateValue&lt;/span&gt; fn x &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; atomically &lt;span style="color: #81a1c1;"&gt;$&lt;/span&gt; modifyTVar x fn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="reply-parsing"&gt;Reply parsing&lt;/h2&gt;
&lt;p&gt;Next, let&amp;rsquo;s talk about the Redis protocol.  It&amp;rsquo;s a simple TCP scheme that looks
like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-nil"&gt;*2\r\n$3\r\nget\r\n$4\r\nname
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It&amp;rsquo;s a bunch of keywords and arguments separated by newlines.  If we clean it up
and break each thing to its own line, we get:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-nil"&gt;*2
$3
get
$4
name
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Let&amp;rsquo;s look at each line.  &lt;code&gt;*2&lt;/code&gt; says to expect a command that has two
arguments.  &lt;code&gt;$3&lt;/code&gt; says that the first argument is three characters long.
&lt;code&gt;get&lt;/code&gt; is the three-character argument from above.  &lt;code&gt;$4&lt;/code&gt; is the length of the
second argument, and &lt;code&gt;name&lt;/code&gt; is the value of the second argument.  If you&amp;rsquo;re in
the REPL provided by &lt;code&gt;redis-cli&lt;/code&gt;, and you type &lt;code&gt;get name&lt;/code&gt;, Redis will
translate those two words into the above representation.  A &lt;code&gt;set&lt;/code&gt; command
would look like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-nil"&gt;*3
$3
set
$4
name
$5
honza
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is what will be sent when you run &lt;code&gt;set name honza&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This multi-argument message is called &lt;em&gt;multibulk&lt;/em&gt; in the Redis documentation.
There are two other data types that Redis uses that will interest us: the OK and
the error.&lt;/p&gt;
&lt;p&gt;When Redis needs to tell you that it accepted request and everything went
smoothly, it simply responds with &lt;code&gt;+OK&lt;/code&gt;.  When Redis needs to indicate an
error, it replies with &lt;code&gt;-ERR something went wrong&lt;/code&gt; (where &amp;ldquo;something went
wrong&amp;rdquo; is the message).&lt;/p&gt;
&lt;p&gt;This format is very simple and actually very effective.  When we listen on a
socket for incoming messages, we have a look at the very first character.  &lt;code&gt;+&lt;/code&gt;
tells us that it&amp;rsquo;s OK, &lt;code&gt;-&lt;/code&gt; signals and error, and &lt;code&gt;*&lt;/code&gt; tells us to keep
reading for commands.  We incrementally read from the socket only as much data
as the protocol tells us.&lt;/p&gt;
&lt;p&gt;In this section, we will write a parser for multibulk messages.  We will use the
amazing attoparsec library for this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The following code is heavily influenced by the &lt;a href="https://github.com/informatikr/hedis"&gt;Hedis&lt;/a&gt; library.  Credit goes
to Falko Peters.  Thanks!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A multibulk message is called a &lt;em&gt;reply&lt;/em&gt; in Redis lingo.  Let&amp;rsquo;s make a type for it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #81a1c1; font-weight: bold;"&gt;data&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Reply&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Bulk&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Maybe&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;ByteString&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;           &lt;span style="color: #81a1c1;"&gt;|&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;MultiBulk&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Maybe&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;[&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Reply&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;           &lt;span style="color: #81a1c1; font-weight: bold;"&gt;deriving&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Eq&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Show&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A &lt;code&gt;Bulk&lt;/code&gt; reply is a simple string like &lt;code&gt;get&lt;/code&gt; or &lt;code&gt;name&lt;/code&gt; above.
&lt;code&gt;MultiBulk&lt;/code&gt; is the whole message.  Let&amp;rsquo;s also write a function that attempts
to convert a &lt;code&gt;Reply&lt;/code&gt; to a &lt;code&gt;Command&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;parseReply&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Reply&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Maybe&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;parseReply&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;MultiBulk&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; xs&lt;span style="color: #eceff4;"&gt;))&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #81a1c1; font-weight: bold;"&gt;case&lt;/span&gt; xs &lt;span style="color: #81a1c1; font-weight: bold;"&gt;of&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #eceff4;"&gt;[&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Bulk&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #a3be8c;"&gt;"get"&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;),&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Bulk&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; a&lt;span style="color: #eceff4;"&gt;)]&lt;/span&gt;                &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;$&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Get&lt;/span&gt; a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #eceff4;"&gt;[&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Bulk&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #a3be8c;"&gt;"set"&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;),&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Bulk&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; a&lt;span style="color: #eceff4;"&gt;),&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Bulk&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; b&lt;span style="color: #eceff4;"&gt;)]&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;$&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Set&lt;/span&gt; a b
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #81a1c1; font-weight: bold;"&gt;_&lt;/span&gt;                                                 &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Unknown&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;parseReply&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;_&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Nothing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, let&amp;rsquo;s use attoparsec to write a parser for the &lt;code&gt;Reply&lt;/code&gt; data type.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;replyParser&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Parser&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Reply&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;replyParser&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; choice &lt;span style="color: #eceff4;"&gt;[&lt;/span&gt;bulk&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; multiBulk&lt;span style="color: #eceff4;"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our &lt;code&gt;replyParser&lt;/code&gt; will try to match either a &lt;code&gt;bulk&lt;/code&gt; or a &lt;code&gt;multiBulk&lt;/code&gt;.
Let&amp;rsquo;s implement those:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;bulk&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Parser&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Reply&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;bulk&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Bulk&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;&amp;lt;$&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    len &lt;span style="color: #81a1c1; font-weight: bold;"&gt;&amp;lt;-&lt;/span&gt; char &lt;span style="color: #a3be8c;"&gt;'$'&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;*&amp;gt;&lt;/span&gt; signed decimal &lt;span style="color: #81a1c1;"&gt;&amp;lt;*&lt;/span&gt; endOfLine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #81a1c1; font-weight: bold;"&gt;if&lt;/span&gt; len &lt;span style="color: #81a1c1;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #b48ead;"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        &lt;span style="color: #81a1c1; font-weight: bold;"&gt;then&lt;/span&gt; return &lt;span style="color: #81a1c1;"&gt;Nothing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        &lt;span style="color: #81a1c1; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;&amp;lt;$&amp;gt;&lt;/span&gt; take len &lt;span style="color: #81a1c1;"&gt;&amp;lt;*&lt;/span&gt; endOfLine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;multiBulk&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Parser&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Reply&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;multiBulk&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;MultiBulk&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;&amp;lt;$&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    len &lt;span style="color: #81a1c1; font-weight: bold;"&gt;&amp;lt;-&lt;/span&gt; char &lt;span style="color: #a3be8c;"&gt;'*'&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;*&amp;gt;&lt;/span&gt; signed decimal &lt;span style="color: #81a1c1;"&gt;&amp;lt;*&lt;/span&gt; endOfLine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #81a1c1; font-weight: bold;"&gt;if&lt;/span&gt; len &lt;span style="color: #81a1c1;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #b48ead;"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        &lt;span style="color: #81a1c1; font-weight: bold;"&gt;then&lt;/span&gt; return &lt;span style="color: #81a1c1;"&gt;Nothing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        &lt;span style="color: #81a1c1; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;&amp;lt;$&amp;gt;&lt;/span&gt; count len replyParser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;First, the parsers look at the first character to see what kind of message it
is.  If it starts with a &lt;code&gt;$&lt;/code&gt;, it&amp;rsquo;s a bulk.  If it starts with a &lt;code&gt;*&lt;/code&gt;, it&amp;rsquo;s
multibulk.  Then, it reads as many characters from the input as the length
indicator said.  In the case of multibulk, it recurses because it can contain
bulk messages.&lt;/p&gt;
&lt;p&gt;You can now run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #81a1c1;"&gt;&amp;gt;&lt;/span&gt; parse replyParser &lt;span style="color: #a3be8c;"&gt;"*2&lt;/span&gt;&lt;span style="color: #ebcb8b;"&gt;\r\n&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;$3&lt;/span&gt;&lt;span style="color: #ebcb8b;"&gt;\r\n&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;get&lt;/span&gt;&lt;span style="color: #ebcb8b;"&gt;\r\n&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;$4&lt;/span&gt;&lt;span style="color: #ebcb8b;"&gt;\r\n&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;name&lt;/span&gt;&lt;span style="color: #ebcb8b;"&gt;\r\n&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #81a1c1;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;MultiBulk&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;[(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Bulk&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #a3be8c;"&gt;"get"&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;)),&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Bulk&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #a3be8c;"&gt;"name"&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;))]))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="networking"&gt;Networking&lt;/h2&gt;
&lt;p&gt;At this point, we have our data structures ready and we know how to parse
incoming requests into them.  Now we need to work on the networking part.  Let&amp;rsquo;s
teach our program how to listen on a socket and parse incoming text into
something useful.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s change our &lt;code&gt;main&lt;/code&gt; function to this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;main&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;IO&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;main&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; withSocketsDo &lt;span style="color: #81a1c1;"&gt;$&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    database &lt;span style="color: #81a1c1; font-weight: bold;"&gt;&amp;lt;-&lt;/span&gt; atomically &lt;span style="color: #81a1c1;"&gt;$&lt;/span&gt; newTVar &lt;span style="color: #81a1c1;"&gt;$&lt;/span&gt; fromList &lt;span style="color: #eceff4;"&gt;[(&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;"__version__"&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; version&lt;span style="color: #eceff4;"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    sock &lt;span style="color: #81a1c1; font-weight: bold;"&gt;&amp;lt;-&lt;/span&gt; listenOn &lt;span style="color: #81a1c1;"&gt;$&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;PortNumber&lt;/span&gt; &lt;span style="color: #b48ead;"&gt;7777&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    putStrLn &lt;span style="color: #a3be8c;"&gt;"Listening on localhost 7777"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    sockHandler sock database
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is pretty straight-forward.  Ask for a socket and then listen on it.  When
something happens on the socket, run the function &lt;code&gt;socketHandler&lt;/code&gt;.  Let&amp;rsquo;s
implement that next:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;sockHandler&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Socket&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;TVar&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;DB&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;IO&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;sockHandler&lt;/span&gt; sock db &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;handle&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;_&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;_&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;)&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;&amp;lt;-&lt;/span&gt; accept sock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    hSetBuffering handle &lt;span style="color: #81a1c1;"&gt;NoBuffering&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    hSetBinaryMode handle &lt;span style="color: #81a1c1;"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #81a1c1; font-weight: bold;"&gt;_&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;&amp;lt;-&lt;/span&gt; forkIO &lt;span style="color: #81a1c1;"&gt;$&lt;/span&gt; commandProcessor handle db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    sockHandler sock db
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Given a socket and a reference to a mutable database, we can get a handle and
start processing requests.  For each new connection, run &lt;code&gt;forkIO&lt;/code&gt; which will
do all this work of parsing and responding on a new lightweight thread.  At the
end, we simply recurse to accept new work.  The &lt;code&gt;commandProcessor&lt;/code&gt; function
does the heavy lifting here, so let&amp;rsquo;s write that next.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;commandProcessor&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Handle&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;TVar&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;DB&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;IO&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;commandProcessor&lt;/span&gt; handle db &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    reply &lt;span style="color: #81a1c1; font-weight: bold;"&gt;&amp;lt;-&lt;/span&gt; hGetReplies handle replyParser
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #81a1c1; font-weight: bold;"&gt;let&lt;/span&gt; command &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; parseReply reply
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    runCommand handle command db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    commandProcessor handle db
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This function runs the &lt;code&gt;replyParser&lt;/code&gt; we wrote earlier.  It uses a very clever
function called &lt;code&gt;hGetReplies&lt;/code&gt; which we will look at in a minute.  It will read
as much data as necessary from the handle to get an instance of &lt;code&gt;Reply&lt;/code&gt;.  We
then convert that reply to a command and run it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;hGetReplies&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Handle&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Parser&lt;/span&gt; a &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;IO&lt;/span&gt; a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;hGetReplies&lt;/span&gt; h parser &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; go &lt;span style="color: #81a1c1;"&gt;S&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;.&lt;/span&gt;empty
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;  &lt;span style="color: #81a1c1; font-weight: bold;"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    go rest &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        parseResult &lt;span style="color: #81a1c1; font-weight: bold;"&gt;&amp;lt;-&lt;/span&gt; parseWith readMore parser rest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        &lt;span style="color: #81a1c1; font-weight: bold;"&gt;case&lt;/span&gt; parseResult &lt;span style="color: #81a1c1; font-weight: bold;"&gt;of&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;            &lt;span style="color: #81a1c1;"&gt;Fail&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;_&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;_&lt;/span&gt; s   &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #bf616a;"&gt;error&lt;/span&gt; s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;            &lt;span style="color: #81a1c1;"&gt;Partial&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;{}&lt;/span&gt;    &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #bf616a;"&gt;error&lt;/span&gt; &lt;span style="color: #a3be8c;"&gt;"error: partial"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;            &lt;span style="color: #81a1c1;"&gt;Done&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;_&lt;/span&gt; r     &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; return r
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    readMore &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;S&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;.&lt;/span&gt;hGetSome h &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #b48ead;"&gt;4&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;*&lt;/span&gt;&lt;span style="color: #b48ead;"&gt;1024&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;parseWith&lt;/code&gt; function does partial matching.  When it can&amp;rsquo;t parse anything,
it will use the &lt;code&gt;readMore&lt;/code&gt; function to get more data and try again.  The
&lt;code&gt;readMore&lt;/code&gt; function uses the handle to read more data.  Once the parser can
match something, we are done.&lt;/p&gt;
&lt;h2 id="running-commands"&gt;Running commands&lt;/h2&gt;
&lt;p&gt;Once we have a command, we can run it!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;runCommand&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Handle&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Maybe&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Command&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;TVar&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;DB&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;IO&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;runCommand&lt;/span&gt; handle &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Get&lt;/span&gt; key&lt;span style="color: #eceff4;"&gt;))&lt;/span&gt; db &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    m &lt;span style="color: #81a1c1; font-weight: bold;"&gt;&amp;lt;-&lt;/span&gt; atomRead db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #81a1c1; font-weight: bold;"&gt;let&lt;/span&gt; value &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; getValue m key
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #81a1c1;"&gt;S&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;.&lt;/span&gt;hPutStr handle &lt;span style="color: #81a1c1;"&gt;$&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;S&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;.&lt;/span&gt;concat &lt;span style="color: #eceff4;"&gt;[&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;"$"&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; valLength value&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; crlf&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; value&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; crlf&lt;span style="color: #eceff4;"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;        &lt;span style="color: #81a1c1; font-weight: bold;"&gt;where&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;            valLength &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Value&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;ByteString&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;            valLength &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; pack &lt;span style="color: #81a1c1;"&gt;.&lt;/span&gt; show &lt;span style="color: #81a1c1;"&gt;.&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;S&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;.&lt;/span&gt;length
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;runCommand&lt;/span&gt; handle &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Set&lt;/span&gt; key value&lt;span style="color: #eceff4;"&gt;))&lt;/span&gt; db &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    updateValue &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;insert key value&lt;span style="color: #eceff4;"&gt;)&lt;/span&gt; db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #81a1c1;"&gt;S&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;.&lt;/span&gt;hPutStr handle ok
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;runCommand&lt;/span&gt; handle &lt;span style="color: #eceff4;"&gt;(&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;Just&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Unknown&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;)&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;_&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    &lt;span style="color: #81a1c1;"&gt;S&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;.&lt;/span&gt;hPutStr handle &lt;span style="color: #81a1c1;"&gt;$&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;S&lt;/span&gt;&lt;span style="color: #81a1c1;"&gt;.&lt;/span&gt;concat &lt;span style="color: #eceff4;"&gt;[&lt;/span&gt;&lt;span style="color: #a3be8c;"&gt;"-ERR "&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; &lt;span style="color: #a3be8c;"&gt;"unknown command"&lt;/span&gt;&lt;span style="color: #eceff4;"&gt;,&lt;/span&gt; crlf&lt;span style="color: #eceff4;"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;runCommand&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;_&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Nothing&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;_&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; return &lt;span style="color: #81a1c1;"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When the command is a &lt;code&gt;get&lt;/code&gt;, we read the &lt;code&gt;DB&lt;/code&gt; atom.  Then we construct a
bulk reply and write it to the handle.  The bulk reply is in the same format as
our messages above: &lt;code&gt;$5\r\nhonza\r\n&lt;/code&gt;.  The &lt;code&gt;getValue&lt;/code&gt; function is a lookup
function that returns &amp;ldquo;null&amp;rdquo; if a value can&amp;rsquo;t be found.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-haskell"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;getValue&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;::&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;DB&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Key&lt;/span&gt; &lt;span style="color: #81a1c1; font-weight: bold;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #81a1c1;"&gt;Value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #88c0d0;"&gt;getValue&lt;/span&gt; db k &lt;span style="color: #81a1c1; font-weight: bold;"&gt;=&lt;/span&gt; findWithDefault &lt;span style="color: #a3be8c;"&gt;"null"&lt;/span&gt; k db
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When the command is a &lt;code&gt;set&lt;/code&gt;, we use our &lt;code&gt;updateValue&lt;/code&gt; function from above
and write the &lt;code&gt;ok&lt;/code&gt; to the handle.  The &lt;code&gt;ok&lt;/code&gt; variable is just &lt;code&gt;+OK\r\n&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When the command is unknown, we write an error to the handle.&lt;/p&gt;
&lt;h2 id="compiling-and-running"&gt;Compiling and running&lt;/h2&gt;
&lt;p&gt;You can now build your program with&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-nil"&gt;$ stack build
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And run it with&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-nil"&gt;$ stack exec Redish
Listening on localhost 7777
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To test it out, you can connect to it with the &lt;code&gt;redis-cli&lt;/code&gt; tool:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-nil"&gt;$ redis-cli -p 7777
127.0.0.1:7777&amp;gt; set name honza
OK
127.0.0.1:7777&amp;gt; get name
"honza"
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can test the performance with something silly, like:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-nil"&gt;$ time redis-cli -r 10000 get name
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;You can see the finished product on &lt;a href="https://github.com/honza/redish"&gt;GitHub&lt;/a&gt;.  Feedback is welcome, so are
questions.&lt;/p&gt;</description><author>Honza Pokorný</author><pubDate>Thu, 03 Sep 2015 18:00:00 GMT</pubDate><guid isPermaLink="true">https://honza.pokorny.ca/2015/09/building-a-redis-clone-in-haskell/</guid></item><item><title>Eliminate Useless Callback Wrappers in JavaScript</title><link>https://peterlyons.com/problog/2015/09/eliminate-useless-callback-wrappers-in-javascript/</link><description>&lt;p&gt;Just a quick tip from some code I encountered today. Instead of this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function outerFunc (callback) {
  doSomething(42, function (err) {
    callback(err)
  })
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eliminate the useless callback wrapper function:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function outerFunc (callback) {
  doSomething(42, callback)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It's more concise and more efficient and entirely equivalent.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Thu, 03 Sep 2015 07:21:37 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2015/09/eliminate-useless-callback-wrappers-in-javascript/</guid></item><item><title>Can we really trust the official Docker images?</title><link>https://blog.erethon.com/blog/2015/09/03/can-we-really-trust-the-official-docker-images/</link><description>&lt;p&gt;
Yeap, this is another rant on the security practices of Docker users.
Like we didn't have &lt;a href="https://titanous.com/posts/docker-insecurity"&gt;enough&lt;/a&gt; of &lt;a href="http://www.banyanops.com/blog/analyzing-docker-hub/"&gt;those&lt;/a&gt; already.&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Thu, 03 Sep 2015 03:53:22 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2015/09/03/can-we-really-trust-the-official-docker-images/</guid></item><item><title>lua-sh: calling shell commands as functions</title><link>https://zserge.com/posts/luash/</link><description>Lua is one of my favourite languages. It&amp;rsquo;s tiny, it&amp;rsquo;s fast, it has simple grammar and is very easy to learn.
I also often write shell scripts - from simple one-liners, to bigger ones containing business logic and binding together smaller app components. In fact, this blog is powered by a few shell scripts to generate list of posts, rss xml etc.
I had an experience in the past when Bash script became hard to maintain.</description><author>zserge's blog</author><pubDate>Thu, 03 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/luash/</guid></item><item><title>Eagle Scout</title><link>https://sean.lane.sh/posts/2015/09/Eagle-Scout/</link><description>&lt;p&gt;After 7 years in scouting, I achieved the rank of Eagle Scout. My project consisted of removing an existing flagpole that was too small and installing a custom made one that was twice as large. The flagpole sits adjacent to a memorial to fallen aerial firefighters outside of the Porterville Air Attack Base in  Porterville, California.&lt;/p&gt;
&lt;p&gt;An album of the project and a small article from the local newspaper about the project may be viewed at the following links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.flickr.com/photos/seanlane/sets/72157672311571116/with/28675820290"&gt;Flickr: Eagle Scout Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.archive.org/web/20220812172652/https://www.recorderonline.com/new-pole-lets-flags-fly-high-over-air-attack-base/article_1ce3953c-ad0d-5cf4-bca2-d4b5e8efb47f.html"&gt;Porterville Recorder: New pole lets flags fly high over Air Attack Base&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>Posts on Sean Lane</author><pubDate>Thu, 03 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://sean.lane.sh/posts/2015/09/Eagle-Scout/</guid></item><item><title>Go Forth and Search</title><link>https://boyter.org/2015/09/search/</link><description>&lt;p&gt;A very fast update. At the request of the excellent &lt;a href="https://github.com/larsbrinkhoff"&gt;Lars Brinkhoff&lt;/a&gt; via GitHub I have added in the language Forth to be one of the supported languages inside searchcode.&lt;/p&gt;
&lt;p&gt;An example search which shows this working would be the following &lt;a href="https://searchcode.com/?q=forth&amp;amp;loc=0&amp;amp;loc2=10000&amp;amp;lan=181"&gt;https://searchcode.com/?q=forth&amp;amp;loc=0&amp;amp;loc2=10000&amp;amp;lan=181&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I had to solve a number of interesting problems inside searchcode to support this change. For pragmatic reasons the way searchcode identifies what language any piece of code is written in is to run it though CLOC (Count Lines Of Code). Written in perl it does a reasonably good job of pulling out metadata for any given piece of code. However since my perl ability is poor at best submitting a patch to support forth was not going to be an option.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 03 Sep 2015 01:25:18 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/09/search/</guid></item><item><title>Hacker proves with Open Data that Microsoft license costs don't matter</title><link>https://stop.zona-m.net/2015/09/hacker-proves-with-open-data-that-microsoft-license-costs-dont-matter/</link><description>&lt;p&gt;(no, not really but&amp;hellip;) In December 2014, italian Prime Minister Matteo Renzi annunced &lt;a href="http://soldipubblici.gov.it"&gt;soldipubblici.gov.it&lt;/a&gt;, a Web portal that provides official Open Data on public spending (&amp;ldquo;Soldi Pubblici&amp;rdquo;, that is) in Italy. Within a few hours, an italian Hacker,&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Wed, 02 Sep 2015 14:09:07 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/09/hacker-proves-with-open-data-that-microsoft-license-costs-dont-matter/</guid></item><item><title>Tomcat Hates Encoded Slashes</title><link>http://engineering.widen.com/blog/tomcat-slashes</link><description>Tomcat will treat encoded slashes in a URI as path delimiters. I'll demonstrate how this can cause you problems, why it occurs, and how you can work around it.</description><author>Train of Thought</author><pubDate>Wed, 02 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">http://engineering.widen.com/blog/tomcat-slashes</guid></item><item><title>Sierra Leone travel bookmarks</title><link>https://xenodium.com/sierra-leone-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.sierraleonemarathon.com/"&gt;Sierra Leone marathon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.street-child.co.uk/"&gt;Street Child charity&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 02 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/sierra-leone-travel-bookmarks</guid></item><item><title>London travel bookmarks</title><link>https://xenodium.com/london-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.chgt.org.uk"&gt;Chiswick House &amp;amp; Gardens&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.heathrobinsonmuseum.org"&gt;Heath Robinson Museum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.londonlibrary.co.uk/"&gt;London Library (book your free tour)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Quaker_Gardens,_Islington"&gt;Quaker gardens&lt;/a&gt;, Islington.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sohotheatre.com/"&gt;Soho Theatre&lt;/a&gt; (not tried yet).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cntraveller.com/gallery/best-brunch-london"&gt;The best brunch London 2020 | CN Traveller&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cntraveller.com/gallery/the-most-beautiful-restaurants-in-london"&gt;The most beautiful restaurants in London for 2020 | CN Traveller&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 02 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/london-travel-bookmarks</guid></item><item><title>Tao Te Ching</title><link>https://june.kim/tao-te-ching/</link><author>june.kim</author><pubDate>Wed, 02 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/tao-te-ching/</guid></item><item><title>Hello World</title><link>https://sean.lane.sh/posts/2015/09/Hello-World/</link><description>&lt;p&gt;&lt;em&gt;Update as of November 2018:&lt;/em&gt; I&amp;rsquo;ve since moved to &lt;a href="https://sean.lane.sh"&gt;https://sean.lane.sh&lt;/a&gt;, just keeping this around for sentiment&amp;rsquo;s sake.&lt;/p&gt;
&lt;p&gt;While most definitely not the first or the last, hopefully this is a seminal moment for my own personal site. I hope to stay with &lt;a href="http://seanlane.net"&gt;seanlane.net&lt;/a&gt; after putting my wife through the torment of having me decide which of several domain names to settle on.&lt;/p&gt;
&lt;p&gt;I thought &lt;a href="http://sean.tl"&gt;sean.tl&lt;/a&gt; would be a nice little domain hack of my first name and initials, but it proved to be fairly confusing, as most people had no idea what the &amp;lsquo;.tl&amp;rsquo; was supposed to go with. Of course, all of the &lt;code&gt;sean.*&lt;/code&gt; domains that make more sense have been taken, and &lt;a href="http://seanlane.com"&gt;seanlane.com&lt;/a&gt; is devoted to a redirect to a concert scheduling site of some sort for a musician that shares both my given and last names. But I was pretty happy to find this domain, and it seems to be working just fine.&lt;/p&gt;
&lt;p&gt;In any case, I am using Github Pages to host this with a nice little Jekyll theme from &lt;a href="http://jekyllnow.com"&gt;JekyllNow.com&lt;/a&gt; since I need this to be up and running for a class I am taking this semester. Maybe I can see if there is anything more elegant I can do with it later, but this is more than enough for the time being.&lt;/p&gt;</description><author>Posts on Sean Lane</author><pubDate>Wed, 02 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://sean.lane.sh/posts/2015/09/Hello-World/</guid></item><item><title>Exporting Documents from KnowledgeTree 3.7.0.2</title><link>https://boyter.org/2015/09/exporting-documents-knowledgetree-3-7-0-2/</link><description>&lt;p&gt;I was recently tasked with exporting a large collection of documents from KnowledgeTree (KT) for a client. The collection was too large to use the download all functionality and too wide to attempt to export each folder individually.&lt;/p&gt;
&lt;p&gt;I had played around with the WebDav connection that KT provides but it either didn&amp;rsquo;t work or was designed deliberately to not allow exporting of the documents.&lt;/p&gt;
&lt;p&gt;I looked at where the documents were  stored on disk but KT stores them as numbered files in numbered directories sans extension or folder information.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 02 Sep 2015 01:13:04 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/09/exporting-documents-knowledgetree-3-7-0-2/</guid></item><item><title>The 5th Wave</title><link>https://olshansky.info/movie/the_5th_wave/</link><description>Olshansky's review of The 5th Wave</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 01 Sep 2015 06:59:38 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_5th_wave/</guid></item><item><title>Forest</title><link>https://june.kim/forest/</link><author>june.kim</author><pubDate>Tue, 01 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/forest/</guid></item><item><title>OS X Software Update Channels For Betas</title><link>https://smcleod.net/2015/09/os-x-software-update-channels-for-betas/</link><description>&lt;h3 id="set-update-channel-to-receive-developer-beta-update"&gt;Set update channel to receive developer beta update&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo softwareupdate --set-catalog https://swscan.apple.com/content/catalogs/others/index-10.11seed-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="set-update-channel-to-receive-public-beta-update"&gt;Set update channel to receive public beta update&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo softwareupdate --set-catalog https://swscan.apple.com/content/catalogs/others/index-10.11beta-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="list-available-updates"&gt;List available updates&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo softwareupdate --list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="set-update-channel-to-receive-default-stable-updates"&gt;Set update channel to receive default, stable updates&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo softwareupdate --clear-catalog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="show-current-settings"&gt;Show current settings&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;defaults &lt;span class="nb"&gt;read&lt;/span&gt; /Library/Preferences/com.apple.SoftwareUpdate.plist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="write-setting-manually"&gt;Write setting manually&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;defaults write /Library/Preferences/com.apple.SoftwareUpdate CatalogURL https://swscan.apple.com/content/catalogs/others/index-10.11beta-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><author>smcleod.net</author><pubDate>Tue, 01 Sep 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/09/os-x-software-update-channels-for-betas/</guid></item><item><title>Disabling graphical password prompts</title><link>https://blog.separateconcerns.com/2014-10-24-cli-passwords.html</link><description>&lt;p&gt;These days Linux systems tend to open graphical password prompts when a CLI
application needs user authentication. I don’t know about you but I really
don’t like that.&lt;/p&gt;
&lt;p&gt;The first offender is git, which uses x11-ssh-askpass if installed. The
simplest solution would be not to install it but it is a dependency of
virt-manager on Arch Linux… Thankfully you can tell git not to use it:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-shell"&gt;git config --global core.askpass ""
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The second one, in my case, was &lt;a href="http://www.passwordstore.org/"&gt;pass&lt;/a&gt;.
If you try to use it in Gnome, the keyring hijacks the GPG agent
and you get that message (plus a graphical prompt):&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-text"&gt;gpg: WARNING: The GNOME keyring manager hijacked the GnuPG agent.
gpg: WARNING: GnuPG will not work properly - please configure
that tool to not interfere with the GnuPG system!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The Gnome keyring is an annoying piece of software that replaces password
prompts for several tools including SSH and GPG. you can disable it this way:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-shell"&gt;mkdir -p ~/.config/autostart
cd !$
cp /etc/xdg/autostart/gnome-keyring-* .
for i in *; do echo "Hidden=true" &amp;gt;&amp;gt; $i; done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;… but then GPG will use yet another graphical prompt! To finally stay in your
terminal, create the file &lt;code&gt;~/.gnupg/gpg-agent.conf&lt;/code&gt; with the following content:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-shell"&gt;pinentry-program /usr/bin/pinentry-curses
&lt;/code&gt;&lt;/pre&gt;</description><author>Separate Concerns</author><pubDate>Mon, 31 Aug 2015 22:30:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2014-10-24-cli-passwords.html</guid></item><item><title>Tomfoolery with Typography: Emphasizing things</title><link>https://bastian.rieck.me/blog/2015/tft_03_emphasis/</link><description>&lt;p&gt;When writing your &lt;em&gt;magnum opus&lt;/em&gt;, you might want to put emphasis on certain facts, names, and so on.
There are three good ways and one bad way of doing this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Do not use underlining for emphasis in a text. Use italics, bold, or small caps, depending on
your font and your fancy.&lt;/p&gt;
&lt;p&gt;Let us take a look at the bad way first: Underlining. &lt;u&gt;Depending on the font you use, it might
look very irregular. For web content, it might confuse your readers because they expect a hyperlink.
Also, it is slightly hard to read.&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;This is a remnant from the age of typewriters where other text decorations were impossible to do.
Let this remnant enjoy its well-deserved retirement. In modern times, we can do without it. It
evokes, at least for me, the distinct style of yellow press publication.&lt;/p&gt;
&lt;p&gt;So, what are the three good ways, then? To wit, &lt;em&gt;italics&lt;/em&gt;, &lt;strong&gt;bold&lt;/strong&gt;, or &lt;span style="font-variant: small-caps;"&gt;small caps&lt;/span&gt;. Italics are easily achieved in LaTeX with &lt;code&gt;\textit{Text}&lt;/code&gt; (or
&lt;code&gt;\emph{Text}&lt;/code&gt;, which is preferable for a number of reasons; see below) or in HTML with
&lt;code&gt;&amp;lt;em&amp;gt;Text&amp;lt;/em&amp;gt;&lt;/code&gt;. Similarly, you obtain a bold decoration with &lt;code&gt;\textbf{Text}&lt;/code&gt; in LaTeX or
&lt;code&gt;&amp;lt;strong&amp;gt;Text&amp;lt;/strong&amp;gt;&lt;/code&gt; in HTML—although &lt;code&gt;&amp;lt;strong&amp;gt;&lt;/code&gt; only defaults to bold text. How it is
actually rendered depends on the CSS. Last, small caps are capital characters that are set similar
to surrounding lower case letters, making them not as conspicuous as upper-case characters. Whether
they look good or not depends very much on the font you use. In LaTeX, you can get them using
&lt;code&gt;\textsc{Text}&lt;/code&gt;, in HTML you have to add &lt;code&gt;font-variant:small-caps;&lt;/code&gt; to the current style.&lt;/p&gt;
&lt;p&gt;This is pretty straightforward. The one thing you should avoid is &lt;em&gt;combining&lt;/em&gt; different modes of
emphasis. Bold and italics do not mix well in most cases.&lt;/p&gt;
&lt;p&gt;As a parting thought, some words on &lt;code&gt;\emph&lt;/code&gt; in LaTeX: You should rather use &lt;code&gt;\emph&lt;/code&gt; than &lt;code&gt;\textit&lt;/code&gt;
because the former command is somewhat smart and can recognize nesting. For example, if your
personal style is to typeset figure captions in italics but you need to emphasize something in the
caption, &lt;code&gt;\emph&lt;/code&gt; will detect this and render the text upright. When using &lt;code&gt;\textit&lt;/code&gt;, nothing would
happen here because, well, the text is already in italics. If this does not convince you, just think
about the flexibility offered by &lt;code&gt;\emph&lt;/code&gt;: You could redefine it to work differently for some
sections in your document if that strikes your fancy.&lt;/p&gt;
&lt;p&gt;To end with a happy note for the poor underlined text: You can use underlining to mark corrections
in a text. This might be especially helpful when collaborating on a document. But do not use
underlines for anything that is going to be included in the final version of a document.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Mon, 31 Aug 2015 20:59:53 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/tft_03_emphasis/</guid></item><item><title>Links - August 31, 2015</title><link>https://faingezicht.com/links/2015/08/31/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 31 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/31/links/</guid></item><item><title>A blazing fast geo database with LevelDB, Go and Geohashes</title><link>https://blog.nobugware.com/post/2015/leveldb_geohash_golang/</link><description>You probably have heard of LevelDB it’s a blazing fast key value store (as a library not a daemon), that uses Snappy compression.
There is plenty of usages for it, the API is very simple at least in Go (I will be using Goleveldb).
The key is a []byte the value is a []byte so you can “get”, “put” &amp;amp; “delete” that’s it.
I needed a low memory low cpu system that could collect millions of geo data and query over them, Geohash has an interesting property you can encode longitude and latitude into a string : f2m616nn this hash represents the lat &amp;amp; long 46.</description><author>Fabrice Aneche</author><pubDate>Mon, 31 Aug 2015 01:25:02 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2015/leveldb_geohash_golang/</guid></item><item><title>I have become Crazy Cat Lady, the Buyer of Cat Strollers</title><link>https://liza.io/i-have-become-crazy-cat-lady-the-buyer-of-cat-strollers/</link><description>&lt;p&gt;I am sorry in advance for what you are about to read. If witnessing the evolution of a mere human into Crazy Cat Lady is something you may find disturbing, turn back now and pretend you never came to this godforsaken place.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sun, 30 Aug 2015 12:27:41 GMT</pubDate><guid isPermaLink="true">https://liza.io/i-have-become-crazy-cat-lady-the-buyer-of-cat-strollers/</guid></item><item><title>The answers are there</title><link>https://june.kim/answers/</link><author>june.kim</author><pubDate>Fri, 28 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/answers/</guid></item><item><title>Links - August 28, 2015</title><link>https://faingezicht.com/links/2015/08/28/links/</link><description/><author>Avy Faingezicht</author><pubDate>Fri, 28 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/28/links/</guid></item><item><title>Why you are very often wrong when you copy a full web page somewhere else online</title><link>https://stop.zona-m.net/2015/08/why-you-are-very-often-wrong-when-you-copy-a-full-web-page-somewhere-else-online/</link><description>&lt;p&gt;If and when &lt;strong&gt;the author&lt;/strong&gt; (including me, I routinely do that on &lt;strong&gt;OTHER&lt;/strong&gt; websites I run, or contribute to!) of some web page, video etc.. tells you that you can copy it all elsewhere, by all means DO it. In all other cases, including &amp;ldquo;sharing&amp;rdquo; them on Facebook or similar networks, or sending the full thing via email, you do a serious disservice&amp;hellip; not just to that author but, **above all, **to all the people with which you &amp;ldquo;share&amp;rdquo; that stuff.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 27 Aug 2015 20:12:54 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/08/why-you-are-very-often-wrong-when-you-copy-a-full-web-page-somewhere-else-online/</guid></item><item><title>About the Stop (original version)</title><link>https://stop.zona-m.net/about-old/</link><description>Welcome to the Stop, a website by Marco Fioretti, author, teacher and a few other things. The sidebar on this website includes more news about my courses and other projects.
The Stop hosts, in the four sections explained below, information and writings directly related to my work, including online versions of some of my publications. Some pieces about trekking and backpacking are at Strider, and anything else that I feel useful to share stays in my other &amp;ldquo;Tips&amp;rdquo; blog.</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 27 Aug 2015 18:17:53 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/about-old/</guid></item><item><title>Links - August 27, 2015</title><link>https://faingezicht.com/links/2015/08/27/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 27 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/27/links/</guid></item><item><title>Sampling the Visible Sphere</title><link>https://www.akalin.com/sampling-visible-sphere</link><description>&lt;p&gt;&lt;em&gt;(Note: this article is a summary of
&lt;a href="http://ompf2.com/viewtopic.php?f=3&amp;amp;t=1914"&gt;this thread on
ompf2&lt;/a&gt;.)
&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The usual method for sampling a sphere from a point outside the
sphere is to calculate the angle of the cone of the visible portion
and uniformly sample within that cone, as described in
&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.40.6561"&gt;Shirley/Wang&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, one detail that is glossed over is that you still need to map
from the sampled direction to the point on the sphere. The usual
method is to simply generate a ray from the point and the sampled
direction and intersect it with the sphere. However, this intersection
test may fail due to floating point inaccuracies (e.g., if the sphere
is small and the distance from the point is large).&lt;/p&gt;

&lt;p&gt;I've found a couple of existing ways to deal with this. As
described in the pbrt book, pbrt simply assumes that the ray just
grazes the sphere if the intersection fails, and then projects the
center of the sphere onto the ray
(&lt;a href="https://github.com/mmp/pbrt-v2/blob/master/src/shapes/sphere.cpp#L249"&gt;code
here&lt;/a&gt;). mitsuba moves the origin of the ray closer to the sphere
(in fact, from within it) before doing the test (falling back to
projecting the center onto the ray if that still fails)
(&lt;a href="https://www.mitsuba-renderer.org/repos/mitsuba/files/aeb7f95b37111187cc2ddf21cfffeff118bc52d2/src/shapes/sphere.cpp#L287"&gt;code
here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;However, this seems inelegant. I've come up with a better way,
which involves converting the sampled cone angle \(θ\) (as
measured from the segment connecting the point to the sphere center)
into an angle \(α\) from the inside of the sphere, and then
simply using \(α\) and the sampled polar angle \(\varphi\) onto
the sphere. This turns out to be simple, and in my unscientific tests
a bit faster.&lt;/p&gt;

&lt;p&gt;Here's a crude diagram showing the geometry:&lt;p&gt;

&lt;img alt="Diagram for derivation of cos &amp;alpha;" src="/sampling-visible-sphere-files/diagram.png" /&gt;

&lt;p&gt;You can see that

\[
  L = d \cos θ - \sqrt{r^2 - d^2 \sin^2 θ}
\]

  and also by the law of cosines,

\[
  L^2 = d^2 + r^2 - 2 d r \cos α\text{.}
\]

We're actually more interested in \(\cos α\), so solving for that
  we get

\[
\cos α = \frac{d}{r} \sin^2 θ + \cos θ \sqrt{1 - \frac{d^2}{r^2} \sin^2 θ}\text{.}
\]

An alternate form, which may be easier to analyze, recalling that
\(\sin θ_{\max} = r/d\), is

\[
\cos α = \frac{\sin^2 θ}{\sin θ_{\max}} + \cos θ \sqrt{1 - \frac{\sin^2 θ}{\sin^2 θ_{\max}}}\text{.}
\]
&lt;/p&gt;

&lt;div class="p"&gt;So sampling pseudocode would look like:

&lt;pre class="code-container"&gt;&lt;code class="language-c++"&gt;(cos θ, φ) = uniformSampleCone(rng, cos θmax)
D = 1 - d² sin² θ / r²
if D ≤ 0 {
  cos α = sin θmax
} else {
  cos α = (d/r) sin² θ + cos θ √D
}
ω = sphericalDirection(cos α, φ)
pSurface = C + r ω&lt;/code&gt;&lt;/pre&gt;

I haven't done any analysis yet on the most robust way [in the
  floating-point sense] to do the calculations above.)&lt;/div&gt;

&lt;p&gt;There's no backfacing since we clamp \(\cos α\) to \(\sin
θ_{\max}\), which is analogous to the case when the ray from
\(P\) misses the sphere.&lt;/p&gt;

&lt;p&gt;Note that one cannot just compute \(α_{\max}\) and uniformly
sample the cone from inside the sphere, as that doesn't produce the
same distribution over the visible region as sampling the cone from
outside the sphere. To preserve correctness, you would have to use the
(uniform) PDF over the surface area of the visible portion of the
sphere, but you would have to then convert that to a PDF with respect
to projected solid angle from \(P\), which is suboptimal to just doing
the sampling with respect to projected solid angle from \(P\) as
described above.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Like this post? Subscribe to
  &lt;!-- The image is 256x256, the center of the dot is 189 pixels from the
     top, and the radius of the dot is 24. Therefore, the dot is 43/256 =
     0.16796875 of the image height above the bottom.--&gt;
&lt;a href="feed/atom"&gt;my feed &lt;img alt="RSS icon" src="feed-icon.svg" /&gt;&lt;/a&gt;

  or follow me on
  &lt;a href="https://twitter.com/fakalin"&gt;Twitter &lt;img alt="Twitter icon" src="twitter-icon.svg" /&gt;&lt;/a&gt;.&lt;/p&gt;</description><author>Fred Akalin</author><pubDate>Wed, 26 Aug 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://www.akalin.com/sampling-visible-sphere</guid></item><item><title>Questions on Success</title><link>https://june.kim/success/</link><author>june.kim</author><pubDate>Wed, 26 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/success/</guid></item><item><title>Links - August 26, 2015</title><link>https://faingezicht.com/links/2015/08/26/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 26 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/26/links/</guid></item><item><title>Decoding CAPTCHA's Handbook</title><link>https://boyter.org/2015/08/decoding-captchas-handbook/</link><description>&lt;p&gt;Some time ago I wrote an article about &lt;a href="http://www.boyter.org/decoding-captchas/"&gt;Decoding CAPTCHA&amp;rsquo;s&lt;/a&gt; which has become what appears to be the first resource most people encounter when searching for information in the decoding CAPTCHA space.&lt;/p&gt;
&lt;p&gt;I had continued to write about CAPTCHA&amp;rsquo;s over the years with posts scattered around the web. A while ago I started to consolidate all of my content on this blog and realised that I had considerably more CAPTCHA related articles then I thought. Some were in an unfinished or unpublished state. I had considered posting them all online but instead decided to polish it all up into a much better resource and publish it as a book.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 26 Aug 2015 01:49:31 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/08/decoding-captchas-handbook/</guid></item><item><title>Zoolander</title><link>https://olshansky.info/movie/zoolander/</link><description>Olshansky's review of Zoolander</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 25 Aug 2015 18:40:33 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/zoolander/</guid></item><item><title>Straight Outta Compton</title><link>https://olshansky.info/movie/straight_outta_compton/</link><description>Olshansky's review of Straight Outta Compton</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 25 Aug 2015 18:36:13 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/straight_outta_compton/</guid></item><item><title>A Heed to the Salaryman</title><link>https://june.kim/salaryman/</link><author>june.kim</author><pubDate>Tue, 25 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/salaryman/</guid></item><item><title>Links - August 25, 2015</title><link>https://faingezicht.com/links/2015/08/25/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 25 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/25/links/</guid></item><item><title>The Fall of Hyperion (Hyperion Cantos, #2)</title><link>https://olshansky.info/book/the_fall_of_hyperion_hyperion_cantos_2/</link><description>Olshansky's review of The Fall of Hyperion (Hyperion Cantos, #2) by Dan Simmons</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 25 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/the_fall_of_hyperion_hyperion_cantos_2/</guid></item><item><title>Zero Downtime Deployment with AWS ECS and ELB</title><link>https://www.brightball.com/articles/zero-downtime-deployment-with-aws-ecs-and-elb</link><description>As development teams push farther toward continuous delivery, deploying updates to an application without disruption to users is constantly becoming a more sought-after practice. Amazon’s EC2 Container Service helps to make that easier than ever with tight Elastic Load Balancer integration.</description><author>Brightball Articles</author><pubDate>Tue, 25 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/zero-downtime-deployment-with-aws-ecs-and-elb</guid></item><item><title>Custom endpoint handlers with Eve</title><link>https://nicolaiarocci.com/building-custom-endpoint-handlers-with-eve/</link><description>&lt;p&gt;On &lt;a href="https://stackoverflow.com/questions/24134383/servicing-html-requests-with-eve/"&gt;Stack Overflow&lt;/a&gt; and the Eve &lt;a href="https://groups.google.com/forum/?hl=en#!topic/python-eve/LM9kZkgq3vA"&gt;mailing list&lt;/a&gt;, but also in my mailbox and even on Twitter, I get a lot of enquiries on how to build custom endpoints within a Eve-powered RESTful application. Now, since within Eve all endpoints are fully customizable, what they really mean is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How do I setup endpoints without any binding to a data entity, just connected to a custom method?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;They would like to call something like &lt;code&gt;/mycustomendpoint&lt;/code&gt; and get the response from a method they have defined somewhere in the Python sources. The standard endpoint-entity mapping provided by Eve covers 90% of their needs, but sometimes they just need endpoints that have nothing to do with data entities.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 24 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/building-custom-endpoint-handlers-with-eve/</guid></item><item><title>Links - August 24, 2015</title><link>https://faingezicht.com/links/2015/08/24/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 24 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/24/links/</guid></item><item><title>Use ImageMagick to auto-orient images</title><link>https://xenodium.com/use-imagemagick-to-auto-orient-images</link><description>&lt;p&gt;Recently needed to rotate images based on EXIF metadata. ImageMagick to the rescue:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ for i in *.png; do convert -auto-orient &amp;quot;$i&amp;quot; &amp;quot;$i&amp;quot;; done
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 23 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/use-imagemagick-to-auto-orient-images</guid></item><item><title>Bengali Macher Jhol</title><link>https://xenodium.com/bengali-macher-jhol</link><description>&lt;p&gt;My friend Sakhya brought me the wonderful &lt;a href="http://www.nitamehta.com/Cookbook-of-Regional-Cuisines-of-India-%2528Veg-%2B-Non-Veg%2529_431.html"&gt;Cookbook of Regional Cuisines of India&lt;/a&gt;. After improvisations and substitutions, here's my attempt at making Bengali Machcher Jhol:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/bengali-machcher-jhol/bengali-machcher-jhol-00.png" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/bengali-machcher-jhol/bengali-machcher-jhol-01.png" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/bengali-machcher-jhol/bengali-machcher-jhol-02.png" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/bengali-machcher-jhol/bengali-machcher-jhol-03.png" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/bengali-machcher-jhol/bengali-machcher-jhol-04.png" /&gt; &lt;img alt="" src="https://xenodium.github.io/images/bengali-machcher-jhol/bengali-machcher-jhol-05.png" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 23 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/bengali-macher-jhol</guid></item><item><title>Running Laravel's Lumen On Google App Engine</title><link>https://kernelcurry.com/blog/running-lumen-on-google-app-engine/</link><description>&lt;p&gt;When looking for a more stable hosting solution for my &lt;a href="https://mtgapi.com?utm_source=kernelcurry.com&amp;amp;utm_medium=referral&amp;amp;utm_campaign=running-lumen-on-google-app-engine"&gt;Magic: The Gathering Api&lt;/a&gt;, I stumbled across Google&amp;rsquo;s App Engine. If you have not read up on this solution, I would recommend it.&lt;/p&gt;
&lt;p&gt;To get Laravel&amp;rsquo;s Lumen running correctly on Google App Engine, there are a few questions that we need to answer. Lets take these one at a time.&lt;/p&gt;
&lt;h2 id="how-does-the-application-know-it-is-running-on-google-app-engine"&gt;How does the application know it is running on Google App Engine?&lt;/h2&gt;
&lt;p&gt;One of the easiest ways to figure out if the application is running on Google App Engine is to check if the &lt;code&gt;.env&lt;/code&gt; file is present. This is because the deployment &amp;ldquo;ignore&amp;rdquo; RegEx includes any files that start with a &lt;code&gt;.&lt;/code&gt; (AKA Unix hidden files). This function will come in handy when answering the next questions.&lt;/p&gt;</description><author>KernelCurry</author><pubDate>Sun, 23 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kernelcurry.com/blog/running-lumen-on-google-app-engine/</guid></item><item><title>Hello</title><link>https://www.danielcorin.com/posts/2015/2015-08-22-hello/</link><description>Hello</description><author>Thought Eddies</author><pubDate>Sun, 23 Aug 2015 00:59:48 GMT</pubDate><guid isPermaLink="true">https://www.danielcorin.com/posts/2015/2015-08-22-hello/</guid></item><item><title>New habits for 2015</title><link>https://xenodium.com/new-habits-for-2015</link><description>&lt;ul&gt;
&lt;li&gt;20 min morning meditations.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ted.com/talks/terry_moore_how_to_tie_your_shoes"&gt;A better way to tie your shoes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Cold showers (all of them!).&lt;/li&gt;
&lt;li&gt;Keys, wallet, phone, badge, and headphones live together.&lt;/li&gt;
&lt;li&gt;Listen to audio books.&lt;/li&gt;
&lt;li&gt;Morning runs.&lt;/li&gt;
&lt;li&gt;Nightly flossing.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 22 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/new-habits-for-2015</guid></item><item><title>Meditation retreats bookmarks</title><link>https://xenodium.com/meditation-retreats-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/travel-tips-and-articles/best-places-to-seek-silence"&gt;Best places to seek silence&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dhanakosa.com/retreat/2015/opening-life-0"&gt;Opening to life @ Dhanakosa Buddhist Retreat Centre&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.samyeling.org/"&gt;Samye Ling (Tibetan- buddhist monastery)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dhamma.org/en-US/index"&gt;Vipassana Meditation (centers across world)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 22 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/meditation-retreats-bookmarks</guid></item><item><title>Mindfulness/meditation bookmarks</title><link>https://xenodium.com/meditation-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.10percenthappier.com/"&gt;10% Happier: Mindfulness Meditation Courses with Dan Harris and Joseph Goldstein&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Aimless_wandering"&gt;Aimless Wandering&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nytimes.com/2016/06/05/opinion/sunday/are-you-in-despair-thats-good.html"&gt;Are You in Despair? That’s Good (NY Times)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lesswrong.com/lw/3w3/how_to_beat_procrastination/"&gt;Beating procrastination&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://theenergyproject.com/blog/take-back-your-life-ten-steps"&gt;Best 10 life changes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.drweil.com/health-wellness/body-mind-spirit/stress-anxiety/breathing-three-exercises/"&gt;Breathing Exercise: Three To Try | 4-7-8 Breath (Andrew Weil, M.D.)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://theoryengine.org/life/contemplative-practice-that-isnt-meditating/"&gt;Contemplative Practice That Isn’t Meditating&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dayoneapp.com/"&gt;Day One - The award-winning journal app for iPhone, iPad, and Mac.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v%3DZ8LOhZmuVaE&amp;amp;feature%3Dyoutu.be"&gt;Developing Lotus Flexibility - Preparing Yoga Padmasana Sitting Position, part 1 (YouTube)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://franticworld.com/free-meditations-from-mindfulness/"&gt;Free meditations from Mindfulness | Mindfulness: Finding Peace in a Frantic World&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hbr.org/2014/02/how-to-make-yourself-work-when-you-just-dont-want-to/"&gt;How to Make Yourself Work When You Just Don’t Want To&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tricycle.com/blog/how-sit-zen-and-stretching-excercises-full-lotus"&gt;How to sit Zen&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jonathanfoust.libsyn.com/webpage"&gt;Jonathan Foust's talks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://buddhistinspiration.blogspot.com/2011/12/well-see-zen-story.html"&gt;Kalyanamittas: We'll See - A Zen Story&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.theguardian.com/lifeandstyle/2011/jan/22/meditation-centres-uk"&gt;Meditation centres around the UK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/g_s_bhogal/status/1225561131122597896"&gt;MEGATHREAD TIME: In 40 tweets I will describe 40 power powerful concepts for understanding the world&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.memrise.com/blog/"&gt;Memreise's blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@yegg/mental-models-i-find-repeatedly-useful-936f1cc405d"&gt;Mental Models I Find Repeatedly Useful - Gabriel Weinberg (Medium)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@yegg/mental-models-i-find-repeatedly-useful-936f1cc405d#.g0gjbdp8z"&gt;Mental Models I Find Repeatedly Useful&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mindbodyattention.com/"&gt;Mind Body Attention — thinking, moving, and meditating&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thebuddhistcentre.com/text/mindfulness-breathing"&gt;Mindfulness breathing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hbr.org/2014/12/mindfulness-mitigates-biases-you-may-not-know-you-have"&gt;Mindfulness Mitigates Biases You May Not Know You Have&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch"&gt;Nam Myoho Renge Kyo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=21861986"&gt;Ram Dass has died (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.smilingmind.com.au/smiling-mind-app"&gt;Smiling Mind free apps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=13019767"&gt;The Challenge of Consciousness (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=21036927"&gt;The effect of meditation on brain structure (2012) | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://theenergyproject.com/blog"&gt;The Energy Project blog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 22 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/meditation-bookmarks</guid></item><item><title>Learning bookmarks</title><link>https://xenodium.com/learning-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.quora.com/What-are-the-best-YouTube-channels-for-learning-growth-and-development"&gt;Best YouTube channels for learning (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.supermemo.com/en/articles/20rules"&gt;Effective learning: Twenty rules of formulating knowledge&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=7826745"&gt;HN's comments on learning languages&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=6522901"&gt;HN's comments on memory&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fourhourworkweek.com/2012/12/11/how-to-play-the-guitar/"&gt;How to Finally Play the Guitar: 80/20 Guitar and Minimalist Music&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://betterexplained.com/articles/adept-method/"&gt;Learn Difficult Concepts with the ADEPT Method&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PL2FF649D0C4407B30"&gt;Learning to learn&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://betterexplained.com/articles/intuition-isnt-optional/"&gt;Learning to Learn: Intuition Isn’t Optional | BetterExplained&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fourhourworkweek.com/2009/07/30/speed-reading-and-accelerated-learning/"&gt;Scientific Speed Reading: How to Read 300% Faster in 20 Minutes&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 22 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/learning-bookmarks</guid></item><item><title>Bundi travel bookmarks</title><link>https://xenodium.com/bundi-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;Bundi Haveli (accomodation).&lt;/li&gt;
&lt;li&gt;Hadoti Palace (accomodation).&lt;/li&gt;
&lt;li&gt;Haveli Braj Bhushan Ji ki (accomodation).&lt;/li&gt;
&lt;li&gt;Haveli Katkoun Guest House (accomodation).&lt;/li&gt;
&lt;li&gt;Kasera Paradise (accomodation).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 22 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/bundi-travel-bookmarks</guid></item><item><title>Unpopular</title><link>https://june.kim/unpopular/</link><author>june.kim</author><pubDate>Fri, 21 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/unpopular/</guid></item><item><title>It's time for Open Data in and from (not "ABOUT"!) schools</title><link>https://stop.zona-m.net/2015/08/its-time-for-open-data-in-and-from-not-about-schools/</link><description>&lt;h2 id="preface"&gt;Preface&lt;/h2&gt;
&lt;p&gt;This essay expands a proposal on Open Data in schools that I made in 2011, which requires very little, if any, funding and central authorization/coordination to be implemented. As of this writing, I know of no other proposal of the same kind, with the exception of this &lt;a href="http://edwinbruce.wordpress.com/2013/06/23/ulearn-2012-open-data-presentation/"&gt;2012 presentation from New Zealand&lt;/a&gt;. Also, I have not heard of any large scale implementation, or had occasion to do any real work on this topic. However, I am even more convinced now than in 2011 that the idea has a great potential.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 20 Aug 2015 12:19:58 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/08/its-time-for-open-data-in-and-from-not-about-schools/</guid></item><item><title>Smart dust: coming soon to a lung near you?</title><link>https://stop.zona-m.net/2015/08/smart-dust-coming-soon-to-a-lung-near-you/</link><description>&lt;p&gt;You really can&amp;rsquo;t make this stuff up: I have just found, one after another in my RSS feed, two unrelated articles on Smart Dust that you &lt;strong&gt;must&lt;/strong&gt; really read side by side: one about a wonderful future, another unintentionally exposing some of its, apparently, not-yet-considered consequences.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 20 Aug 2015 11:21:04 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/08/smart-dust-coming-soon-to-a-lung-near-you/</guid></item><item><title>Self identity</title><link>https://june.kim/self-identity/</link><author>june.kim</author><pubDate>Thu, 20 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/self-identity/</guid></item><item><title>Links - August 20, 2015</title><link>https://faingezicht.com/links/2015/08/20/links/</link><description/><author>Avy Faingezicht</author><pubDate>Thu, 20 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/20/links/</guid></item><item><title>Snappy Scope: Progress Update</title><link>https://kyrofa.com/posts/snappy-scope-progress-update/</link><description>I&amp;rsquo;ve previously written about Snappy and Unity 8&amp;rsquo;s Snappy Scope, back when I was first getting started on it. Since then, both the scope and Ubuntu Core itself have come a long way, so I thought it was time for an update and a quick demo.
When I was working on Snappy back when I wrote the other post I was running Ubuntu Core virtually, since I was using my embedded devices for other tasks.</description><author>kyrofa's blog</author><pubDate>Thu, 20 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/snappy-scope-progress-update/</guid></item><item><title>Carved Pen</title><link>https://june.kim/carved-pen/</link><author>june.kim</author><pubDate>Wed, 19 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/carved-pen/</guid></item><item><title>Links - August 19, 2015</title><link>https://faingezicht.com/links/2015/08/19/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 19 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/19/links/</guid></item><item><title>Strategic Game of Life: Mobile Edition</title><link>https://thomashunter.name/posts/2015-08-19-strategic-game-of-life-mobile-edition</link><author>Thomas Hunter II</author><pubDate>Wed, 19 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2015-08-19-strategic-game-of-life-mobile-edition</guid></item><item><title>Tomfoolery with Typography: Dots and dashes</title><link>https://bastian.rieck.me/blog/2015/tft_02_dots_dashes/</link><description>&lt;p&gt;For the first “real” episode in this series, I wanted to start very slowly. Let us take
a look at very basic typographic symbols, namely dots and dashes (and some spaces). Except for
the rules about hyphens, dashes, and the like, all the rules presented here are more about
aesthetics and custom.&lt;/p&gt;
&lt;h1 id="dots"&gt;Dots&lt;/h1&gt;
&lt;p&gt;We use a simple &lt;em&gt;full stop&lt;/em&gt; (or &lt;em&gt;period&lt;/em&gt; for you Americans) to indicate the end of a sentence.
Nothing new here so far.&lt;/p&gt;
&lt;p&gt;When we want to indicate a multiplication in a formula, sometimes it makes
sense to show a multiplication symbol. In this case, the proper symbol to use is &lt;code&gt;\cdot&lt;/code&gt; (for
LaTeX users) or &lt;del&gt;&lt;code&gt;&amp;amp;middot;&lt;/code&gt;&lt;/del&gt;&lt;code&gt;&amp;amp;sdot;&lt;/code&gt; (for HTML). This symbol is typeset as ⋅ and defines a binary operator.
A similar symbol with a different semantic intent is
&lt;code&gt;&amp;amp;middot;&lt;/code&gt; (HTML) or &lt;code&gt;\textperiodcentered&lt;/code&gt; (LaTeX);
rendered as ·, it can be used as to indicate a transition between words, for example on a business card. A sample business card might
read “John Doe · Tinker &amp;amp; Tailor”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Never, never&lt;/strong&gt; use &lt;code&gt;\times&lt;/code&gt; or &lt;code&gt;&amp;amp;times;&lt;/code&gt; to indicate multiplication in any mathematics text written
for university students. In the classroom, you might find “5 × 4 = 20”, but the
&lt;code&gt;&amp;amp;times;&lt;/code&gt; symbol is customarily used to indicate things like a cross product in mathematics.&lt;/p&gt;
&lt;p&gt;If you want to indicate that something is missing from a quotation, a typeset matrix, or anything
else, use the wonderful &lt;em&gt;ellipsis&lt;/em&gt; character. It consists of three dots that are spaced differently
than three regular dots. In LaTeX, you can use &lt;code&gt;\dots&lt;/code&gt;. In HTML, use &lt;code&gt;&amp;amp;hellip;&lt;/code&gt;. It looks like
this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1,2,3,…,n&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The advantage of the predefined ellipsis character is that it will not be broken up. Some style
guides ask you to write an ellipsis as a sequence of dots and spaces. They are wrong. There is a
difference between “. . .” and “…” in all fonts.&lt;/p&gt;
&lt;h1 id="dashes"&gt;Dashes&lt;/h1&gt;
&lt;p&gt;Now let us dash to the dashes! There are three types of dashes. First, we have the simple &lt;em&gt;hyphen&lt;/em&gt;,
which is technically not a dash but I am calling it one anyway because one usually thinks of it as a
dash. Second, we have the &lt;em&gt;en-dash&lt;/em&gt;. Third, we have the &lt;em&gt;em-dash&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The hyphen is typeset using a simple &lt;code&gt;-&lt;/code&gt; character. We use it to indicate a break in a word, when
said word needs to be split because the end of a line has been reached. We also use it to spell some
composite words, such as &lt;em&gt;good-hearted&lt;/em&gt; or &lt;em&gt;mother-in-law&lt;/em&gt;. A further use of the hyphen is to
remove ambiguities in some compound adjectives. For example, &lt;em&gt;small-arms fire&lt;/em&gt;, &lt;em&gt;high-school
students&lt;/em&gt;, and so on. &lt;a href="http://xkcd.com/37"&gt;XKCD 37&lt;/a&gt; also has a nice example for this.&lt;/p&gt;
&lt;p&gt;I do not know all the rules about when to use a hyphen or not. As a non-native speaker, I am
slightly biased here. When in doubt, consult your dictionary of choice. At least you now know what
the hyphen is meant for.&lt;/p&gt;
&lt;p&gt;Moving on to the next dash, the &lt;em&gt;en-dash&lt;/em&gt;. In LaTeX we set it by typing two dashes (&lt;code&gt;--&lt;/code&gt;). In
HTML, we write &lt;code&gt;&amp;amp;ndash;&lt;/code&gt; to obtain “–”. The en-dash is customarily used to
indicate ranges. For example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The theorem is proved on pages 23–42.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;1887–1895 was the period of the first construction of the Kiel Canal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most bibliographical services in the web are unable to get the en-dash right. I am looking at you,
ACM and IEEE.&lt;/p&gt;
&lt;p&gt;The en-dash is also used to indicate joint authorship, such as the &lt;em&gt;Barnes–Hut simulation&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Last, the &lt;em&gt;em-dash&lt;/em&gt;. It is the longest of all the dashes. In LaTeX, it is typeset by three hyphens
in a row &lt;code&gt;---&lt;/code&gt;. In HTML, use the entity &lt;code&gt;&amp;amp;mdash;&lt;/code&gt;. The em-dash is rather long, “—”.
It is used to indicate a break between parts of a sentence. Most typographers consider it stronger
than a comma but weaker than a semicolon or a pair of parentheses. If this comparison does make
sense to you, please use the em-dash. Here is an example from my own writing:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Topologists aim to identify invariants of such spaces—properties that do not change when the
space is stretched, bent, and twisted by homeomorphisms.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I typically use the em-dash &lt;em&gt;without&lt;/em&gt; any further spaces because I consider it long enough to
indicate a break by its own. This again is a matter of personal style. If you want to use dash to
indicate pauses, omissions, and so on, &lt;em&gt;please&lt;/em&gt; use the em-dash. It gives the eye something to
follow and indicates a break. To bore you with a personal anecdote: When converting some eBooks to
my Kindle, em-dashes are made into hyphens. This really confuses me when reading because I expect a
compound word or a line-break but get a parenthetical remark.&lt;/p&gt;
&lt;p&gt;In short: Dots. Dashes. Use them properly, please.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (2026-01-12):&lt;/strong&gt; Thanks to Callum, I learned about &lt;code&gt;&amp;amp;sdot;&lt;/code&gt; and that I was
wrong about how to use &lt;code&gt;&amp;amp;middot;&lt;/code&gt;. I have updated the article
accordingly. I love receiving feedback like this! 🤩&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Tue, 18 Aug 2015 22:39:28 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/tft_02_dots_dashes/</guid></item><item><title>Running three hours of Ruby tests in under three minutes</title><link>https://boyter.org/2015/08/running-hours-ruby-tests-minutes/</link><description>&lt;p&gt;Recently the very cool hard working developers working on Stripe released a post about how they modified their build/test pipeline to reduce their test suite runtime from 3 hours to about 3 minutes.&lt;/p&gt;
&lt;p&gt;The article is very &lt;a href="https://stripe.com/blog/distributed-ruby-testing"&gt;much worth reading&lt;/a&gt;, as is the discussions that have come around it including those on &lt;a href="https://news.ycombinator.com/item?id=10055342"&gt;Hacker News&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A few key takeaways,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For dynamic languages such as Ruby or Python consider forking to run tests in parallel&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 18 Aug 2015 11:18:47 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/08/running-hours-ruby-tests-minutes/</guid></item><item><title>Thanking Oh-My-Vagrant contributors for version 1.0.0</title><link>https://purpleidea.com/blog/2015/08/18/thanking-oh-my-vagrant-contributors-for-version-1-0-0/</link><description>&lt;p&gt;The &lt;a href="https://github.com/purpleidea/oh-my-vagrant"&gt;Oh-My-Vagrant project&lt;/a&gt; became public about one year ago and at the time it was more of a fancy template than a robust project, but 188 commits (and counting) later, it has gotten surprisingly useful and mature.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-fallback"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;james@computer:~/code/oh-my-vagrant$ git rev-list HEAD --count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;188
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;james@computer:~/code/oh-my-vagrant$ git log $(git log --pretty=format:%H|tail -1)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;commit 4faa6c89cce01c62130ef5a6d5fa0fff833da371
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Author: James Shubin &amp;lt;james@shubin.ca&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Date:   Thu Aug 28 01:08:03 2014 -0400
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    Initial commit of vagrant-puppet-docker-template...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    This is an attempt to prototype a default environment for
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    vagrant+puppet+docker hacking. More improvements are needed for it to be
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    useful, but it's probably already useful as a reference for now.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It would be easy to take most of the credit for taking the project this far, as I&amp;rsquo;ve been responsible for about 87% of the commits, but as is common, the numbers don&amp;rsquo;t tell the whole story. It is also a bug (but hopefully just an artifact) that I&amp;rsquo;ve had such a large percentage of commits. It&amp;rsquo;s quite common for a new project to start this way, but for &lt;a href="https://www.gnu.org/philosophy/free-sw.html"&gt;Free Software&lt;/a&gt; to succeed long-term, it&amp;rsquo;s essential that the users become the contributors. Let&amp;rsquo;s try to change that going forward.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Tue, 18 Aug 2015 06:12:26 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/08/18/thanking-oh-my-vagrant-contributors-for-version-1-0-0/</guid></item><item><title>Reading Technical Documentation</title><link>https://june.kim/skim-dont-read/</link><author>june.kim</author><pubDate>Tue, 18 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/skim-dont-read/</guid></item><item><title>Links - August 18, 2015</title><link>https://faingezicht.com/links/2015/08/18/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 18 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/18/links/</guid></item><item><title>A Journey to the Centre of the Earth</title><link>https://apurva-shukla.me/bookshelf/a-journey-to-the-centre-of-the-earth/</link><description>⭐ ⭐ ⭐ Written in a time when scientific exploration was pushing the bounds of reality, Jules Verne conjures up the unfathomable of ideas…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Tue, 18 Aug 2015 02:39:15 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/a-journey-to-the-centre-of-the-earth/</guid></item><item><title>Why I write in the morning</title><link>https://june.kim/writing-in-the-morning/</link><author>june.kim</author><pubDate>Mon, 17 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/writing-in-the-morning/</guid></item><item><title>Links - August 17, 2015</title><link>https://faingezicht.com/links/2015/08/17/links/</link><description/><author>Avy Faingezicht</author><pubDate>Mon, 17 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/17/links/</guid></item><item><title>Tomfoolery with Typography: Introduction</title><link>https://bastian.rieck.me/blog/2015/tft_01_introduction/</link><description>&lt;p&gt;Inspired by Sheldon’s “Fun with Flags” series, I decided to collect my thoughts about the
beautiful subject of &lt;em&gt;typography&lt;/em&gt; in a similar way. My friends and students know that I can go on
and on about this topic. Maybe writing it down like this decreases the length of my rants in the
real-world.&lt;/p&gt;
&lt;p&gt;For this first part, I want to explain some definitions and dispel some myths about typography.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;What is typography?&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Typography is the art and craft of arranging type to make written language readable and
appealing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this definition, &lt;em&gt;type&lt;/em&gt; refers to the composition of text by some means. I am most used to
computer typesetting, so I am assuming that we are doing electronic typesetting here. Most of my
examples will either refer to HTML or LaTeX, because I am most familiar with them.&lt;/p&gt;
&lt;p&gt;Note that the definition contains the words &lt;em&gt;art&lt;/em&gt; and &lt;em&gt;craft&lt;/em&gt;. Typography is thus decidedly &lt;strong&gt;not&lt;/strong&gt;
all about making a document look “nice” or anything. Some of the rules are grounded in the
reality of the perception of readers—see below for some explanations.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;What makes you qualified to write about this?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To be honest, nothing specifically. I like good typography. Over the course of my career as a
student and a researcher, I have always given some thought about presenting my text in an
aesthetically pleasing manner.&lt;/p&gt;
&lt;p&gt;I am not claiming that my way of doing things is the best way. I am also not claiming that my
documents are the best-looking ones out there. Furthermore, I am well aware of the fact that
typography for web pages leaves some things to be desired. For example, I am not quite satisfied
with the way quotes or apostrophes are typeset. But this is a limitation of the web medium, not a
principal limitation.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Are you saying that looks are more important than content?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;No. Typography is not about making bad content look good. You are confusing this with marketing. Of
course, your content needs to be worth the effort of typesetting. The problem with electronic
typesetting is that—whether we want to or not—each and everyone of us has become a
little typographer. Every word processing software permits a myriad of ways of adjusting the look of
text. So, unless you are writing everything in a text editor and only apply the design later
on—which, coincidentally, might not be the worst idea—you should at least be aware of
the basic principles of typography.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;But this is all subjective!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As a matter of fact, it is &lt;em&gt;not&lt;/em&gt;. At least not entirely. During the course of this series I also
want to provide pointers to relevant research whenever applicable. I plan on separating the purely
aesthetic aspects, which are certainly subjective or reliant on a &lt;em&gt;fashion-du-jour&lt;/em&gt;, from the
aspects that have a solid basis in perception.&lt;/p&gt;
&lt;p&gt;Let us start with this right now. Here are some interesting research findings about typography:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;In &lt;a href="http://psycnet.apa.org/journals/apl/26/1/38"&gt;&lt;em&gt;Reader Preferences and Typography&lt;/em&gt;&lt;/a&gt;, Tinker and
Paterson reported that there is a close agreement between the apparent &lt;em&gt;legibility&lt;/em&gt; and the
apparent &lt;em&gt;pleasingness&lt;/em&gt; of a text. The study is slightly scant on details, though, as Tinker and
Paterson only compared text set in lower case with text set in bold face or all capitals. Still,
it seems to point in the direction that certain text markups shall only be used sparingly. Bold
face, for example, draws the attention of a reader towards a single word or phrase. The effect is
lost if everything is set in bold face.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;a href="http://www.jstor.org/stable/41383630"&gt;&lt;em&gt;Typography and Readability&lt;/em&gt;&lt;/a&gt;, Burtt examined the
readability of text if certain typographical elements are changed. The selection of the &lt;em&gt;font
face&lt;/em&gt; proved to be somewhat significant, for example. Very ornate fonts, such as &lt;a href="http://www.dafont.com/cloister-black.font"&gt;&lt;em&gt;Cloister
Black&lt;/em&gt;&lt;/a&gt; were deemed to confuse some readers. Of
course, this is not entirely surprising, but it hints at the importance of selecting the
“right” font. Furthermore, Burtt reported that combining several font faces can
actually decrease the reading efficiency by as much as 11%. Eye movement observations also
suggested that long texts should not consist exclusively of capital letters. Burtt also observed
that line lengths should not be too large. For 10 point type, line length should vary between
75mm and 90mm.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;a href="http://usabilitynews.org/the-effects-of-line-length-on-children-and-adults-online-reading-performance"&gt;&lt;em&gt;The Effects of Line Length on Children and Adults’ Online Reading Performance&lt;/em&gt;&lt;/a&gt;,
Bernard et al. found that medium (65–75 characters per line) or narrow length
texts (45 characters per line) are preferred for online reading by adults and children,
respectively.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;a href="http://ocw.covenantuniversity.edu.ng/courses/media-arts-and-sciences/mas-630-affective-computing-spring-2008/readings/aesthetic_readin.pdf"&gt;&lt;em&gt;The Aesthetics of Reading&lt;/em&gt;&lt;/a&gt;,
Larson and Picard examined the performance of participants in cognitive tasks after exposing them
to examples of bad and good typography. While Larson and Picard concluded that most readers do
not perceive very intricate details such as ligatures or small caps (which may thus be
thought of belonging to the &lt;em&gt;aesthetics&lt;/em&gt; part of typography), they found that readers greatly
prefer good typography to bad typography. I would take the cognitive differences with a grain of
salt, though, because the sample size does not seem to be large enough—only 20 subjects,
which were divided into two groups. Yet, subjects rated the text with good typography to be
significantly easier to read.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I hope I have convinced you that some typographical standards are worth thinking about. In the
forthcoming posts, I will always refer to relevant research if applicable, or explicitly state that
a rule is “only” based on aesthetic preferences.&lt;/p&gt;
&lt;p&gt;Stay tuned.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 16 Aug 2015 15:12:15 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/tft_01_introduction/</guid></item><item><title>Links - August 16, 2015</title><link>https://faingezicht.com/links/2015/08/16/links/</link><description/><author>Avy Faingezicht</author><pubDate>Sun, 16 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/16/links/</guid></item><item><title>The Age of Adaline</title><link>https://olshansky.info/movie/the_age_of_adaline/</link><description>Olshansky's review of The Age of Adaline</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 15 Aug 2015 18:25:12 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_age_of_adaline/</guid></item><item><title>Before Midnight</title><link>https://olshansky.info/movie/before_midnight/</link><description>Olshansky's review of Before Midnight</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 15 Aug 2015 16:07:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/before_midnight/</guid></item><item><title>Writing Specifically</title><link>https://june.kim/writing-specifically/</link><author>june.kim</author><pubDate>Sat, 15 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/writing-specifically/</guid></item><item><title>Links - August 15, 2015</title><link>https://faingezicht.com/links/2015/08/15/links/</link><description/><author>Avy Faingezicht</author><pubDate>Sat, 15 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/15/links/</guid></item><item><title>The Four Character Group Archetype</title><link>https://tiltingatwindmills.dev/the-four-c-archetype/</link><description>I've noticed that when a work of fiction focuses on a group of four characters,
the roles those characters play within the group fall into a…</description><author>Tilting at Windmills</author><pubDate>Sat, 15 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/the-four-c-archetype/</guid></item><item><title>The Flash: Season 1</title><link>https://olshansky.info/tv/the_flash_season_1/</link><description>Olshansky's review of The Flash: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 15 Aug 2015 02:20:26 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_flash_season_1/</guid></item><item><title>South Park: Season 1</title><link>https://olshansky.info/tv/south_park_season_1/</link><description>Olshansky's review of South Park: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 15 Aug 2015 02:19:47 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/south_park_season_1/</guid></item><item><title>Community: Season 1</title><link>https://olshansky.info/tv/community_season_1/</link><description>Olshansky's review of Community: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 15 Aug 2015 02:19:03 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/community_season_1/</guid></item><item><title>Modern Family: Season 1</title><link>https://olshansky.info/tv/modern_family_season_1/</link><description>Olshansky's review of Modern Family: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 15 Aug 2015 02:18:39 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/modern_family_season_1/</guid></item><item><title>American Dad!: Season 1</title><link>https://olshansky.info/tv/american_dad_season_1/</link><description>Olshansky's review of American Dad!: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 15 Aug 2015 02:18:18 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/american_dad_season_1/</guid></item><item><title>Family Guy: Season 1</title><link>https://olshansky.info/tv/family_guy_season_1/</link><description>Olshansky's review of Family Guy: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 15 Aug 2015 02:18:01 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/family_guy_season_1/</guid></item><item><title>The Big Bang Theory: Season 1</title><link>https://olshansky.info/tv/the_big_bang_theory_season_1/</link><description>Olshansky's review of The Big Bang Theory: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 15 Aug 2015 02:17:46 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_big_bang_theory_season_1/</guid></item><item><title>Upgrading PL30 headphones</title><link>https://xenodium.com/upgrading-pl30-headphones</link><description>&lt;p&gt;I've loved my &lt;a href="http://www.amazon.com/Soundmagic-PL30-In-Ear-Headphones/dp/B001MQ3CCO"&gt;Soundmagic PL30 in-ear headphones&lt;/a&gt;. They're relatively inexpensive, comfortable, and great for exercising (they stay in). Audio quality and bass have been good enough (I don't need much). Unfortunately, I've had two pairs of PL30's and both stopped working after a year or two. I'm replacing the last pair with &lt;a href="http://www.amazon.co.uk/RHA-MA750-Isolating-In-Ear-Headphone-Black/dp/B00ELAM8LE"&gt;RHA's MA750&lt;/a&gt; (an upgrade, me hopes).&lt;/p&gt;
&lt;p&gt;Other contenders considered: &lt;a href="http://www.amazon.co.uk/Etymotic-Research-Portable-iPhone-Earphones-Black/dp/B000XPG2QI"&gt;Etymotic Research HF5&lt;/a&gt;, and &lt;a href="http://www.amazon.co.uk/Shure-SE215-In-Ear-Isolating-Earphones-Clear/dp/B004U9NH3E"&gt;Shure SE215&lt;/a&gt;. Also considered bluetooth alternatives like &lt;a href="http://www.amazon.com/JayBird-BlueBuds-Sport-Bluetooth-Headphones/dp/B00AIRUOI8?"&gt;JayBird BlueBuds X&lt;/a&gt; and &lt;a href="http://www.amazon.co.uk/Plantronics-BackBeat-Wireless-Earbuds-Frustration-Black/dp/B00DZTHW9U"&gt;Plantronics BackBeat GO 2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I'm somewhat nervous to pay more for a pair of headphones. Let's hope they don't meet the same unfortunate fate. We'll see.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 14 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/upgrading-pl30-headphones</guid></item><item><title>The Phantom Tollbooth</title><link>https://june.kim/phantom-tollbooth/</link><author>june.kim</author><pubDate>Fri, 14 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/phantom-tollbooth/</guid></item><item><title>Entity Framework Code First type safe eager loading</title><link>https://alesruzicka.net/blog/eng/ef-eager-loading/</link><description>&lt;p&gt;In Entity Framework Code First, you can achieve eager loading of
entities by using Include method on &lt;code&gt;DbQuery&lt;/code&gt; in from &lt;code&gt;DbContext&lt;/code&gt;
of your application.&lt;/p&gt;</description><author>English articles on AlesRuzicka.net</author><pubDate>Fri, 14 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://alesruzicka.net/blog/eng/ef-eager-loading/</guid></item><item><title>One line password generation in .Net using LINQ</title><link>https://alesruzicka.net/blog/eng/one-line-password-generation/</link><description>&lt;p&gt;When I wrote this code in use-once application, I thought that is
rather weird part of code, but works just fine for this once case.&lt;br /&gt;
Then I realized, there is nothing wrong with the code. People, who
are familiar with LINQ will have little problem reading it and it
will work 100% reliably.&lt;/p&gt;</description><author>English articles on AlesRuzicka.net</author><pubDate>Fri, 14 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://alesruzicka.net/blog/eng/one-line-password-generation/</guid></item><item><title>Quotes</title><link>https://xenodium.com/quotes</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/stevemagness/status/633778359156125696?refsrc%3Demail&amp;amp;s%3D11"&gt;&amp;quot;Being good at something is about being curious enough to explore things to a level where most people give up.&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;quot;The world is a book and those who do not travel read only one page.&amp;quot; - Augustine of Hippo.&lt;/li&gt;
&lt;li&gt;&amp;quot;National identity is not your only identity.&amp;quot; - Xiaolu Guo?&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=27696310"&gt;&amp;quot;Choose your words carefully. Words are cheap, but their effect can be expensive.&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 13 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/quotes</guid></item><item><title>Bhutan travel bookmarks</title><link>https://xenodium.com/bhutan-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.tigersnestbhutan.com/"&gt;Taktsang (Tiger’s Nest) Monastery&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 13 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/bhutan-travel-bookmarks</guid></item><item><title>Leather Field Notes Cover</title><link>https://june.kim/field-notes-cover/</link><author>june.kim</author><pubDate>Thu, 13 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/field-notes-cover/</guid></item><item><title>Tools I could not live without 2015</title><link>https://alesruzicka.net/blog/eng/tools-for-2015/</link><description>&lt;p&gt;I try not to overdo it with amount of tools I use, but I&amp;rsquo;ll make a short list of tools I use right now.&lt;/p&gt;</description><author>English articles on AlesRuzicka.net</author><pubDate>Thu, 13 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://alesruzicka.net/blog/eng/tools-for-2015/</guid></item><item><title>Groundhog Day</title><link>https://olshansky.info/movie/groundhog_day/</link><description>Olshansky's review of Groundhog Day</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 13 Aug 2015 02:41:13 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/groundhog_day/</guid></item><item><title>Deep Neural Networks with Caffe</title><link>https://www.umarniz.com/deep-neural-networks-with-caffe/</link><description>Working in experiential marketing, I wanted to be able to target campaigns more intelligently than conventional wisdom and use technology to…</description><author>Umar Nizamani | RSS Feed</author><pubDate>Wed, 12 Aug 2015 21:08:11 GMT</pubDate><guid isPermaLink="true">https://www.umarniz.com/deep-neural-networks-with-caffe/</guid></item><item><title>Synchronous multiplexing for sockets (starring C++11)</title><link>https://bastian.rieck.me/blog/2015/synchronous_multiplexing_sockets_cxx11/</link><description>&lt;p&gt;In &lt;a href="https://bastian.rieck.me/blog/2015/sockets_ordeal_cxx11/"&gt;my previous post on network sockets&lt;/a&gt;, I described a simple implementation
of a server and a client socket in C++11. The initial version was only capable of reacting to a new
client connection. What about a socket being ready for reading, though?&lt;/p&gt;
&lt;h1 id="select-and-socket-sets"&gt;&lt;code&gt;select()&lt;/code&gt; and socket sets&lt;/h1&gt;
&lt;p&gt;There are numerous ways of doing multiplexing for sockets—of course I used the easiest one
which is the worst and slowest. Anyway, after some quality time with the socket documentation, I
implemented the following procedure:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create two empty socket sets, a master and a client socket. The sockets API refers to them as
&lt;code&gt;fd_set&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Create a server socket (as in the previous post) and add it to the master set.&lt;/li&gt;
&lt;li&gt;Loop forever! Copy the master socket set to the client socket set and call &lt;code&gt;select()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If the call to &lt;code&gt;select()&lt;/code&gt; finishes without an error, one of the sockets in the set is ready for
&lt;em&gt;something&lt;/em&gt;. This &lt;em&gt;something&lt;/em&gt; might be a read operation or a new client.&lt;/li&gt;
&lt;li&gt;Handle this by creating new client sockets as appropriate, calling the corresponding callback
functions using &lt;code&gt;std::async&lt;/code&gt;, and updating the socket sets.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sounds rather straightforward, but the corresponding code is messy and not yet very smart. For
example, I am looping over all possible file descriptors and I had to adjust the &lt;code&gt;ClientSocket&lt;/code&gt;
class to un-register at the server class once a socket is closed. I am not quite content with the
implementation.&lt;/p&gt;
&lt;h1 id="how-to-use-it"&gt;How to use it?&lt;/h1&gt;
&lt;p&gt;The API is still using the callback approach introduced in the previous post. The cool thing is that
this now also works whenever a client socket has something to say. For example, to implement &lt;a href="https://tools.ietf.org/html/rfc862"&gt;RFC
862&lt;/a&gt;, the &lt;em&gt;Echo&lt;/em&gt; protocol, we merely need the following code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;onRead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;weak_ptr&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ClientSocket&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note that I have changed the &lt;code&gt;std::unique_ptr&lt;/code&gt; to an &lt;code&gt;std::weak_ptr&lt;/code&gt; because the server is now
responsible for managing the client sockets. Since all handlers are called being asynchronously, it
is possible that a socket is already unavailable because it has been closed.&lt;/p&gt;
&lt;h1 id="where-is-the-code"&gt;Where is the code?&lt;/h1&gt;
&lt;p&gt;I have updated the &lt;a href="https://github.com/Pseudomanifold/SimpleServer"&gt;GitHub repository introduced in the last post&lt;/a&gt;.
The repository now also contains a simple echo server implementation.&lt;/p&gt;
&lt;p&gt;The code is released under an MIT licence.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Wed, 12 Aug 2015 19:58:45 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/synchronous_multiplexing_sockets_cxx11/</guid></item><item><title>No Country for Old Men</title><link>https://olshansky.info/movie/no_country_for_old_men/</link><description>Olshansky's review of No Country for Old Men</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 12 Aug 2015 11:40:05 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/no_country_for_old_men/</guid></item><item><title>Frequencies</title><link>https://olshansky.info/movie/frequencies/</link><description>Olshansky's review of Frequencies</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 12 Aug 2015 11:29:41 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/frequencies/</guid></item><item><title>Cooking bookmarks</title><link>https://xenodium.com/cooking-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://food.ndtv.com/lists/10-best-indian-breakfast-recipes-696080"&gt;14 Best Indian Breakfast Recipes | Easy Indian Breakfast Recipes - NDTV Food&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://drinks.seriouseats.com/2013/05/25-essential-cocktails-everyone-should-know-cocktail-101-easy-mixed-drink-recipes-classic-cocktail-guide.html"&gt;25 Cocktails Everyone Should Know&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Taylor-Precision-Products-Stainless-11-Pound/dp/B002SXV8G2/ref=sr_1_1?s=home-garden&amp;amp;ie=UTF8&amp;amp;qid=1481553229&amp;amp;sr=1-1-spons&amp;amp;keywords=Taylor+Precision+stainless+steel&amp;amp;psc=1"&gt;Amazon.com: Taylor Precision Products Stainless Steel Kitchen Scale&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.seriouseats.com/recipes/2012/07/basic-new-york-style-pizza-dough.html"&gt;Basic New York-Style Pizza Dough Recipe | Serious Eats&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.world-of-crepes.com/cast-iron-fry-pans.html"&gt;Cast Iron Fry Pans&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/How-is-authentic-fried-rice-prepared/answer/ChienLing-Koo-1/share"&gt;ChienLing Koo's answer to How is authentic fried rice prepared? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cooking.nytimes.com/recipes/1018717-eggs-kejriwal"&gt;Eggs Kejriwal Recipe - NYT Cooking&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=-suTmUX4Vbk"&gt;Equipment Review: Best Carbon-Steel Skillets (YouTube)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.seriouseats.com/2010/06/how-to-buy-season-clean-maintain-cast-iron-pans.html"&gt;Equipment: How to Buy, Season, and Maintain Cast Iron Cookware&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/How-do-Chinese-restaurants-get-their-beef-to-be-so-tender-Like-beef-in-black-bean-sauce-or-Mongolian-beef-etc-It-almost-falls-apart-in-the-mouth"&gt;How do Chinese restaurants get their beef to be so tender?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=KLGSLCaksdY#action=share"&gt;How To Cook With Cast Iron (YouTube)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getpocket.com/explore/item/how-to-make-french-onion-soup"&gt;How To Make French Onion Soup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.co.uk/Imperia-Italian-Double-Cutter-Machine/dp/B0001IXA0I"&gt;Imperia Italian Double Cutter Pasta Machine&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitaltrends.com/home/steaming-hard-boiled-eggs/"&gt;It's Not Rocket Science, Steaming Hard-Boiled Eggs Makes Peeling Easier (Digital trends)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.varasanos.com/PizzaRecipe.htm"&gt;Jeff Varasano's NY Pizza Recipe&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.co.uk/Marcato-machine-Chrome-Silver-Wellness/dp/B0009U5OSO/"&gt;Marcato Atlas 150 pasta machine Chrome, Silver Wellness&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thecuriouschickpea.com/masoor-dal-tadka/"&gt;Masoor Dal Tadka - Indian Red Lentil Dal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ohsheglows.com/2013/01/24/my-favourite-homemade-almond-milk-step-by-step-photos/"&gt;My Favourite Homemade Almond Milk + Step By Step Photos&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cooking.nytimes.com/"&gt;New York Times cooking&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.womenshealthmag.co.uk/nutrition/recipes/2321/pho-tai-lan-hanoi-style-flash-fried-steak-garlic-soup/"&gt;Pho Tai Lan (Hanoi style flash-fried steak &amp;amp; garlic soup)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pizzamaking.com/pizza-recipes.html"&gt;Pizza Recipes - PizzaMaking.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.portlandfarmersmarket.org/cookbook/"&gt;Portland Farmers Market » Cookbook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fixfeastflair.com/home/2015/2/9/swedish-cardamom-rolls-kardemummabullar-recipe"&gt;Swedish Cardamom Rolls (Kardemummabullar) — Fix Feast Flair&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/The-Ringer-Cleaner-Stainless-Chainmail/dp/B00FKBR1ZG"&gt;The Ringer Cast Iron Cleaner XL 8x6 Inch Stainless Steel Chainmail (Amazon)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.seriouseats.com/2014/11/the-truth-about-cast-iron.html"&gt;The Truth About Cast Iron Pans: 7 Myths That Need To Go Away&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cooksillustrated.com/how_tos/5820-the-ultimate-way-to-season-cast-iron"&gt;The ultimate way to season cast iron&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/Why-do-steaks-at-high-end-restaurants-taste-so-different-from-other-steaks"&gt;Why do steaks at high end restaurants taste so different from other steaks? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 12 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/cooking-bookmarks</guid></item><item><title>Academy Of Management</title><link>https://june.kim/academy-of-management/</link><author>june.kim</author><pubDate>Wed, 12 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/academy-of-management/</guid></item><item><title>Links - August 12, 2015</title><link>https://faingezicht.com/links/2015/08/12/links/</link><description/><author>Avy Faingezicht</author><pubDate>Wed, 12 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/12/links/</guid></item><item><title>Back To XP</title><link>https://www.craigpardey.com/post/2015-08-12-xp/</link><description>&lt;p&gt;Agile has gained a lot of traction in large enterprises in recent years but I&amp;rsquo;m concerned about the specifics of how teams are implementing it.  I&amp;rsquo;ve seen everything from traditional eXtreme Programming (XP) practices to Scrum, but nothing scares me more than the teams that self-identify as &amp;ldquo;agile&amp;rdquo; but do nothing more than hold a daily team meeting.&lt;/p&gt;
&lt;p&gt;Agile means different things to different people, but it doesn&amp;rsquo;t matter which methodology is used as long as the principles outlined in &lt;a href="http://www.agilemanifesto.org/"&gt;the Agile Manifesto&lt;/a&gt; are adhered to.  Holding a daily hour-long meeting does not an agile team make.  It&amp;rsquo;s almost anti-agile.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Wed, 12 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2015-08-12-xp/</guid></item><item><title>How Haskell models IO</title><link>https://gilmi.me/post/2015/08/12/how-haskell-models-io</link><description>&lt;p&gt;&lt;b&gt;Edit 2&lt;/b&gt;: I've written two, better articles about IO in Haskell, see the my &lt;a href="https://github.com/soupi/haskell-study-plan#what-is-io"&gt;haskell-study-plan&lt;/a&gt;
and &lt;a href="https://soupi.github.io/learn-haskell-blog-generator/05-glue/02-io.html"&gt;my book&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Edit&lt;/b&gt;: &lt;i&gt;After writing this post I turned to &lt;a href="https://www.reddit.com/r/haskell/comments/3gu5ds/how_haskell_models_io_a_blog_post_for_beginners/"&gt;reddit&lt;/a&gt; for advice on how to make this post better, and even after a complete re-write
It still felt lacking. After asking about it at #haskell,&lt;/i&gt; merijn &lt;i&gt;linked to &lt;a href="http://blog.jle.im/entry/the-compromiseless-reconciliation-of-i-o-and-purity"&gt;this article&lt;/a&gt;
which in my opinion explains this subject much better than mine. So you might want to read it before this post or even instead of.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Haskell is a purely functional language, but what does being &amp;quot;pure&amp;quot; mean?&lt;/p&gt;&lt;p&gt;The pure in purely functional means that Haskell enforces the separation between &lt;b&gt;evaluating&lt;/b&gt; an expression and &lt;b&gt;executing&lt;/b&gt; an expression.&lt;/p&gt;&lt;p&gt;An expression can be thought about simply as a value. In order to produce a value, an expression needs to be &lt;b&gt;evaluated&lt;/b&gt; (or calculated).&lt;/p&gt;&lt;p&gt;While evaluated, expressions are stateless and cannot do anything other than compute a value and return it,
and will also return the same value. Always. This also means it can't mutate a variable, read from file or write to standard output.
We say that evaluating expressions is pure.&lt;/p&gt;&lt;p&gt;All expressions in Haskell are pure, which mean that we can evaluate any expression.
But some expressions may need to do more than just being evaluated in order to do something useful.
Some expressions needs to do other things in order to produce a meaningful value, this kind of expressions can be &lt;b&gt;executed&lt;/b&gt;.
Let's call this kind of expressions IO actions.&lt;/p&gt;&lt;p&gt;Producing value just by evaluating expressions is simpler and more straightforward in Haskell, while executing expressions requires more attention
and can only happen at certain places. Most expressions in Haskell do not need to be executed in order to produce a meaningful value.&lt;/p&gt;&lt;p&gt;Haskell enforces this separation between pure expressions and IO actions using it's type system at compile time.&lt;/p&gt;&lt;p&gt;We can differentiate between pure expressions and IO actions by looking at the type of an expression.
An IO action's type signature is slightly different from a pure function or value.&lt;/p&gt;&lt;p&gt;For example:&lt;/p&gt;&lt;pre&gt;&lt;code class="haskell"&gt;val1 :: Int

val2 :: IO Int

func1 :: Int -&amp;gt; Int

func2 :: Int -&amp;gt; IO Int&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;val1&lt;/code&gt; and &lt;code&gt;func1&lt;/code&gt; are pure - they don't need to be executed to produce an &lt;code&gt;Int&lt;/code&gt;, only evaluated.
&lt;code&gt;val2&lt;/code&gt; and &lt;code&gt;func2&lt;/code&gt; are IO actions - in order to produce an &lt;code&gt;Int&lt;/code&gt; they need to be executed. We can tell because they return an &lt;code&gt;IO _&lt;/code&gt; type.&lt;/p&gt;&lt;p&gt;Let's say we want to write a program that reads an &lt;code&gt;Int&lt;/code&gt; from a user, and multiply it by a &lt;code&gt;multiplier&lt;/code&gt;.
Here is a naive attempt where we treat an &lt;code&gt;IO Int&lt;/code&gt; as equal to &lt;code&gt;Int&lt;/code&gt;, which means that when evaluating &lt;code&gt;IO Int&lt;/code&gt; we also execute it and produce an &lt;code&gt;Int&lt;/code&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code class="haskell"&gt;readIntFromUser :: IO Int
readIntFromUser = ...

mul :: Int -&amp;gt; Int -&amp;gt; Int
mul = (*)

userInt :: IO Int
userInt = readIntFromUser

multiplier :: Int
multiplier = 3

main = print (mul multiplier userInt)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Well, this might be a little bit problematic, because now we lost the ability to separate evaluation from execution.
Also, since the type of &lt;code&gt;mul&lt;/code&gt; is &lt;code&gt;Int -&amp;gt; Int -&amp;gt; Int&lt;/code&gt;, the type of &lt;code&gt;mul multiplier userInt&lt;/code&gt; is also an &lt;code&gt;Int&lt;/code&gt;, so now we don't know
if we are going to get the same value every time or not. So we can't replace the implementation of &lt;code&gt;mul&lt;/code&gt; by something that, for example,
sums a &lt;code&gt;multiplier&lt;/code&gt; of &lt;code&gt;Int&lt;/code&gt;s.&lt;/p&gt;&lt;p&gt;Pure expressions allow us to do &amp;quot;programming algebra&amp;quot; like this without unexpected side-effects.&lt;/p&gt;&lt;p&gt;So, &lt;b&gt;we will not treat an &lt;code&gt;IO Int&lt;/code&gt; as an &lt;code&gt;Int&lt;/code&gt; and thus retain the separation of evaluation and execution&lt;/b&gt;! (Means this is not valid Haskell code.)&lt;/p&gt;&lt;p&gt;Okay, so, how do we multiple a user read &lt;code&gt;Int&lt;/code&gt; by &lt;code&gt;multiplier&lt;/code&gt;?&lt;/p&gt;&lt;p&gt;Hmm. Perhaps we can use a function that can execute an IO action, thus converting &lt;code&gt;IO Int&lt;/code&gt; to &lt;code&gt;Int&lt;/code&gt;? Let's call a function like that &lt;code&gt;execute&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;But now, it is also entirely possible to rewrite &lt;code&gt;multiplier&lt;/code&gt; like this:&lt;/p&gt;&lt;pre&gt;&lt;code class="haskell"&gt;multiplier :: Int
multiplier = if execute userInt == 3 then 3 else 3&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;multiplier&lt;/code&gt;, in this case, still equals 3 but now it also reads user input, so it is not pure even though it's type is &lt;code&gt;Int&lt;/code&gt; and will return 3 every time!&lt;/p&gt;&lt;p&gt;So, &lt;b&gt;converting an &lt;code&gt;IO a&lt;/code&gt; type to &lt;code&gt;a&lt;/code&gt; by executing it whenever we want is rejected&lt;/b&gt;. (Not valid Haskell either.)&lt;/p&gt;&lt;p&gt;Let's look at this from a different perspective, what if we could take the function we want to apply to the &lt;code&gt;IO Int&lt;/code&gt; value,
apply it to the &lt;code&gt;Int&lt;/code&gt; that would be calculated when executed,
and return a new &lt;code&gt;IO Int&lt;/code&gt; with the new value after applying the function? That way we can still keep the separation of pure expressions and IO actions
with types!&lt;/p&gt;&lt;p&gt;And indeed, we can. Using &lt;code&gt;fmap&lt;/code&gt;.&lt;/p&gt;&lt;pre&gt;&lt;code class="haskell"&gt;fmap :: (a -&amp;gt; b) -&amp;gt; IO a -&amp;gt; IO b
fmap = ...

main :: IO ()
main = print (fmap (mul multiplier) userInt) -- ==&amp;gt; error: print cannot take IO Int.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Yes! We produced an IO action that will take a user input and will multiply it by &lt;code&gt;multiplier&lt;/code&gt;! But now we have a different problem,
&lt;code&gt;print&lt;/code&gt; doesn't want to print our &lt;code&gt;IO Int&lt;/code&gt;, maybe it wants an &lt;code&gt;Int&lt;/code&gt;? Let's try the same
trick we just discovered on &lt;code&gt;print&lt;/code&gt; as well.&lt;/p&gt;&lt;pre&gt;&lt;code class="haskell"&gt;main :: IO ()
main = fmap (print (fmap (mul multiplier) userInt)) -- ==&amp;gt; error: main type mismatch between IO () and IO (IO ())&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hmm, we were able to apply print to our computation, but print returns an &lt;code&gt;IO ()&lt;/code&gt;, so now after using &lt;code&gt;fmap&lt;/code&gt; our &lt;code&gt;main&lt;/code&gt; function has a type of &lt;code&gt;IO (IO ())&lt;/code&gt; and not &lt;code&gt;IO ()&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;As we said, IO actions are just like regular values that can be evaluated (in the same way a function can be evaluated).
They can be returned from a function or stored in a data structure. It is just that if we want to produce a value from them, we have to execute them.&lt;/p&gt;&lt;p&gt;Another analogy that might be helpful is to think about IO actions as &amp;quot;plans&amp;quot; to produce a value. For example,
an &lt;code&gt;IO a&lt;/code&gt; action is a plan to produce a value of type &lt;code&gt;a&lt;/code&gt;. The plan itself is a regular, first class value.
But in order to produce the &lt;code&gt;a&lt;/code&gt; value of the plan, we need to execute it.&lt;/p&gt;&lt;p&gt;Sometimes we want to return an IO action to be executed later, but in this case, we just want to execute this IO action.
So, what if we could join two &lt;code&gt;IO&lt;/code&gt; together to one &lt;code&gt;IO&lt;/code&gt; so we can think of them as one plan to execute a value?&lt;/p&gt;&lt;p&gt;Apparently, we can. Using &lt;code&gt;join&lt;/code&gt;.&lt;/p&gt;&lt;pre&gt;&lt;code class="haskell"&gt;join :: IO (IO a) -&amp;gt; IO a
join = ...

main :: IO ()
main = join (fmap (print (fmap (mul multiplier) userInt)))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Great! Now everything typechecks! But it looks like a lot of work. Can't we make it more concise?&lt;/p&gt;&lt;pre&gt;&lt;code class="haskell"&gt;bind :: (a -&amp;gt; IO b) -&amp;gt; IO a -&amp;gt; IO b
bind f x = join (fmap f x)

main :: IO ()
main = bind (print . mul multiplier) userInt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, what if, for example, We want to test this function by supplying a value (like -3), we can use &lt;code&gt;pure&lt;/code&gt; to create a &amp;quot;plan&amp;quot;
to produce a specific &lt;code&gt;Int&lt;/code&gt;. By the way, this IO action will not do anything beyond returning a value when executed, since we gave it a value to produce,
it doesn't need to do anything in order to produce it.&lt;/p&gt;&lt;pre&gt;&lt;code class="haskell"&gt;userInt :: IO Int
userInt = pure (-3)

main :: IO ()
main = bind (print . mul multiplier) userInt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Okay, But we still haven't figured out when to execute an IO action and how.&lt;/p&gt;&lt;p&gt;Let's decide that we execute &lt;code&gt;main&lt;/code&gt;, by executing the IO actions that compose it, be it one IO action or more that are composed with &lt;code&gt;bind&lt;/code&gt;, and in the order
they are sequenced (since you can't print without knowing what is the value the user entered). That way, we can still execute IO actions as much as we like,
but we will also be able to say &amp;quot;anything beyond this is pure&amp;quot;.&lt;/p&gt;&lt;h2 id="a-short-summary"&gt;A short summary&lt;/h2&gt;&lt;p&gt;Let's stop for a moment and go over how we wanted to create and enforce the separation of pure code and IO actions and what we discovered in the process.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;We decided to use types to differentiate between expressions that can be executed and expressions that cannot. Expressions that can be executed has IO in their type.&lt;/li&gt;&lt;li&gt;We decided that we don't want to treat &lt;code&gt;IO a&lt;/code&gt; as &lt;code&gt;a&lt;/code&gt; - we don't want execution to happen on evaluation.&lt;/li&gt;&lt;li&gt;We decided that we don't want to be able to convert &lt;code&gt;IO a&lt;/code&gt; to &lt;code&gt;a&lt;/code&gt; (which means to execute it anywhere we want), and so once we are in IO context, we can't &amp;quot;escape&amp;quot; it.&lt;/li&gt;&lt;li&gt;We decided that we can convert &lt;code&gt;a&lt;/code&gt; to &lt;code&gt;IO a&lt;/code&gt; using &lt;code&gt;pure&lt;/code&gt;, supplying a value to return on execution. (you can also use a function called &lt;code&gt;return&lt;/code&gt; that does the same thing. In GHC versions older than 7.10 and other Haskell implementations, &lt;code&gt;pure&lt;/code&gt;, which can be found in the module &lt;code&gt;Control.Applicative&lt;/code&gt;, is not exported by default, but &lt;code&gt;return&lt;/code&gt; is.)&lt;/li&gt;&lt;li&gt;We saw that we can use pure functions like &lt;code&gt;(a -&amp;gt; b)&lt;/code&gt; to change &lt;code&gt;IO a&lt;/code&gt; to &lt;code&gt;IO b&lt;/code&gt;, using &lt;code&gt;fmap&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;We saw that we can chain IO actions using &lt;code&gt;bind&lt;/code&gt;. (Which in Haskell is known as &lt;code&gt;=&amp;lt;&amp;lt;&lt;/code&gt;. Actually, the function &lt;code&gt;&amp;gt;&amp;gt;=&lt;/code&gt; is more commonly used which is just &lt;code&gt;=&amp;lt;&amp;lt;&lt;/code&gt; with the arguments flipped. With &lt;code&gt;&amp;gt;&amp;gt;=&lt;/code&gt; it looks like we are chaining IO actions from left to right)&lt;/li&gt;&lt;li&gt;We decided that &lt;code&gt;main&lt;/code&gt; will be executed by executing the IO actions that compose it.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now, let's write the program we wanted again using what we have learned,
and let's make the use of &lt;code&gt;&amp;gt;&amp;gt;=&lt;/code&gt; a little bit more explicit by using lambda expressions instead of just currying.&lt;/p&gt;&lt;pre&gt;&lt;code class="haskell"&gt;
readIntFromUser :: IO Int
readIntFromUser = getLine &amp;gt;&amp;gt;= (\line -&amp;gt; pure (read x)) -- which is the same as: getLine &amp;gt;&amp;gt;= pure . read

userInt = IO Int
userInt = readIntFromUser

multiplier :: Int
multiplier = 3

mul :: Int -&amp;gt; Int -&amp;gt; Int
mul = (*)

main :: IO ()
main = userInt &amp;gt;&amp;gt;= (\input -&amp;gt; pure (mul multiplier input)) &amp;gt;&amp;gt;= (\result -&amp;gt; print result)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, let's say we want to first print the user's input and then the result, we could change &lt;code&gt;main&lt;/code&gt; to:&lt;/p&gt;&lt;pre&gt;&lt;code class="haskell"&gt;
main :: IO ()
main = userInt &amp;gt;&amp;gt;= (\input -&amp;gt; pure (mul multiplier input) &amp;gt;&amp;gt;= (\result -&amp;gt; print input &amp;gt;&amp;gt;= (\_ -&amp;gt; print result)))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But this becomes a little clumsy and not very readable. Fortunately, Haskell has special syntax known as &lt;code&gt;do&lt;/code&gt; notation, let's rewrite &lt;code&gt;main&lt;/code&gt; using it.&lt;/p&gt;&lt;pre&gt;&lt;code class="haskell"&gt;
main :: IO ()
main = do
  input  &amp;lt;- userInt
  result &amp;lt;- pure (mul multiplier input)
  _      &amp;lt;- print input
  print result
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This looks better. Note that &lt;code&gt;input &amp;lt;- userInput&lt;/code&gt; is analogous to &lt;code&gt;userInput &amp;gt;&amp;gt;= \input -&amp;gt; ...&lt;/code&gt;.
Also, We can do even better than that syntax-wise! We can replace &lt;code&gt;_ &amp;lt;- ...&lt;/code&gt; with just &lt;code&gt;...&lt;/code&gt; and we can replace &lt;code&gt;result &amp;lt;- pure ...&lt;/code&gt; with &lt;code&gt;let result = ...&lt;/code&gt;. Let's see what this looks like!&lt;/p&gt;&lt;pre&gt;&lt;code class="haskell"&gt;
main :: IO ()
main = do
  input &amp;lt;- userInt
  let result = mul multiplier input
  print input
  print result
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now we can write IO code to be executed, in a concise way, while still retaining the ability to separate evaluation from execution.&lt;/p&gt;&lt;p&gt;There are still more things you can do with IO that are more concise, but with knowing what you know now you have the full power IO and you can do
whatever you want with it, including building your own higher order functions to manipulate it.&lt;/p&gt;</description><author>λm.me</author><pubDate>Wed, 12 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://gilmi.me/post/2015/08/12/how-haskell-models-io</guid></item><item><title>Futurists</title><link>https://venam.net/blog/philosophy/2015/08/12/futurists.html</link><description>Hello fellow readers,  In this post I'll introduce futurists, some people with a very special occupation.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Wed, 12 Aug 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/philosophy/2015/08/12/futurists.html</guid></item><item><title>Vagrant and Oh-My-Vagrant on RHEL7</title><link>https://purpleidea.com/blog/2015/08/11/vagrant-and-oh-my-vagrant-on-rhel7/</link><description>&lt;p&gt;My &lt;a href="https://redhat.com/"&gt;employer&lt;/a&gt; keeps paying me, which I appreciate, so it&amp;rsquo;s good to spend some time to make sure RHEL7 customers get a great developer experience! So here&amp;rsquo;s how to make vagrant, vagrant-libvirt and &lt;a href="https://purpleidea.com/tags/oh-my-vagrant/"&gt;Oh-My-Vagrant&lt;/a&gt; work on &lt;a href="http://red.ht/1Aowjfh"&gt;RHEL 7+&lt;/a&gt;. The same steps should work for CentOS 7+.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll first paste the commands you need to run, and then I&amp;rsquo;ll explain what&amp;rsquo;s happening for those that are interested:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-fallback"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;# run these commands, and then get hacking!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;# this requires the rhel-7-server-optional-rpms repo enabled
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;sudo subscription-manager repos --enable rhel-7-server-optional-rpms
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;sudo yum install -y gcc ruby-devel libvirt-devel libvirt qemu-kvm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;sudo systemctl start libvirtd.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.4_x86_64.rpm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;sudo yum install -y vagrant_1.7.4_x86_64.rpm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;vagrant plugin install vagrant-libvirt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;wget https://copr.fedoraproject.org/coprs/purpleidea/vagrant-libvirt/repo/epel-7/purpleidea-vagrant-libvirt-epel-7.repo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;sudo cp -a purpleidea-vagrant-libvirt-epel-7.repo /etc/yum.repos.d/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;sudo yum install -y vagrant-libvirt    # noop plugin for oh-my-vagrant dependency
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;wget https://copr.fedoraproject.org/coprs/purpleidea/oh-my-vagrant/repo/epel-7/purpleidea-oh-my-vagrant-epel-7.repo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;sudo cp -a purpleidea-oh-my-vagrant-epel-7.repo /etc/yum.repos.d/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;sudo yum install -y oh-my-vagrant
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;. /etc/profile.d/oh-my-vagrant.sh # logout/login or source
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s go through it line by line.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Tue, 11 Aug 2015 18:09:16 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/08/11/vagrant-and-oh-my-vagrant-on-rhel7/</guid></item><item><title>Making an empty RPM</title><link>https://purpleidea.com/blog/2015/08/11/making-an-empty-rpm/</link><description>&lt;p&gt;I am definitely not an RPM expert, in fact, I&amp;rsquo;m afraid of it, but with recent tools such as &lt;a href="https://copr.fedoraproject.org/coprs/purpleidea/oh-my-vagrant/"&gt;COPR&lt;/a&gt;, and &lt;a href="https://purpleidea.com/blog/2014/01/20/building-base-images-for-vagrant-with-a-makefile/"&gt;my glorious Makefile&lt;/a&gt;, some aspects of it have become palatable. This post will be about a recent journey I had building the most useless RPM ever.&lt;/p&gt;
&lt;table style="text-align: center; width: 80%; margin: 0 auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="cat-typing.gif"&gt;&lt;img alt="A video of what my work building this RPM looked like." class="size-full wp-image-1128" height="100%" src="cat-typing.gif" width="100%" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; A video of my journey building this RPM.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Because of reasons, I wanted to satisfy an RPM dependency for a package that I wanted to install without rebuilding that RPM. As a result, I wanted to build as small an RPM as possible. This took me down a much longer path than I thought it would.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Tue, 11 Aug 2015 16:25:58 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/08/11/making-an-empty-rpm/</guid></item><item><title>The Waste Lands (The Dark Tower, #3)</title><link>https://apurva-shukla.me/bookshelf/the-waste-lands-the-dark-tower-3/</link><description>⭐ ⭐ ⭐ ⭐ Whilst the story has been slowly progressing towards the climax of finding the Dark Tower, it has certainly not lost it’s beauty!

4…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Tue, 11 Aug 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-waste-lands-the-dark-tower-3/</guid></item><item><title>9 week half-marathon training</title><link>https://xenodium.com/9-week-half-marathon-training</link><description>&lt;p&gt;While reading &lt;a href="https://zenhabitsbook.s3.amazonaws.com/Zen%2520Habits%2520book.pdf"&gt;Zen Habits: Mastering the Art of Change&lt;/a&gt;, I comitted to running half marathon in mid-October. That's roughly two months from now. Here's a 9 week training schedule:&lt;/p&gt;
&lt;p&gt;WEEK   MON    TUE    WED    THU     FRI    SAT    SUN&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;1      Rest   5 Km   5 Km   Cycle   Rest   5 Km   7 Km
2      Rest   5 Km   5 Km   Cycle   Rest   5 Km   8 Km
3      Rest   7 Km   5 Km   Cycle   Rest   5 Km   10 Km
4      Rest   8 Km   5 Km   Cycle   Rest   5 Km   12 Km
5      Rest   8 Km   Rest   8 Km    Rest   5 Km   14 Km
6      Rest   8 Km   Rest   8 Km    Rest   6 Km   16 Km
7      Rest   8 Km   8 Km   8 Km    Rest   8 Km   19 Km
8      Rest   8 Km   Rest   12 Km   Rest   8 Km   16 Km
9      Rest   8 Km   Rest   5 Km    5 Km   Rest   Race&lt;/p&gt;
&lt;p&gt;My times:&lt;/p&gt;
&lt;p&gt;WEEK   MON    TUE     WED     THU           FRI     SAT     SUN&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;1      Rest   ✘       29:04   ✔             Rest    26:36   38:40
2      Rest   29:11   28:50   ✔             Rest    27:07   44:55
3      Rest   40:46   26:29   ✔             Rest    ✘       57:01
4      Rest   46:46   ✘       ✘             Rest    30:08   1:12:10
5      Rest   46:59   Rest    44:46         Rest    24:50   1:25:24
6      Rest   50:02   Rest    46:24         Rest    ✘       1:37:39
7      Rest   46:54   46:41   46:42         Rest    ✘       1:57:57
8      Rest   45:28   Rest    48:13 (8km)   Rest    43:56   ✘
9      Rest   44:24   Rest    27:12         26:09   Rest    1:58:28&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 11 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/9-week-half-marathon-training</guid></item><item><title>Shanghai travel bookmarks</title><link>https://xenodium.com/shanghai-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.nytimes.com/2013/12/01/travel/36-hours-in-shanghai.html"&gt;36 Hours in Shanghai&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Shanghai Xiaolongbao at &lt;a href="http://www.yelp.com/biz/shanghai-dumpling-house-edison-2"&gt;Dumpling House Edison (on Rt 27)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goo.gl/maps/FQmSF"&gt;Tianzi Fang street art (Google maps)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tianzifang.cn/"&gt;Tianzi Fang street art&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goo.gl/maps/Ngqwk"&gt;Town God's Temple&lt;/a&gt;, street Food!&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Yu_Garden"&gt;Yu Garden/Huxinting Teahouse&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;佳家 for 小龙包.&lt;/li&gt;
&lt;li&gt;小样 (Little Yang's) for 生煎包 (sheng jian bao). Fried soup filled dumplings. Think skin crunchy bottom texture.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 11 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/shanghai-travel-bookmarks</guid></item><item><title>Links - August 11, 2015</title><link>https://faingezicht.com/links/2015/08/11/links/</link><description/><author>Avy Faingezicht</author><pubDate>Tue, 11 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/links/2015/08/11/links/</guid></item><item><title>How to Use Heroku PGBackups</title><link>https://www.brightball.com/articles/how-to-use-heroku-pgbackups</link><description>Backing up your data is one of the most critical activities for your application. Heroku PGBackups makes the entire experience pretty simple but comes with a lot of flexibility too, with a number of options for smooth restoration.</description><author>Brightball Articles</author><pubDate>Tue, 11 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/how-to-use-heroku-pgbackups</guid></item><item><title>A Culture of Quality</title><link>https://boyter.org/2015/08/culture-quality/</link><description>&lt;p&gt;The best working environment I had the pleasure to work in had a strong emphasis on testing and software quality in general. Product teams were encouraged to spend extra time ensuring that everything worked over shipping before it was ready. The transformation it went through was incredible. Having come from a culture very much wild west through to where it was. An example of the advantages this brought was that before adopting this culture website launches were a traumatic event. Teams would block out 48 hours stretches and work solid fixing bugs at go live. Very stressful for all involved and not a healthy working environment. Contrast to where things ended up where several websites were launched on the same afternoon without a hitch. Very impressive considering the scale of the websites being dealt with (several million uniques a day).&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 10 Aug 2015 11:17:33 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/08/culture-quality/</guid></item><item><title>Singapore job board bookmarks</title><link>https://xenodium.com/singapore-job-board-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://angel.co/singapore/jobs"&gt;Angel.co (Singapore Startup Jobs)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://e27.co/jobs"&gt;e27&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.startupjobs.asia/"&gt;Startupjobs.asia&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/NataliePis/status/1130811744027316224"&gt;Those who relocated to Europe for a tech position: where did you find your job?&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 10 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/singapore-job-board-bookmarks</guid></item><item><title>$100 startup</title><link>https://june.kim/100-startup/</link><author>june.kim</author><pubDate>Mon, 10 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/100-startup/</guid></item><item><title>Adventures after Google I/O-4(Databinding)</title><link>https://prashamhtrivedi.in/adventures-databinding-4.html</link><description>After trying and playing some new stuffs(except M preview) released in Google I/O, I have found some trivial things to take care of. In concluding part of series we will see what are some issues with Google&amp;rsquo;s Databinding plugin and how we can get around it</description><author>Prasham H Trivedi</author><pubDate>Mon, 10 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/adventures-databinding-4.html</guid></item><item><title>RAM is the new disk – and how to measure its performance – Part 1 – Introduction</title><link>https://tanelpoder.com/2015/08/09/ram-is-the-new-disk-and-how-to-measure-its-performance-part-1/</link><description>&lt;p&gt;[ part 1 | &lt;a href="https://tanelpoder.com/2015/09/21/ram-is-the-new-disk-and-how-to-measure-its-performance-part-2-tools/"&gt;part 2&lt;/a&gt; | &lt;a href="https://tanelpoder.com/2015/11/30/ram-is-the-new-disk-and-how-to-measure-its-performance-part-3-cpu-instructions-cycles/"&gt;part 3&lt;/a&gt; ]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RAM is the new disk&lt;/strong&gt;, at least in the In-Memory computing world.&lt;/p&gt;
&lt;p&gt;No, I am not talking about Flash here, but Random Access Memory – RAM as in SDRAM. I’m by far not the first one to say it. &lt;a href="https://research.microsoft.com/en-us/um/people/gray/"&gt;Jim Gray&lt;/a&gt; wrote this in 2006: &lt;em&gt;“Tape is dead, disk is tape, flash is disk, RAM locality is king”&lt;/em&gt; (&lt;a href="https://research.microsoft.com/en-us/um/people/gray/talks/flash_is_good.ppt"&gt;presentation&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Also, I’m not going to talk about how RAM is faster than disk (everybody knows that), but in fact how RAM is the &lt;em&gt;slow&lt;/em&gt; component of an in-memory processing engine.&lt;/p&gt;
&lt;p&gt;I will use Oracle’s In-Memory column store and the &lt;em&gt;hardware performance counters&lt;/em&gt; in modern CPUs for drilling down into the low-level hardware performance metrics about CPU efficiency and memory access.&lt;/p&gt;
&lt;p&gt;But let’s first get started by looking a few years into past into the old-school disk IO and index based SQL performance bottlenecks :)&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Mon, 10 Aug 2015 02:26:55 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2015/08/09/ram-is-the-new-disk-and-how-to-measure-its-performance-part-1/</guid></item><item><title>Outside Lands</title><link>https://faingezicht.com/photos/2015/08/09/outside-lands/</link><description>My second visit to the music festival. It did not disappoint.</description><author>Avy Faingezicht</author><pubDate>Sun, 09 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/photos/2015/08/09/outside-lands/</guid></item><item><title>How to sign release apk with gradle</title><link>https://zserge.com/posts/android-signing/</link><description>Whenever I prepare my APK for the release - I used to do the following steps:
Copy keystore to the project directory Copy gradle.properties into the project directory with keystore name, alias and password defined Copy some code from some blog that would load the properties and set up the signing Finally, do gradle build But why not to move the boilderplate out of build.gradle?
Helper signing script I wrote a tiny helper script that can be included into the projects:</description><author>zserge's blog</author><pubDate>Sun, 09 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/android-signing/</guid></item><item><title>Update Raspberry pi firmware from Kali Linux</title><link>https://shyamjos.com/how-to-update-raspberrypi-firmware-in-kali-linux/</link><description>&lt;p&gt;






 
 
&lt;figure&gt;&lt;img alt="flashing rpi" class="mx-auto my-0 rounded-md" src="https://shyamjos.com/assets/img/rpi/rpi-firmware.webp" /&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;We can easily update Raspberry pi firmware in raspbian by running the command rpi-update, But in kali linux we dont have rpi-update command by default.
&lt;br /&gt;&lt;br /&gt;
To install the rpi-update in kali, run the following command:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo curl -L --output /usr/bin/rpi-update https://raw.githubusercontent.com/Hexxeh/rpi-update/master/rpi-update &amp;amp;&amp;amp; sudo chmod +x /usr/bin/rpi-update
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then, to update your rpi firmware, run the following command:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo rpi-update
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now restart your rpi to new firmware to take effect.
&lt;br /&gt;
For more Expert options visit the &lt;a href="https://github.com/Hexxeh/rpi-update" rel="noreferrer" target="_blank"&gt;rpi-update project page&lt;/a&gt;&lt;/p&gt;</description><author>Shyam Jos</author><pubDate>Sun, 09 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://shyamjos.com/how-to-update-raspberrypi-firmware-in-kali-linux/</guid></item><item><title>Germany travel bookmarks</title><link>https://xenodium.com/germany-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Azalea_and_Rhododendron_Park_Kromlau"&gt;Azalea and Rhododendron Park Kromlau&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zerokspot.com/weblog/2020/04/05/post-lockdown-bucketlist/"&gt;Having a post-lockdown bucket list - zerokspot.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.7stern.at/de-de/"&gt;Home - 7STERN Bräu&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kerriescupoftea.blogspot.co.uk/2014/10/lai-fufu-in-munich-germany.html"&gt;Kerrie's Cup of Tea: lai fufu in Munich Germany&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.laifufu.de/"&gt;Laifufu Teesalon - Teezeremonie - Tee - Oolong - München - Laifufu Teesalon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sudhaus.at/"&gt;SUDHAUS — Brauerei &amp;amp; Restaurant (try beef tartar. also pizza?)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 08 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/germany-travel-bookmarks</guid></item><item><title>Menorca travel bookmarks</title><link>https://xenodium.com/menorca-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.flickr.com/photos/paul_stephenson/4282369223/"&gt;Cala Macarella, Menorca&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Punta_Nati_Lighthouse"&gt;Punta Nati&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/spain/balearic-islands/menorca/activities/driving-offroading/scooter-rental-menorca"&gt;Scooter rental in Menorca&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 08 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/menorca-travel-bookmarks</guid></item><item><title>Travel tools bookmarks</title><link>https://xenodium.com/travel-tools-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.cool-cities.com/"&gt;Cool cities, a visual city guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.producthunt.com/tech/detour-2-0"&gt;Detour 2.0&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id%3Dco.dojoapp.dojo&amp;amp;hl%3Den_GB"&gt;Dojo: Best stuff to do in London&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.escapethecity.org"&gt;escapethecity.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://everplaces.com"&gt;Find the best places to sleep, eat and play&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hostelworld.com"&gt;hostelworld.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ezroadtrips.com/blogs/2015/03/How-To-Travel-The-World-Without-Money.html"&gt;How to travel the world without money&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://indie.bootsnall.com/"&gt;Indie: a simple, powerful way to buy multi-stop flights&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://app.internationalsos.com"&gt;International SOS Assistance App&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://izi.travel/en"&gt;IziTravel: audio guides and city/museum tours&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jetsetter.com"&gt;Jet Setter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://us.louisvuitton.com/eng-us/men/books/city-guides"&gt;Louis Vuitton city guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mapiac.com/travel-map/"&gt;Mapiac: discover hidden wonders&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.roadsharing.com"&gt;roadsharing.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tripcast.co/"&gt;Tripcast&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.triposo.com/"&gt;Triposo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vayable.com/"&gt;Vayable (find a new experience)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.visahq.com/citizens/"&gt;Visa Requirements by Citizenship&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-is-the-best-website-or-app-to-use-for-trip-planning-and-why"&gt;What is the best website or app to use for trip planning, and why? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-travel-hacks-have-saved-you-a-lot-of-money"&gt;What travel hacks have saved you a lot of money? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wwoof.net"&gt;wwoof.net (Worldwide Opportunities on Organic Farms)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 08 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/travel-tools-bookmarks</guid></item><item><title>Philippines travel bookmarks</title><link>https://xenodium.com/philippines-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rachfeed.com/5-unique-tourist-spots-philippines/"&gt;5 Unique Tourist Spots in the Philippines - RachFeed&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/philippines/travel-tips-and-articles/the-philippines-for-beginners-7-first-timer-fails-to-avoid-on-your-trip"&gt;7 first-timer fails&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Palawan_%28island%29"&gt;Palawan (island)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/philippines/travel-tips-and-articles/77222"&gt;The best beaches of the Philippines&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 08 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/philippines-travel-bookmarks</guid></item><item><title>Wooden Rack</title><link>https://june.kim/wooden-rack/</link><author>june.kim</author><pubDate>Sat, 08 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/wooden-rack/</guid></item><item><title>2015-08-07</title><link>https://ho.dges.online/pictures/2015-08-07/</link><description>&lt;p&gt;&lt;strong&gt;The Chosen One&lt;/strong&gt;&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Fri, 07 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-08-07/</guid></item><item><title>Kaizen</title><link>https://june.kim/kaizen/</link><author>june.kim</author><pubDate>Thu, 06 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/kaizen/</guid></item><item><title>How Palette was made</title><link>https://zserge.com/posts/palette/</link><description>Palette is an open source lightweight color picker for the most famous color schemes, like Material Design, Flat UI, iOS, Windows Phone etc.
Despite being color blind, I like apps and websites with the right selection of colors. And sometimes when starting a new project it&amp;rsquo;s easier to pick a color palette from the existing ones. Or, if you want to meet the guidelines for the certain platform - you&amp;rsquo;d better use the colors they offer.</description><author>zserge's blog</author><pubDate>Thu, 06 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/palette/</guid></item><item><title>C# as a Language from old Google+ Post</title><link>https://boyter.org/2015/08/c-language-google-post/</link><description>&lt;p&gt;The more I use C# as a language for writing things the more I am convinced that its approach really is the best language approach out there.&lt;/p&gt;
&lt;p&gt;The unit test support is excellent which allows development speed to be just as fast as any dynamic language (Python, PHP, Perl).&lt;/p&gt;
&lt;p&gt;The static typing catches so many issues before you get to runtime and allows sweeping changes without breaking things.&lt;/p&gt;
&lt;p&gt;Unlike Java it has the var keyword (saves time and improves readability) and so many more useful functions which yes you can replicate but are just built in and work correctly.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 06 Aug 2015 01:37:38 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/08/c-language-google-post/</guid></item><item><title>Recombination</title><link>https://june.kim/good-ideas/</link><author>june.kim</author><pubDate>Wed, 05 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/good-ideas/</guid></item><item><title>Slack bot for Phabricator Notifications</title><link>https://srijan.ch/slack-bot-for-phabricator</link><description>Setting up a slack bot for phabricator</description><author>Srijan Choudhary, all posts</author><pubDate>Tue, 04 Aug 2015 21:20:00 GMT</pubDate><guid isPermaLink="true">https://srijan.ch/slack-bot-for-phabricator</guid></item><item><title>2015-08-04</title><link>https://ho.dges.online/pictures/2015-08-04/</link><description>&lt;p&gt;Both boys very tired at the end of a long evening and wanting to sleep.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Tue, 04 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-08-04/</guid></item><item><title>Pee-training Rigel</title><link>https://liza.io/pee-training-rigel/</link><description>&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; This is part of a series of posts about Rigel the Maine Coon kitten who was given a urinary infection by a veterinarian in Stockholm during a routine surgery and has been struggling with peeing since. You can read more in the &lt;a href="https://liza.io/rigel"&gt;Rigel section&lt;/a&gt;.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Mon, 03 Aug 2015 19:58:47 GMT</pubDate><guid isPermaLink="true">https://liza.io/pee-training-rigel/</guid></item><item><title>The Congress</title><link>https://olshansky.info/movie/the_congress/</link><description>Olshansky's review of The Congress</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 03 Aug 2015 16:30:41 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_congress/</guid></item><item><title>Problem Solving 2</title><link>https://june.kim/problem-solving-2/</link><author>june.kim</author><pubDate>Mon, 03 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/problem-solving-2/</guid></item><item><title>Upgrading Linode II: Xen to KVM</title><link>https://thomashunter.name/posts/2015-08-03-upgrading-linode-ii-xen-to-kvm</link><author>Thomas Hunter II</author><pubDate>Mon, 03 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2015-08-03-upgrading-linode-ii-xen-to-kvm</guid></item><item><title>Making army lists in Age of Sigmar</title><link>https://benovermyer.com/blog/2015/08/making-army-lists-in-age-of-sigmar/</link><description>&lt;p&gt;Making an army list in Age of Sigmar is an unusual process for those of us used to the traditional Games Workshop methods. In Warhammer Fantasy you decided on a points value, an army, and then tried to match a unit selection based on force organization rules and a balanced strategy to defeat as many types of opponents as possible. Those opponents would most often be similarly organized. In Age of Sigmar, however, there are only two ways to build for “strength:” by sheer force of numbers, or by maximizing keyword synergies. The sheer-force-of-numbers (a.k.a. pay-to-win) approach will not win you any friends, and may get you banned from games. The keyword synergy approach, though, is as yet an undiscovered country. Everyone is starting to pick up on the idea that you can take certain units to play on their collective strengths. As the community finds its feet in this new game, strong strategies are bound to come out.&lt;/p&gt;
&lt;p&gt;For example, the Dark Elf Cold One Knights are somewhat lackluster by themselves. However, in the presence of a Dreadlord on Cold One they (and Cold One Chariots) reroll charge rolls and add 1 to Wound rolls for one of their attacks. It's combinations like this that will define Age of Sigmar army lists. While you can make all kinds of interesting setups, it's this system that's going to draw the tactical minds out of its players. I'm reminded heavily of Magic: the Gathering or Hearthstone here. Both of those games encourage players to build winning strategies on specific synergistic themes that amplify their benefits, while not discouraging taking completely odd selections for flavor or for backup strategies. For my part, I intend on running a lot of Dark Elves (or Exiles, as they're now called) as the core of my first army. There's a lot to love there.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Mon, 03 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/08/making-army-lists-in-age-of-sigmar/</guid></item><item><title>Offering free internet well almost and survive disaster, power outage, Internet blackout</title><link>https://blog.nobugware.com/post/2015/internet_access_power_outage_disaster_free/</link><description>In my neighborhood, I&amp;rsquo;m experimenting to give free access to some services, not the full internet but a full access to Wikipedia, maps&amp;hellip;
Here are some tips do to the same.
Getting access to the internet may be crucial for our lives, but the commercial providers are here to make money out of it. They don&amp;rsquo;t event provide disasters nor minimum safety access.
Sometimes even in normal condition, while traveling your roaming will cost you hundreds just to get access to a map or Wikipedia.</description><author>Fabrice Aneche</author><pubDate>Sun, 02 Aug 2015 23:26:38 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2015/internet_access_power_outage_disaster_free/</guid></item><item><title>Access OS metrics from Golang</title><link>https://blog.nobugware.com/post/2015/metrics_golang_operating_system/</link><description>I&amp;rsquo;ve recently published StatGo, it gives you access to your operating system metrics like free memory, used disk spaces &amp;hellip;
It&amp;rsquo;s a binding to the C library libstatgrab, a proven stable piece of code that works on many different systems, FreeBSD, Linux, OSX &amp;hellip;
It&amp;rsquo;s very simple to use:
s := NewStat() c := s.CPUStats() fmt.Prinln(c.Idle) 98.2 Feel free to contribute, it may need some improvement but it&amp;rsquo;s working I&amp;rsquo;m using it in a small metrics web server to monitor small network of servers.</description><author>Fabrice Aneche</author><pubDate>Sun, 02 Aug 2015 20:10:38 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2015/metrics_golang_operating_system/</guid></item><item><title>Laravel log file backups to S3</title><link>https://liza.io/laravel-log-file-backups-to-s3/</link><description>&lt;p&gt;SnailLife does a lot of logging for debugging purposes. Aside from the general &lt;code&gt;laravel.log&lt;/code&gt; I have separate loggers for each snail and also write logs for stuff like deleted items etc in separate files.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sun, 02 Aug 2015 15:51:05 GMT</pubDate><guid isPermaLink="true">https://liza.io/laravel-log-file-backups-to-s3/</guid></item><item><title>Host your blog on Github with autodeploy</title><link>https://blog.nobugware.com/post/hugo_blog_github/</link><description>I&amp;rsquo;ve always developed my own blog system, that&amp;rsquo;s a good way to learn a new langage.
But having to maintain a working server or hosting is no fun, there are some solutions like Jekyll or Hugo they generate static web pages based on some Markdown files you wrote.
As it&amp;rsquo;s just basic html files, they can be served by Github gh-pages. It opens the door to blogging from anywhere without internet connection or your own laptop, just write some Markdown then publish to github later or event edit your new blog post from the Github editor.</description><author>Fabrice Aneche</author><pubDate>Sun, 02 Aug 2015 07:32:43 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/hugo_blog_github/</guid></item><item><title>Migrate to Hugo</title><link>https://blog.nobugware.com/post/migrate_to_hugo/</link><description>This blog is running Hugo with an auto deploy via Wercker and hosted on Github Page. Take #2
Previous blog was hosted on Google App Engine with a Python blog system, to get the previous articles, I had to run in a small data migration.
Make a backup from GAE admin web interface: Go to Datastore admin and backup your entity mine was Post and then backup to blobstore, go to Blob Viewer and download your file named around datastore_backup_datastore_backup_2015_08_02_Post-157413521680733022360302ADC43E4-output-1-attempt-1</description><author>Fabrice Aneche</author><pubDate>Sun, 02 Aug 2015 05:36:51 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/migrate_to_hugo/</guid></item><item><title>Problem Solving</title><link>https://june.kim/problem-solving/</link><author>june.kim</author><pubDate>Sun, 02 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/problem-solving/</guid></item><item><title>Unit Tests Manage Complexity</title><link>https://cmdev.com/blog/2015-08-02-unittestsmanagecomplexity/</link><description>Unit testing is more than a design tool, not just a practice that enhances quality, it is a tool for managing complexity.</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Sun, 02 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-08-02-unittestsmanagecomplexity/</guid></item><item><title>His love endures forever!</title><link>http://evantravers.com/articles/2015/08/02/his-love-endures-forever/</link><description>&lt;p&gt;&lt;img alt="view from the mountain" src="https://images.evantravers.com/articles/2015/08/england.jpg" /&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Give thanks to the God of heaven, for his steadfast love endures forever.
(Psalm 136:26 ESV)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My Father, I have always loved this anthem of a Psalm, but today through it I
praise you still deeper. Thank you for what you showed me buried in its
treasure-trove this morning. I love the list of great works, and have always
triumphantly recounted with the psalmist your wonders of old: victory over
enemies, freedom from unjust oppression, power over creation's bounds and the
rules of physics itself… but for some reason I have missed the whole point of
the song. These actions describe You yes, but the psalmist calls us to joyous
praise because of a still deeper truth: Your love endures forever! He recounts
your works in Israel's history with joy, but to him they are a side note to the
work of redemption. Thank you that you love &lt;em&gt;endures&lt;/em&gt;, it was conceived, begun,
planned in the time before time, it continued, was promised, executed and
brought to life in the past, and continues gloriously on into eternity, for
Your love has a name and His name is Jesus. Thank you that your love endures…
for without it I certainly will not. God you are great. You are truly awesome.
Worthy is your name! Hallelujah!&lt;/p&gt;</description><author>trv.rs</author><pubDate>Sun, 02 Aug 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2015/08/02/his-love-endures-forever/</guid></item><item><title>Simple Python to Batch search CAZy Database</title><link>https://ericonotes.blogspot.com/2013/04/simple-python-to-batch-search-cazy.html</link><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmAlCPjHBuo1gGZzrsPWrGmafHuDEKqO-9IhhILm_1UrEMTqwDUb2vlokAE36fYbD7paVQzLMtxYYM3vt9K8tcvKxnOuW5FqFFnX7QcDNrgZprELkpjnDTfQacwzxJYy2PHgYKKdVogs8-/s1600/cazy.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmAlCPjHBuo1gGZzrsPWrGmafHuDEKqO-9IhhILm_1UrEMTqwDUb2vlokAE36fYbD7paVQzLMtxYYM3vt9K8tcvKxnOuW5FqFFnX7QcDNrgZprELkpjnDTfQacwzxJYy2PHgYKKdVogs8-/s400/cazy.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;This code may be old&lt;/b&gt;. please follow here to the most up-to-date version: &lt;a href="https://github.com/ericoporto/CazyBatchSearch"&gt;https://github.com/ericoporto/CazyBatchSearch&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Yes, a way to use a table to search the&amp;nbsp;Carbohydrate-Active enZYmes Database. Below the Python 2.7.3 script.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code style="color: black;"&gt;
'''
Copyright 2014 Érico Porto

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
'''
from __future__ import print_function  
 import httplib  
 def findEnzymeInCazy(enzyname):  
   conn = httplib.HTTPConnection("www.cazy.org", 80)  
   conn.connect()  
   conn.request('GET', "/search?tag=4&amp;amp;recherche=" + enzyname)  
   lines = conn.getresponse().read().split('\n')  
   for i,line in enumerate(lines):  
     if ( '&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a href="http://www.cazy.org/' in line ):  
       linkLine = lines[i]  
       j = linkLine.find( '"http://www.cazy.org/' ) + 21  
       k = linkLine.find( '.html"', j )  
       return linkLine[j:k] # beteween first and second double quotes  
   return None  
 f = open('saida.csv','w')  
 print("enzima     ; rankdomal", file=f)  
 print("enzima     ; rankdomal")   
 for line in open("enzylist.csv","r"):  
   pieces = line.split(";")  
   enzyname = pieces[0].strip()  
   enzyInCazy = findEnzymeInCazy(enzyname)  
   if ( enzyInCazy != None ):  
     print(enzyname.ljust(15) + '; ' + enzyInCazy.ljust(20), file=f)  
     print(enzyname.ljust(15) + '; ' + enzyInCazy.ljust(20))  
   else:  
     print(enzyname.ljust(15) + '; ' + "not found!", file=f)  
     print(enzyname.ljust(15) + '; ' + "not found!")  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
So, you will need a file named enzylist.csv for this to work. Here take this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code style="color: black;"&gt; BAI68730
 BAH05588
 ACV62532
 EAL90874
 ABG47447
 ACT04224
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
So if you run it, you should get something like:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #012456; border: 1px dashed rgb(204, 204, 204); font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code&gt;&lt;span style="color: white;"&gt; python .\enzymtable_simple.py  
 enzima     ; rankdomal  
 BAI68730    ; GH57  
 BAH05588    ; GH94  
 ACV62532    ; GH94  
 EAL90874    ; GH13  
 ABG47447    ; GH18  
 ACT04224    ; GH51  &lt;/span&gt;&lt;/code&gt;&lt;code style="color: black;"&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
So all should be good. Yes I run Python on Windows 8 using PowerShell. Just add the Python folder to the PATH variable, and all should run well - and also, PowerShell is much faster and easy to use than CMD.&lt;br /&gt;
&lt;br /&gt;</description><author>Erico Notes</author><pubDate>Sun, 02 Aug 2015 02:41:21 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2013/04/simple-python-to-batch-search-cazy.html</guid></item><item><title>More history, some musing about syncing files</title><link>http://negfeedback.blogspot.com/2015/08/more-history-some-musing-about-syncing.html</link><description>It's interesting how your tools affect your choices and how you can end up in a place which works for your current needs but doesn't make the next step you're trying to get to easy.&lt;br /&gt;
&lt;br /&gt;
To understand my current situation regarding managing my files, it's probably best to go into a little bit of history.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Early computer use: no syncing&lt;/h2&gt;
I enrolled as an undergraduate in 1997. When I arrived on campus I was given my very first e-mail address and I remember spending huge amounts of time in the computer labs writing to all of my friends (using a program called &lt;a href="https://en.wikipedia.org/wiki/Pine_(email_client)"&gt;Pine&lt;/a&gt;, which looked like this):&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://upload.wikimedia.org/wikipedia/en/c/ce/PineScreenShot.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="250" src="https://upload.wikimedia.org/wikipedia/en/c/ce/PineScreenShot.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Pine screenshot&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Files were small and you carried them around with you on things that we called stiffies. The Americans called them&amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Floppy_disk#3.C2.BD-inch_floppy_disk"&gt;3½-inch floppy disks&lt;/a&gt;. The capacity of a stiffy was 1.44 MB. This was enough for most of your work in a semester. Stiffies were notoriously unreliable, so you never really worked on the disk only, because for all you knew, they could die tomorrow. Stiffies were for moving files from one computer to another, not for long-term storage. Some people had CD writers, but campus computers didn't.&lt;br /&gt;
&lt;br /&gt;
I didn't have a computer in my res room until my second year, and when I did it wasn't connected to any kind of network until third year. I could only check my mail and do IRC on campus computers.&lt;br /&gt;
&lt;br /&gt;
Once I got a computer in my room, an issue emerged: sometimes I would start working on something in my room and I would need to continue working on it on campus. So I would copy it to a stiffy and ride my bike to campus, where I would copy it over and keep working. This process led to copies of the files on both machines with no clear way to keep track of which one I had worked on last. So if I forgot my disk on my desk and worked on the campus copy instead of the version I had in my room, things would break. Luckily files were small at first, but technology rapidly improved and by final year (2000) we had CD writers. At this point, we had Internet connections, but they were so slow that it was much faster to burn a CD and bike to campus than to send the data over the Internet. The fastest &lt;a href="https://en.wikipedia.org/wiki/Dial-up_Internet_access"&gt;dial-up modem&lt;/a&gt; speed was 56 kbps, which would require more than a day to transfer the 700 MB that fits on a CD.&lt;br /&gt;
&lt;br /&gt;
For my entire undergraduate career, therefore, I could never sync my account on campus with my computer at res or the one at home. I just had some random files in various places which I had to transfer piecewise.&lt;br /&gt;
&lt;h2&gt;
Postgraduate: two computers, external HDD&lt;/h2&gt;
&lt;div&gt;
When I enrolled for my Masters in 2001, I moved into a lab and got assigned a computer. Now I had a computer in my room at res and one at the lab and I often found myself having to transfer files between them. I installed a removable hard-drive bay enclosure and had a hard drive that I would shuttle between the two locations. Moving things this way was a big deal. IDE hard drives don't support hot-swapping, so I would sync to the hard drive, turn off my computer, remove the hard drive and then boot up with the hard drive in place at the new location. I believe that this hard drive was either a 500 MB or 1 GB. It is around this time that I started using &lt;a href="http://www.cis.upenn.edu/~bcpierce/unison/"&gt;Unison&lt;/a&gt; to sync the external hard drive to the machine where I was working. This meant I could survive forgetting to bring the hard drive to the lab, since Unison stores a hash of all the files and can recognise if two files have changed. I synced basically all of my files except for music files and movies, which were too large to fit on this external hard drive.&lt;/div&gt;
&lt;h2&gt;
Two desktops, laptop, local network&lt;/h2&gt;
&lt;div&gt;
When I started working for the University of Pretoria in 2003, I continued to use the HHD sync strategy for a while, and when I got a laptop, I started treating it similarly to the HHD - I would use Unison, but now using the (wired) network to connect the machines instead of plugging in a hard drive. I continue to use this strategy today. Every morning before starting to work on my desktop, I sync. Every evening before leaving, I sync. This way I have a complete copy of my working files on both machines (my laptop and my desktop). This provides a level of redundancy (I don't think of this as a backup strategy, that's handled by Bacula on my desktop and these days by Time Capsule on my laptop).&lt;/div&gt;
&lt;h2&gt;
A change: cheap Internet&lt;/h2&gt;
&lt;div&gt;
During my first couple of years at the university, we were charged R1/MB for internet access. Let me repeat that in units that make more sense to a modern reader: that's &lt;b&gt;R1000/GB&lt;/b&gt;. This means that any kind of large file transfer using the Internet was completely out of the question. It also led to me turning into a packrat. Since downloading software or even articles was so expensive, I developed a huge folder of downloads that I would maintain to avoid having to re-download files.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Rummaging around my old e-mail, I find that in 2005 we had a limit of R60/month in place. That's right, ten years ago the University limited my monthly bandwidth to 60 MB. In 2011 we were being charged 16 c/MB (R160/GB) on student access, but staff caps had been dropped.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Dropbox launched at the end of 2008, registering dropbox.com in 2009. This is when the idea of easily syncing files over the Internet really started taking hold. I think I installed Dropbox in 2010, when our IT department dropped caps.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
At the moment I use Dropbox for sharing files with other people and I still use Unison to handle syncing the files on my laptop and my desktop.&lt;/div&gt;
&lt;h2&gt;
A remaining issue: campus proxy/firewall&lt;/h2&gt;
&lt;div&gt;
Even though we are no longer charged for Internet access on campus, we still have to log in to our proxy server to get access to the Internet. This does not work transparently for all applications. In addition, for obvious reasons, we can't set up a server on a machine inside campus which will be visible off-campus. I have only recently (early 2015) been able to set up a virtual machine inside our DMZ which would allow me set up a central repository for files.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I have to switch Dropbox between proxy and no proxy every time I move from home to campus.&lt;/div&gt;
&lt;h2&gt;
Side-effects&lt;/h2&gt;
&lt;div&gt;
Because I built my syncing strategy when Internet access was either slow or expensive or both, and because I've been working on two different computers regularly, I have avoided dependence on client-server technologies. Specifically, I have not depended on a client-server database like &lt;a href="https://www.mysql.com/"&gt;MySQL&lt;/a&gt; or &lt;a href="http://www.postgresql.org/"&gt;PostgresSQL&lt;/a&gt;. Instead, when I required SQL database functionality, I've use &lt;a href="https://www.sqlite.org/"&gt;SQLite&lt;/a&gt;, which allows me to continue with the file-based syncing strategy.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But now I've started investigating NoSQL technologies like &lt;a href="https://www.mongodb.org/"&gt;Mongodb&lt;/a&gt; or &lt;a href="http://redis.io/"&gt;Redis&lt;/a&gt; (and later, perhaps something like &lt;a href="https://hadoop.apache.org/"&gt;Hadoop&lt;/a&gt;). It doesn't appear as though these things have a simple file-based alternative similar to SQLite.&lt;/div&gt;
&lt;h2&gt;
Why change what works?&lt;/h2&gt;
&lt;div&gt;
It is clear from my interaction with industry that their model is very solidly built around central databases with access from clients. This is a similar model to all the Internet services we use now. I'm familiar with setting up these systems, but my students and I often have only intermittent access to the the Internet. The students because they can't afford it, myself because I travel using the Gautrain, and often have to work in a disconnected state. Not to mention load shedding.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now I am interested in building a better system which has some of the nice properties I have come to rely on with Unison, or at least allows for limited offline use with periodic syncing. I know this will not be as simple as setting up two directories to sync, but I'm getting the horrible feeling that each system will have its own problematic story and that the central server strategy is just a way of avoiding sync rather than a solution.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If anybody has a suggestion, I'd be pleased to hear it.&lt;/div&gt;</description><author>Negative Feedback</author><pubDate>Sat, 01 Aug 2015 10:01:50 GMT</pubDate><guid isPermaLink="true">http://negfeedback.blogspot.com/2015/08/more-history-some-musing-about-syncing.html</guid></item><item><title>Justification After Actions</title><link>https://venam.net/blog/philosophy/2015/08/01/justification-after-actions.html</link><description>Hello fellow readers,  In this post I'll discuss a subject that has been nagging me.  Justification After Actions I usually write to clear my mind about a topic. These days I can't really keep up with all the things that bug me. This subject is a preparation to a broader subject that I'm preparing to write about.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Sat, 01 Aug 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/philosophy/2015/08/01/justification-after-actions.html</guid></item><item><title>Automated mugshots with Python and OpenCV</title><link>https://bastian.rieck.me/blog/2015/mugshots/</link><description>&lt;p&gt;One of my most favourite books, &lt;a href="http://www.goodreads.com/book/show/816.Cryptonomicon"&gt;&lt;em&gt;Cryptonomicon&lt;/em&gt; by Neal Stephenson&lt;/a&gt;
contains a scene in which one of the protagonists, Randy, is letting other people use a demo on his
laptop in a business meeting. Since Randy does not know all the people in the meeting he figures it
would be a good idea to clandestinely collect their mugshots by writing a program that captures all
the different faces appearing in front of his webcam.&lt;/p&gt;
&lt;p&gt;I always wanted to do this because it sounds like a very fun idea. I sometimes leave my laptop open
and lock it when I am on a conference and know that I shall be shortly returning to my seat. It was
always a pet peeve of mine to know whether other people were trying to unlock the laptop&amp;hellip;&lt;/p&gt;
&lt;p&gt;So, with the power of Python and &lt;a href="http://opencv.org"&gt;OpenCV&lt;/a&gt;, years after reading &lt;em&gt;Cryptonomicon&lt;/em&gt;
for the first time, I finally wrote my own version of Randy&amp;rsquo;s program. This turned out to be
surprisingly easy. It is a testament to the versatility of Python (and its libraries of course) that
this problem can be solved by a really short program.&lt;/p&gt;
&lt;p&gt;You can download the script from &lt;a href="https://github.com/Pseudomanifold/Mugshot"&gt;its GitHub repository&lt;/a&gt;.
Further improvements may include (in the hopes that I get around to do this):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Recognizing and categorizing different faces&lt;/li&gt;
&lt;li&gt;Taking mugshots when certain actions happen (a git hook could trigger this, for example)&lt;/li&gt;
&lt;li&gt;Investigating different methods of face recognition&lt;/li&gt;
&lt;li&gt;Detecting basic emotions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The script is dead simple to use. Just call&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./mugshot.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./mugshot.py --hide
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in case you do not want to get visual feedback about the recognized faces. &lt;code&gt;mugshot.py&lt;/code&gt; uses a
simple logic to not fill about its working directory with useless faces: If either the number of
faces changes between two frames or more than 10 seconds passed between the current face detection
and the previous one, a new mugshot will be taken. The mugshots are named using the current time,
with a suffix in case multiple faces are detected.&lt;/p&gt;
&lt;p&gt;Have fun!&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Fri, 31 Jul 2015 20:15:15 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/mugshots/</guid></item><item><title>Dataflow Engine</title><link>https://mattkeeter.com/projects/graph</link><description>Designing with graphs</description><author>Matt Keeter</author><pubDate>Fri, 31 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/projects/graph</guid></item><item><title>JIT Development</title><link>https://june.kim/jit-development/</link><author>june.kim</author><pubDate>Thu, 30 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/jit-development/</guid></item><item><title>Making Stuff</title><link>https://june.kim/making-stuff/</link><author>june.kim</author><pubDate>Thu, 30 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/making-stuff/</guid></item><item><title>Implementing AES</title><link>https://nindalf.com/posts/implementing-aes/</link><description>This article explains how to implement the Advanced Encryption Standard (AES) algorithm</description><author>Krishna's blog</author><pubDate>Thu, 30 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nindalf.com/posts/implementing-aes/</guid></item><item><title>Break hard, break early.</title><link>https://june.kim/break/</link><author>june.kim</author><pubDate>Wed, 29 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/break/</guid></item><item><title>"Facebook Background Task Host" consuming 100% disk bandwidth</title><link>https://www.databasesandlife.com/facebook-background-task-host-consuming-100-disk-bandwidth/</link><description>&lt;p&gt;The program &amp;ldquo;Facebook Background Task Host&amp;rdquo; was consuming the entirety of my disk bandwidth on my Windows 8.1 computer. Further, there seemed to be almost nothing written about this program on the internet according to Google. Rebooting the computer didn&amp;rsquo;t help: after the reboot it was there again. I did not remember downloading anything from Facebook to run on my computer.&lt;/p&gt;
&lt;p&gt;The solution was to go to the Windows 8 start screen, and find the Facebook &amp;ldquo;app&amp;rdquo;, and then uninstall it.&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Wed, 29 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/facebook-background-task-host-consuming-100-disk-bandwidth/</guid></item><item><title>keybase.io</title><link>https://bastian.rieck.me/blog/2015/keybase.io/</link><description>&lt;p&gt;I now also have &lt;a href="https://keybase.io/brieck"&gt;keybase.io profile&lt;/a&gt; and feel
slightly overwhelmed by the possibilities. So far, I managed to verify
my website, my public key, and my GitHub identity. This way of keeping
tabs about a person using a single identifier has certainly its merits,
but supposing I were to use, say, &lt;a href="https://news.ycombinator.com"&gt;Hacker News&lt;/a&gt;,
it might not be in my interest to have that profile associated with my
public persona.&lt;/p&gt;
&lt;p&gt;Further reports about my experiences are almost certain to follow.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Tue, 28 Jul 2015 22:07:33 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/keybase.io/</guid></item><item><title>The Missile Man</title><link>https://honestmusings.wordpress.com/2015/07/28/the-missile-man/</link><description>An eagle soared in the blue sky, Unhindered and mightily he rose and fell, With the soiled humanity below his feet, Looked down upon and called him King. A glint of metal broke his reverie, Flustered he called, Who goes there?, Don&amp;#8217;t you know this kingdom belongs to me, Speak and say, Who sent thee? My father, the &amp;#8230; &lt;a class="more-link" href="https://honestmusings.wordpress.com/2015/07/28/the-missile-man/"&gt;Continue reading &lt;span class="screen-reader-text"&gt;The Missile Man&lt;/span&gt;&lt;/a&gt;</description><author>Honest Musings</author><pubDate>Tue, 28 Jul 2015 06:30:14 GMT</pubDate><guid isPermaLink="true">https://honestmusings.wordpress.com/2015/07/28/the-missile-man/</guid></item><item><title>What's your dream job?</title><link>https://june.kim/dream-job/</link><author>june.kim</author><pubDate>Tue, 28 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/dream-job/</guid></item><item><title>Golang parallelism issues causing “too many open files” error</title><link>https://purpleidea.com/blog/2015/07/27/golang-parallelism-issues-causing-too-many-open-files-error/</link><description>&lt;p&gt;I&amp;rsquo;ve been hacking in &lt;a href="https://en.wikipedia.org/wiki/Go_%28programming_language%29"&gt;golang&lt;/a&gt; for a while, but I&amp;rsquo;ll admit that I didn&amp;rsquo;t get too deep into some of the language nuances until more recently. Since some of them have started to bite me, here&amp;rsquo;s a little post-mortem of one of the problems I was having.&lt;/p&gt;
&lt;p&gt;After hacking and testing code all day, I made a seemingly innocuous change, and when running my program, I saw the following error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-fallback"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;2015/07/10 14:34:12 too many open files
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I didn&amp;rsquo;t know what I broke, but it was obviously my fault. I reverted my recent changes, but still the error persisted. Internet searches and many painful hours of debugging ensued.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 27 Jul 2015 14:39:45 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/07/27/golang-parallelism-issues-causing-too-many-open-files-error/</guid></item><item><title>A/B Testing</title><link>https://boyter.org/2015/07/ab-testing/</link><description>&lt;p&gt;A/B testing is testing the comparison of two outputs where a single unit has changed. It is commonly used when when trying to increase conversion rates for online websites. Also known as split testing an example would be trying to increase user clicks on a specific button on a website. You may have a theory that red buttons work better then green. You would try out both against real users and see which one performs better.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 27 Jul 2015 11:11:59 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/ab-testing/</guid></item><item><title>Firewalld blocking snmp and fixing it (with Ansible)</title><link>https://www.zufallsheld.de/2015/07/27/firewalld-snmp-ansible/</link><description>&lt;p&gt;Some time ago I had to use a new CentOS 7 virtual-machine for some things that aren&amp;#8217;t relevant to this post.
This machine had to run all the time but also had some problems with a sporadically failing application server. That&amp;#8217;s why I decided to monitor the machine …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Mon, 27 Jul 2015 11:00:00 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2015/07/27/firewalld-snmp-ansible/</guid></item><item><title>Al Jazeera Interview with Matt Crampton</title><link>https://www.mattcrampton.com/blog/aljazeera_interview/</link><description>Al Jazeera Interview On July 27th, 2015 I spoke with Al Jazeera about the Gig economy and trends for millenials and companies.</description><author>MattCrampton.com</author><pubDate>Mon, 27 Jul 2015 08:00:00 GMT</pubDate><guid isPermaLink="true">https://www.mattcrampton.com/blog/aljazeera_interview/</guid></item><item><title>Past, present and future</title><link>https://june.kim/time/</link><author>june.kim</author><pubDate>Mon, 27 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/time/</guid></item><item><title>angular-fng library - Improving the performance of large apps</title><link>https://adamcraven.com/writing/increasing-performance-on-large-angular-apps/</link><description>How to avoid root scope digests using faster angular events, which mimic the functionality of the existing ng-event directives, but have a feature that allows them to be called in a desired scope, rather than trigger a root scope digest.</description><author>Writing on Adam Craven</author><pubDate>Mon, 27 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://adamcraven.com/writing/increasing-performance-on-large-angular-apps/</guid></item><item><title>A guide to analyst relations for startups</title><link>/2015/07/25/A-guide-to-analyst-relations-for-startups/</link><description>&lt;p&gt;When it comes to go to market and marketing there&amp;rsquo;s lots of pieces in a toolchest that all work together. One that comes a bit later, but if used properly (much like a &lt;a href="/2015/07/21/An-intro-PR-guide-for-startups/"&gt;PR agency&lt;/a&gt;) can be valuable is industry analysts. And while working with a PR agency can quickly start to become clear. How to work with analysts so it is productive on both sides can take a bit longer to figure out, or at least it did for me. Even before you do start working with them there&amp;rsquo;s the question of if or when should you. Here&amp;rsquo;s hoping this primer makes it a bit faster and easier for others.&lt;/p&gt;
&lt;h3 id="what-is-an-analyst"&gt;
&lt;div&gt;
What is an analyst
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Apologies to all analysts, but of all parts of this post I might butcher this one&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Analysts talk to a lot of companies, both the ones making products as well as the ones purchasing them. I&amp;rsquo;m not actually sure what the spread is I&amp;rsquo;d guess 80-20. A large output of this and other activities is creating various reports and rankings. Gartner&amp;rsquo;s Magic Quadrant is probably the most well known industry ranking. Much of what they create isn&amp;rsquo;t freely available for consumption so you likely don&amp;rsquo;t see the sheer volume of insights they put out.&lt;/p&gt;
&lt;h3 id="why-would-you-engage-with-an-analyst"&gt;
&lt;div&gt;
Why would you engage with an analyst
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;So what do they do for you? There’s really two major buckets:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Help with sales/marketing&lt;/strong&gt; - Given they&amp;rsquo;re informing and influencing buying decisions of businesses they can be one more person on your side. If a launch in Techcrunch makes business foo aware of product bar, then an analyst report or ranking can help sway a decision on whether to try bar vs. baz.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Consulting&lt;/strong&gt; - The other major opportunity is for the analyst to give some form of guidance. In a larger company when you already have an established product they should absolutely be part of your launch process (more on that in a future post). They&amp;rsquo;re actively following your market and space, hopefully just as you are to some extent. They can offer an outside perspective and help with broad areas of focus and messaging.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;More&lt;/em&gt; - In reality it’s as clean cut as above. They may be able to introduce you to good candidates for hiring. They may be able to introduce you to a large company interested in acquiring some capability which you have. They may be able to connect you with investors. All of these things can and do happen, but the above buckets typically are the primary drivers.&lt;/p&gt;
&lt;h3 id="when"&gt;
&lt;div&gt;
When?
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;First, engaging with analysts should always come after you have some confidence in the product, after you&amp;rsquo;ve started some marketing drumbeat, and after sales. In short don&amp;rsquo;t be in a huge rush here, you&amp;rsquo;ll get there, but don&amp;rsquo;t be in too big of a rush. As you start to get some attention and momentum it&amp;rsquo;s just as likely they&amp;rsquo;ll engage with you first as you reaching out. Also, marketing != sales, more on that in a future post.&lt;/p&gt;
&lt;p&gt;But, let&amp;rsquo;s assume you&amp;rsquo;ve got a product &lt;strong&gt;which targets business&lt;/strong&gt; (&lt;em&gt;Analysts aren&amp;rsquo;t just for tech companies, though you’ll see the benefit here sooner if you’re say a database company than a HR product&lt;/em&gt;). Let’s also assume you&amp;rsquo;ve got some sales and have some &lt;a href="/2015/07/21/An-intro-PR-guide-for-startups/"&gt;good launches under your belt&lt;/a&gt;. As it starts to come up in sales calls if you&amp;rsquo;re in any industry reports or rankings that may be an indicator, if you&amp;rsquo;re hearing about other competitors having more validation in such reports. As a general rule of thumb once you&amp;rsquo;ve got inhouse PR they should be able to help guide and steer to the right time.&lt;/p&gt;
&lt;h3 id="so-how-do-you-engage-with-an-analyst"&gt;
&lt;div&gt;
So how do you engage with an analyst
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re engaging in some form of report or article, that should start to be pretty self explanatory. They&amp;rsquo;ll send you a questionnaire, you fill it out. You go back and forth a little bit.&lt;/p&gt;
&lt;p&gt;However, the majority of my interactions aren&amp;rsquo;t on those articles and reports, for ever one time I fill out lots of questions to help some report or ranking I have 20 calls with an analyst.&lt;/p&gt;
&lt;p&gt;There are two primary calls you can have, an inquiry and a briefing.&lt;/p&gt;
&lt;h4 id="inquiries"&gt;
&lt;div&gt;
Inquiries
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Inquiry is just a fancy word for consulting call. An inquiry you will always be paying for.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A small detour here. The regularity and consistency in which you engage with an analyst makes a difference. They&amp;rsquo;re also people at the end of the day, so while firms have certain styles it&amp;rsquo;s even further multiplied by being very people driven. In your interactions you&amp;rsquo;ll have a different rapport with different people, it&amp;rsquo;s at a minimum important to be aware of this.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So back to an inquiry. Within an inquiry your goal is to pull back the curtain and give some backstage insights into what you&amp;rsquo;re doing and where you&amp;rsquo;re headed. This is typically under NDA and trust the NDA of an analyst. It&amp;rsquo;s worthwhile to be as candid as you can here, yes it feels weird, but you&amp;rsquo;ll get the most value. They&amp;rsquo;re not like that of a reporter looking for a scoop (not that you can&amp;rsquo;t trust reporters, just know if you say it, it&amp;rsquo;s on record). You don&amp;rsquo;t have to relish the entire call to one area, but areas of coverage are often:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upcoming products and major releases you’re working on&lt;/li&gt;
&lt;li&gt;Broader strategy and roadmap&lt;/li&gt;
&lt;li&gt;Get input on what they&amp;rsquo;re seeing and hearing from customers&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="briefings"&gt;
&lt;div&gt;
Briefings
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;The other type of call we have is a briefing. This is a little similar to that of a press briefing. You&amp;rsquo;ll get on the call, and walk through some upcoming launch or just give an update on your company and progress. The latter is more common if they&amp;rsquo;re unfamiliar with you or your product.&lt;/p&gt;
&lt;p&gt;Analyst briefings are good to do earlier than your press briefings, compared to press they&amp;rsquo;re like a bike with training wheels. It&amp;rsquo;s best if you still maintain your balance–the ride will be smoother, but there&amp;rsquo;s a little less risk of completely toppling over. One key difference is you often have a powerpoint deck you get to walk through during an analyst briefing. I&amp;rsquo;ve found this is helpful for pacing and key messages, I used to be skeptical, but now very much feel it&amp;rsquo;s always worth doing.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pro-tip: You can create a deck and use it for press too, no they won&amp;rsquo;t want to get on a gotomeeting, but you can send it over so they have more content later. BUT, more importantly you can also walk through it on your own screen if it helps with pacing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Within a briefing you&amp;rsquo;ll have some ability to ask them questions at points. Does this resonate? Are you hearing similar? What are you seeing in the market? Don&amp;rsquo;t turn it into an inquiry, but knowing the parts that hit home for them allow you to refine your pitch for the next call.&lt;/p&gt;
&lt;h4 id="engaging---the-tactical-parts"&gt;
&lt;div&gt;
Engaging - the tactical parts
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;&amp;ldquo;Analysts are pretty much paid to talk and write&amp;rdquo; - &lt;a href="http://www.twitter.com/cote"&gt;@cote&lt;/a&gt;. So expect that often when you occupy their time there&amp;rsquo;s a price to it. In terms of finding them it should be pretty easy, to know the list of ones in your space, you may see them quoted or reference in various media outlets. You may just naturally crop up in a report.&lt;/p&gt;
&lt;p&gt;If you create a regular relationship with them you&amp;rsquo;ll have some contract of hours over the course of a quarter or year. At an early stage company this is often owned and manage by whomever runs your PR from an internal perspective.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;
&lt;div&gt;
Conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re about to engage with analysts for the first time or haven’t figured out how to get the most out of your interactions I hope the broad overview is helpful. If there&amp;rsquo;s some glaring parts you feel I&amp;rsquo;ve missed let me know &lt;a href="http://www.twitter.com/craigkerstiens"&gt;@craigkerstiens&lt;/a&gt;. And for further reading/watching I’d encourage checking out the great talk from &lt;a href="http://www.twitter.com/cote"&gt;@cote&lt;/a&gt; in the &lt;a href="http://www.heavybit.com/library/video/2014-01-21-michael-cote"&gt;Heavybit library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As far as take-aways and a recap:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Don&amp;rsquo;t be too eager to jump in with analysts. They can absolutely provide value, but you have to put some time in before it really starts to pay off. It&amp;rsquo;s not an overnight change and takes building a rapport with them.&lt;/li&gt;
&lt;li&gt;At the same time, analysts can be useful in many B2B areas not just tech ones.&lt;/li&gt;
&lt;li&gt;When in an inquiry be open and as transparent as possible.&lt;/li&gt;
&lt;li&gt;Powerpoint/Keynote/Google presentations are useful in briefings, even if it&amp;rsquo;s just for you to follow along.&lt;/li&gt;
&lt;/ol&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Sat, 25 Jul 2015 23:55:56 GMT</pubDate><guid isPermaLink="true">/2015/07/25/A-guide-to-analyst-relations-for-startups/</guid></item><item><title>SnailLife messaging system</title><link>https://liza.io/snaillife-messaging-system/</link><description>&lt;p&gt;&amp;ldquo;What&amp;rsquo;s SnailLife&amp;rdquo;, you say? Well I&amp;rsquo;m glad you asked! My snail simulation has gone through a couple of names&amp;hellip;and even though I was never 100% happy with Gastropoda it was the best I could come up with - a name that was unique and didn&amp;rsquo;t allow the project to sound too &amp;ldquo;gamey&amp;rdquo; (because it&amp;rsquo;s not a game). All of the cooler names I could come up with weren&amp;rsquo;t suitable for various reasons (like domain name availability and such).&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 25 Jul 2015 23:43:17 GMT</pubDate><guid isPermaLink="true">https://liza.io/snaillife-messaging-system/</guid></item><item><title>Time Lapse</title><link>https://olshansky.info/movie/time_lapse/</link><description>Olshansky's review of Time Lapse</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 25 Jul 2015 16:26:44 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/time_lapse/</guid></item><item><title>Piece by Piece</title><link>https://josh.works/growth/2015/07/25/2015-7-25-piece-by-piece/</link><description>&lt;p&gt;The following is inspired by 
&lt;a href="https://unicornfree.com/"&gt;Amy Hoy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’ve got a secret to share: I’m working on building a product (of the digital variety) that will be 
so damn goodpeople will pay me $100 or more to get it. &lt;/p&gt;

&lt;p&gt;I’ve got a lot of bits and pieces of it littered around the internet, my computer, and my head. If you want a sneak peak at an earlier (unsuccessful) stab at this, click over to 
&lt;a href="http://www.belaybetter.com/"&gt;www.belaybetter.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There you can buy a PDF for about $20, if you wanted to, to read about 25 pages of my thoughts and ideas on dealing with fear while lead climbing. I’ve sold a few copies (maybe eight?) over the last eighteen months
.So, the ROI on the time invested in that particular product is hovering not much over $1/hr. &lt;/p&gt;

&lt;p&gt;The path to get from here to there is daunting:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;What is “there”? I’ve got it loosely defined, but need to tighten that up)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I need a way better 
product.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Do I need to add “services” to the product?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;If so, what are those? Videos, an hour or two of my time via Skype&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How do I know when I’ve reached a product that is good enough&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Assuming I’ve got something good enough, I still need to build a much better landing page.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;And I probably need an email drip campaign to build trust with subscribers.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Subscribers. Where do I get them? Reddit? Guest posts?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Guest posts. I need to write to the owners of well-trafficked and run some of the stuff I’ve made by them to see what they thing/ways I can make it better.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I need a list of potential authors to reach out to. &lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But guess what? Every one of those steps is doable. By 
me. I just need to sit down and start chewing through them. Some of it involves thinking, some of it involves writing, and some of it involves emailing. There’s nothing more complicated than that. &lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sat, 25 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/growth/2015/07/25/2015-7-25-piece-by-piece/</guid></item><item><title>Private Social Network</title><link>https://mxuribe.com/posts/private-social-network/</link><description>&lt;p&gt;Some benefits of a private social network&lt;/p&gt;</description><author>Mauricio Uribe | m.x.uribe</author><pubDate>Fri, 24 Jul 2015 07:00:00 GMT</pubDate><guid isPermaLink="true">https://mxuribe.com/posts/private-social-network/</guid></item><item><title>iSCSI Benchmarking</title><link>https://smcleod.net/2015/07/iscsi-benchmarking/</link><description>&lt;p&gt;The following are benchmarks from our testings of our iSCSI SSD storage.&lt;/p&gt;
&lt;h3 id="67300-read-iops-on-a-vm-on-iscsi"&gt;67,300 read IOP/s on a VM on iSCSI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;(Disk -&amp;gt; LVM -&amp;gt; MDADM -&amp;gt; DRBD -&amp;gt; iSCSI target -&amp;gt; Network -&amp;gt; XenServer iSCSI Client -&amp;gt; VM)&lt;/li&gt;
&lt;li&gt;Per VM and scales to 1,000,000 IOP/s total&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@dev-samm:/mnt/pmt1 &lt;span class="m"&gt;128&lt;/span&gt; &lt;span class="c1"&gt;# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=4k --iodepth=128 --size=2G --readwrite=read&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;test: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;read, &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4K-4K/4K-4K, &lt;span class="nv"&gt;ioengine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libaio, &lt;span class="nv"&gt;iodepth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;128&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2.0.8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Starting &lt;span class="m"&gt;1&lt;/span&gt; process
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bs: &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;R&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;55.6% &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;262.1M/0K /s&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;67.3K/0  iops&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;eta 00m:04s&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="38500-random-4k-write-iops-on-a-vm-on-iscsi"&gt;38,500 random 4k write IOP/s on a VM on iSCSI&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;(Disk -&amp;gt; LVM -&amp;gt; MDADM -&amp;gt; DRBD -&amp;gt; iSCSI target -&amp;gt; Network -&amp;gt; XenServer iSCSI Client -&amp;gt; VM)&lt;/li&gt;
&lt;li&gt;Per VM and scales to 700,000 IOP/s total&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@dev-samm:/mnt/pmt1 &lt;span class="c1"&gt;# fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=4k --iodepth=128 --size=2G --readwrite=randwrite&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;test: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;g&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;randwrite, &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4K-4K/4K-4K, &lt;span class="nv"&gt;ioengine&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;libaio, &lt;span class="nv"&gt;iodepth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;128&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2.0.8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Starting &lt;span class="m"&gt;1&lt;/span&gt; process
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bs: &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;w&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;26.3% &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;0K/150.2M /s&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; /38.5K iops&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;eta 00m:14s&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="raw-device-latency-on-storage-units"&gt;Raw device latency on storage units&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Intel DC3600 1.2T PCIe NVMe&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@s1-san6:/proc  &lt;span class="c1"&gt;# ioping /dev/nvme0n1p1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/nvme0n1p1 &lt;span class="o"&gt;(&lt;/span&gt;device 1.1 TiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;104&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/nvme0n1p1 &lt;span class="o"&gt;(&lt;/span&gt;device 1.1 TiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;83&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/nvme0n1p1 &lt;span class="o"&gt;(&lt;/span&gt;device 1.1 TiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;51&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/nvme0n1p1 &lt;span class="o"&gt;(&lt;/span&gt;device 1.1 TiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;71&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;SanDisk SDSSDXPS960G SATA&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@pm-san5:/proc  &lt;span class="c1"&gt;# ioping /dev/sdc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdc &lt;span class="o"&gt;(&lt;/span&gt;device 894.3 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.2 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdc &lt;span class="o"&gt;(&lt;/span&gt;device 894.3 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.1 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdc &lt;span class="o"&gt;(&lt;/span&gt;device 894.3 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.1 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdc &lt;span class="o"&gt;(&lt;/span&gt;device 894.3 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.1 ms
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Micron_M600_MTFDDAK1T0MBF SATA&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@pm-san5:/proc  &lt;span class="c1"&gt;# ioping /dev/sdf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdf &lt;span class="o"&gt;(&lt;/span&gt;device 953.9 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;157&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdf &lt;span class="o"&gt;(&lt;/span&gt;device 953.9 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;190&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdf &lt;span class="o"&gt;(&lt;/span&gt;device 953.9 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;65&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4.0 KiB from /dev/sdf &lt;span class="o"&gt;(&lt;/span&gt;device 953.9 GiB&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;181&lt;/span&gt; us
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;```&lt;/span&gt;shell
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## Latency on the a VM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="o"&gt;(&lt;/span&gt;Disk -&amp;gt; LVM -&amp;gt; MDADM -&amp;gt; DRBD -&amp;gt; iSCSI target -&amp;gt; Network -&amp;gt; XenServer iSCSI Client -&amp;gt; VM&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;```&lt;/span&gt;shell
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@dev-samm:/mnt &lt;span class="m"&gt;127&lt;/span&gt; &lt;span class="c1"&gt;# ioping pmt1/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt1/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdb1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.6 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt1/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdb1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.7 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt1/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdb1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.7 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--- pmt1/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdb1&lt;span class="o"&gt;)&lt;/span&gt; ioping statistics ---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt; requests completed in 2159.1 ms, &lt;span class="m"&gt;1508&lt;/span&gt; iops, 5.9 mb/s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;min/avg/max/mdev &lt;span class="o"&gt;=&lt;/span&gt; 0.6/0.7/0.7/0.1 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@dev-samm:/mnt  &lt;span class="c1"&gt;# ioping pmt2/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt2/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdc1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.6 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt2/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdc1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.8 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--- pmt2/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvdc1&lt;span class="o"&gt;)&lt;/span&gt; ioping statistics ---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt; requests completed in 1658.4 ms, &lt;span class="m"&gt;1470&lt;/span&gt; iops, 5.7 mb/s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;min/avg/max/mdev &lt;span class="o"&gt;=&lt;/span&gt; 0.6/0.7/0.8/0.1 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@dev-samm:/mnt  &lt;span class="c1"&gt;# ioping pmt3/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt3/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvde1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.6 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt3/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvde1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.9 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4096&lt;/span&gt; bytes from pmt3/ &lt;span class="o"&gt;(&lt;/span&gt;ext4 /dev/xvde1&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.9 ms
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://smcleod.net/images/san/lcmcpcmk.png" /&gt;&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Fri, 24 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/07/iscsi-benchmarking/</guid></item><item><title>Git archive with submodules and tar magic</title><link>https://purpleidea.com/blog/2015/07/23/git-archive-with-submodules-and-tar-magic/</link><description>&lt;p&gt;&lt;a href="https://git-scm.com/book/en/v2/Git-Tools-Submodules"&gt;Git submodules&lt;/a&gt; are actually a very beautiful thing. You might prefer the word powerful or elegant, but that&amp;rsquo;s not the point. The downside is that they are sometimes misused, so as always, use with care. I&amp;rsquo;ve used them in projects like &lt;a href="https://github.com/purpleidea/puppet-gluster"&gt;puppet-gluster&lt;/a&gt;, &lt;a href="https://github.com/purpleidea/oh-my-vagrant"&gt;oh-my-vagrant&lt;/a&gt;, and others. If you&amp;rsquo;re not familiar with them, do a bit of reading and come back later, I&amp;rsquo;ll wait.&lt;/p&gt;
&lt;p&gt;I recently did some work &lt;a href="https://purpleidea.com/blog/2015/07/08/oh-my-vagrant-mainstream-mode-and-copr-rpms/"&gt;packaging Oh-My-Vagrant as RPM&amp;rsquo;s&lt;/a&gt;. My primary goal was to make sure the entire process was automatic, as I have no patience for manually building RPM&amp;rsquo;s. Any good packager knows that the pre-requisite for building a SRPM is a source tarball, and I wanted to build those automatically too.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Thu, 23 Jul 2015 23:32:27 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/07/23/git-archive-with-submodules-and-tar-magic/</guid></item><item><title>Add site-specific browsers to your workflow</title><link>https://xenodium.com/add-site-specific-browsers-to-your-workflow</link><description>&lt;p&gt;There are three browser tabs continously used in my workflow: GMail, Google Calendar, and Google Play Music. I normally have many more tabs open, but these three I access periodically. As the number of open tabs increases, and I fail to cleanup, getting back to my usual three gets a little trickier.&lt;/p&gt;
&lt;p&gt;So far, I've kept each of these services open in separate windows. But that doesn't always work. Click on any link in your inbox and you're back to playing cleanup. This is where &lt;a href="https://en.wikipedia.org/wiki/Site-specific_browser"&gt;site-specific browsers&lt;/a&gt; (SSB) can help.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/dmarmor/epichrome"&gt;Epichrome&lt;/a&gt; enables you to build Chrome-based SSBs (on Mac OSX). Build an SSB for the usual suspects and easily jump to them using the app switcher.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/add-site-specific-browsers-to-your-workflow/switcher-small.png" /&gt;&lt;/p&gt;
&lt;p&gt;More at &lt;a href="https://github.com/dmarmor/osx-chrome-ssb-gui/"&gt;OSX Chrome SSB&lt;/a&gt; and &lt;a href="http://www.quora.com/Is-there-a-way-to-use-Chrome-as-a-site-specific-browser"&gt;Quora thread&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;UPDATE: Enable the Chrome extension to open URLs in default browser.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/add-site-specific-browsers-to-your-workflow/helper.png" /&gt;&lt;/p&gt;
&lt;p&gt;And choose the default browser to open URLs.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/add-site-specific-browsers-to-your-workflow/default.png" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 23 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/add-site-specific-browsers-to-your-workflow</guid></item><item><title>Type. Publish. Done.</title><link>https://josh.works/type-publish-done</link><description>&lt;p&gt;Yesterday I read &lt;a href="http://www.bothsidesofthetable.com/2015/07/14/how-the-hell-do-i-prioritize-work-blog-find-balance/"&gt;How the Hell do I Prioritize Work, Blog &amp;amp; Find Balance.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The author of the letter is a busy, accomplished guy and still manages to write regularly. &lt;/p&gt;

&lt;p&gt;He said, in short:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I sit down, and I write. I’ve done it a lot, so I’m not bad at it. I don’t often proof read my stuff, I make grammar and spelling errors, and what I publish is not polished, refined.&lt;/p&gt;

  &lt;p&gt;I’ve been doing it for long enough that I can crank out posts quickly. I don’t worry about typos. I don’t worry about sounding too smart. I don’t worry about every post becoming part of the national treasures. I just write. Usually single sitting. No editing. Hit publish. Sayonara&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I like that style. “Single Take”. Spill what’s on your mind and hit publish.&lt;/p&gt;

&lt;p&gt;I get caught up in editing, making things be just right, putting out “amazing content” that I just write literally nothing. Nothing at all.&lt;/p&gt;

&lt;p&gt;There are times and places for great content, but this is not it. I don’t need a great banner image. (Cropped to look great full-width, of course, and something with text over it to look good for social media sites…)&lt;/p&gt;

&lt;p&gt;Is money changing hands? (Or are you hoping to convince someone to buy something?) Great, do a round of editing. Make sure that what you are talking about is resonating. But this is not that.&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Wed, 22 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/type-publish-done</guid></item><item><title>A Quick Look into Stamp Duties &amp;amp; Land Taxes</title><link>https://lukesingham.com/a-look-into-land-taxes/</link><description>&lt;h3 id="stamp-duties"&gt;Stamp Duties &lt;a class="direct-link" href="https://lukesingham.com/a-look-into-land-taxes/#stamp-duties"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Stamp duties are a transaction tax. Prior to the digital era, the transfer of legal ownership presented a convenient time for governments to levy a tax. Upon the transfer of ownership a stamp duty was paid and the relevant transfer of ownership document was either stamped...&lt;br /&gt;
&lt;img alt="stamp-duty-stamped" src="https://www.ozrevenues.com/Revenue-Railway-Local-Perfin-Catalogue/nsw-revs/202.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Or a stamp was affixed...&lt;br /&gt;
&lt;img alt="stamp-duty-stamp" src="https://lukesingham.com/content/images/2017/08/stamp-duty-stamp-affixed.jpeg" /&gt;&lt;/p&gt;
&lt;p&gt;Nowadays, most Australians recognise stamp duties as the tax paid upon the purchase of a property. For example, in NSW the rate of stamp duty ranges from 1.25% to 7%.&lt;/p&gt;
&lt;p&gt;&lt;img alt="nsw-stamp-duty-rates" src="https://lukesingham.com/content/images/2015/07/Screen-Shot-2015-07-17-at-10-59-47-am.png" /&gt;Source: &lt;a href="http://www.osr.nsw.gov.au/taxes/transfer-land/about"&gt;osr.nsw.gov.au&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="land-value-tax"&gt;Land Value Tax &lt;a class="direct-link" href="https://lukesingham.com/a-look-into-land-taxes/#land-value-tax"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A popular alternative, or at least with economists, is that of a Land Value Tax (LVT). Despite the idea having been argued for since &lt;a href="https://en.wikipedia.org/wiki/Adam_Smith"&gt;Adam Smith&lt;/a&gt;, the idea is most strongly associated with &lt;a href="https://en.wikipedia.org/wiki/Henry_George"&gt;Henry George&lt;/a&gt; who famously argued in his best selling book &lt;a href="https://en.wikipedia.org/wiki/Progress_and_Poverty"&gt;&lt;em&gt;Progress and Poverty&lt;/em&gt;&lt;/a&gt; for an LVT to replace all other inefficient taxes.&lt;/p&gt;
&lt;p&gt;The crux of the argument is that since land is fixed (as opposed to say the supply of labour or level of consumption) disincentives or &lt;em&gt;distortionary&lt;/em&gt; effects of land taxes are not applicable. On the other hand, a stamp duty causes a distortion to the property market by disincentivising transactions. Logically, stamp duties decrease the propensity of someone to move, thus reducing labour mobility. Those individuals who have to relocate often pay more in stamp duties, which unless there was some reason to discourage people from moving, is inequitable. The &lt;a href="http://taxreview.treasury.gov.au/content/finalreport.aspx?doc=html/publications/papers/final_report_part_1/chapter_6.htm"&gt;Treasury's graphs&lt;/a&gt; below show the shape of the effective tax rate of a stamp duty over years of occupancy. The panel B graph shows the impacts of several moves resulting in a much higher effective tax rate. A flat rate shows the effect of a land tax (flat rate).&lt;/p&gt;
&lt;p&gt;&lt;img alt="effective-tax-rate-stamp-duty" src="https://lukesingham.com/content/images/2015/07/Screen-Shot-2015-07-19-at-11-56-38-am.png" /&gt;&lt;/p&gt;
&lt;p&gt;By replacing stamp duties with an annually payable LVT land hoarding behaviour would be heavily discouraged. Governments would stand to benefit as stamp duty revenue fluctuates with the property market, whereas a land value tax would provide a steady annual revenue changing only when land values are revised.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://taxreview.treasury.gov.au/content/finalreport.aspx?doc=html/publications/papers/final_report_part_1/chapter_6.htm"&gt;Henry Review&lt;/a&gt; makes several important points in considering a land tax:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A land tax could encompass all property types such that the use of land is more likely to go that which is most productive, whether that be commercial, residential or industrial.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tax-free thresholds could apply to exempt low value land. Particularly of benefit to agricultural land holders.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Different rates of land tax could be constructed in a progressive manner. Much like the increasing rates of income tax or stamp duty seen above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replacing stamp duty with land tax would remove the supply impediments caused by the tax system. However, the tax system itself is not the major source of supply constraints.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Currently land tax policy exempts owner-occupied housing, removing 60% of land by value from the potential revenue base.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To avoid double taxation of those who have already paid stamp duty, the tax could be introduced by only applying to new transfers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://grattan.edu.au/wp-content/uploads/2014/04/Game_Changers_Web.pdf"&gt;The Grattan Institute estimated in 2012&lt;/a&gt; that replacing stamp duty with a land tax would increase GDP by $25 billion. Other &lt;a href="http://www.ahuri.edu.au/downloads/publications/EvRevReports/AHURI_Final_Report_No182_The_spatial_and_distributional_impacts_of_the_Henry_Review_recommendations_on_stamp_duty_and_land_tax.pdf"&gt;research based on Melbourne house prices&lt;/a&gt; suggested that the introduction of a land tax would decrease average house prices by 5% and would have a greater reduction on inner CDB house prices with up to 12% reductions.&lt;/p&gt;
&lt;p&gt;One potential issue with the introduction of the policy is the impact it would have on the asset rich but income poor i.e. pensioners. However, as &lt;a href="http://www.abc.net.au/news/2013-02-01/janda-stamping-out-inefficient-duties/4496356"&gt;Michael Janda points out:&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;... it would be very simple for state governments to allow such people to defer their land tax payments, which would be indexed at a suitable rate and only fall due when the property next changed hands. Thus the land tax bill could be automatically deducted from the sale proceeds of the property when it was eventually sold.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Another administrative consideration is the difficulty in valuing land. However as &lt;a href="http://www.economist.com/blogs/economist-explains/2014/11/economist-explains-0"&gt;the Economist points out&lt;/a&gt;, &amp;quot;&lt;em&gt;the efficiency of the tax does not depend on accurate valuations.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The biggest issue is political...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;People don't like paying taxes. The issue with a land tax is that it is hard to avoid and an annually payable (or annually painful). It would be very easy to politically tar such a economically sound policy, as the &lt;em&gt;great big new tax grab&lt;/em&gt;. This hasn't stopped up to &lt;a href="http://www.elibrary.imf.org/view/IMF001/20531-9781484369050/20531-9781484369050/20531-9781484369050.xml"&gt;twenty countries having implemented or are considering&lt;/a&gt; implementing the policy at some level.&lt;/p&gt;
&lt;p&gt;In Australia, the ACT introduced a land tax three years ago to replace stamp duties. This year, the South Australian government has removed stamp duties on business transfers and &lt;a href="http://www.afr.com/news/sa-budget-2015-stamp-duty-on-commercial-property-to-go-20150618-ghqt4d"&gt;will remove stamp duties on commercial property transfers in 2016&lt;/a&gt;. However, they have backed down on their &lt;a href="http://www.abc.net.au/news/2015-02-11/sa-government-releases-discussion-paper-on-tax-system/6085352"&gt;suggestion earlier this year&lt;/a&gt; of replacing stamp duties with a land tax on residential properties for political reasons.&lt;/p&gt;
&lt;p&gt;There are of course bodies such as the &lt;a href="http://www.udia.com.au/"&gt;Urban Development Institute of Australia (UDIA)&lt;/a&gt; and the &lt;a href="http://www.propertyoz.com.au/"&gt;Property Council&lt;/a&gt; who would stand to gain from a tax change that would increase property market activity. Active engagement of such bodies along with public education would be necessary for a government wanting to minimise political fallout.&lt;/p&gt;
&lt;p&gt;For now it remains the economist's consensus and the politician's discord.&lt;/p&gt;</description><author>Luke Singham</author><pubDate>Wed, 22 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://lukesingham.com/a-look-into-land-taxes/</guid></item><item><title>Generating Read Models with Event Sourcing</title><link>https://daniellittle.dev/generating-read-models-with-event-sourcing</link><description>Event sourcing is a very powerful tool that allows you to capture information you didn't even know you wanted. One of the things you usually…</description><author>Daniel Little Dev</author><pubDate>Wed, 22 Jul 2015 01:28:00 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/generating-read-models-with-event-sourcing</guid></item><item><title>A guide to PR for startups</title><link>/2015/07/21/An-intro-PR-guide-for-startups/</link><description>&lt;p&gt;You&amp;rsquo;ve built your product and you&amp;rsquo;re now ready for your first major launch. Or you&amp;rsquo;ve been through a launch or two, but are looking to scale the process as you&amp;rsquo;re doing more launches and announcements. You really have two options: do it &lt;a href="http://jasonlbaptiste.com/featured-articles/how-i-pitched-techcrunch-and-13-ways-to-get-press-when-you-launch-your-startup/"&gt;all on your own&lt;/a&gt;, or work with a PR agency. One frequent crossroad is that you&amp;rsquo;re not at the point of a full time PR person, but unsure what a PR agency can offer you; and, further what&amp;rsquo;s the best way to work with them so you&amp;rsquo;re getting the maximum value.&lt;/p&gt;
&lt;p&gt;As I&amp;rsquo;ve talked to more startups lately, it&amp;rsquo;s become clear that effectively working with PR teams and the media is mostly learned by doing. Because there&amp;rsquo;s not much guidance out there, here&amp;rsquo;s an attempt at some basic guidelines.&lt;/p&gt;
&lt;h3 id="on-pr"&gt;
&lt;div&gt;
On PR
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;First there&amp;rsquo;s two types here and they&amp;rsquo;re not mutually exclusive. In-house PR is a full time person or team that works within your company, here you&amp;rsquo;ll often have a pretty different experience. From my experience, in-house PR people tend to understand a company message and vision because they are living and breathing your company values every day.&lt;/p&gt;
&lt;p&gt;The other alternative is hiring a PR agency. An agency will have several (sometimes hundreds!) of clients. The relationship that you’ll have with an agency is much different than in-house. You&amp;rsquo;ll use them just like you would a consultant or contractor. Most startups end up with the agency approach first, because of the perception of “more people working for a cheaper cost than hiring in-house.” However, it&amp;rsquo;s of note an agency doesn&amp;rsquo;t alleviate you of doing work, nor should you want them to handle all parts of it.&lt;/p&gt;
&lt;h4 id="messaging"&gt;
&lt;div&gt;
Messaging
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;An agency may offer to help with messaging, but take this somewhat lightly. I don&amp;rsquo;t doubt that some are very good at it, but in most cases I&amp;rsquo;ve found they don&amp;rsquo;t have the same amount of customer interaction as you as a founder or early employee would. Further, your vision of impact to the market and direction may be more distant than theirs. You should expect to own your messaging, just like you own your product.&lt;/p&gt;
&lt;p&gt;Where they can heavily help is providing a lot of structured frameworks for helping you get to your messaging. Some pretty basic templates of standard questions for customers and partners can go along way in helping you actually uncover what they feel your value is.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;On your key messaging/value prop, there&amp;rsquo;s two pieces I&amp;rsquo;ll drop in here. While I&amp;rsquo;d love to write another long post on it, I wonder when I&amp;rsquo;ll actually get it out. So the first is pitch the problem you&amp;rsquo;re trying to solve–&lt;a href="http://500hats.typepad.com/500blogs/2009/08/your-solution-is-not-my-problem.html"&gt;Dave McClure&lt;/a&gt; talks about this as well as anyone. The second is don&amp;rsquo;t pitch features, pitch the use cases and solutions. Pitch what&amp;rsquo;s possible&lt;/em&gt;&lt;/p&gt;
&lt;h4 id="pitching"&gt;
&lt;div&gt;
Pitching
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;This is the number one area I&amp;rsquo;ve found that having PR makes a huge difference. In the world of reporting, different reporters have different beats (areas of coverage), styles, outreach preferences, and most importantly, different relationships with companies and people. Knowing &lt;em&gt;all&lt;/em&gt; of this and how to pitch a story to them is key. Yes you can spend hours researching and creating a perfect story just for them, and do that again, and again and hopefully land some coverage. But I&amp;rsquo;d argue a bit: that&amp;rsquo;s not the best use of your time.&lt;/p&gt;
&lt;p&gt;With a good PR person or agency you&amp;rsquo;ll be able to strike a mix of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Here&amp;rsquo;s the outlets I want to be in and why (have a good reason for why).&lt;/li&gt;
&lt;li&gt;Understanding the audience and readership.&lt;/li&gt;
&lt;li&gt;What outlets you feel like your key customers are reading, and validate this with the agency.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From there, if you&amp;rsquo;ve found a good agency they already have relationships with your key journalists / publications. So if you have a compelling product, you just need to give them the right messaging of the particular launch or news.&lt;/p&gt;
&lt;h4 id="what-else-to-expect-from-your-agency"&gt;
&lt;div&gt;
What else to expect from your agency
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;A surprise for some is how the whole process works. The agency is going to be there on the phone with you. You&amp;rsquo;re not going to hang out over beers while pitching being chummy. The reporter is listening to multiple other pitches, it&amp;rsquo;s likely they had one right before you and right after. The agency is there listening, helping keep time and track of conversation for reporter fact-checking after the interview.&lt;/p&gt;
&lt;p&gt;Hopefully they&amp;rsquo;re also keeping notes. They should be able to provide you with some high level notes of what message resonated with each reporter and what didn&amp;rsquo;t, what you covered, and what they asked. This is especially useful for future interactions.&lt;/p&gt;
&lt;p&gt;Similarly you should get a briefing 1 pager ahead of time. You should be able to skim this, you don&amp;rsquo;t have to memorize. But it&amp;rsquo;ll include key things about recent articles written by the reporter, their beat, topics to dive into and ones to stay away from. If you can connect the dots, those notes from an initial call start to feed into the 1 pagers for future calls.&lt;/p&gt;
&lt;h3 id="onto-the-briefing"&gt;
&lt;div&gt;
Onto the briefing
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Of course it&amp;rsquo;s important to land the briefing in the first place, but just as important is getting it right. Coming into it, the reporter will have already gotten the high level pitch&amp;hellip; It&amp;rsquo;s why they took the call. You&amp;rsquo;ll get a mixed bag of those that are open to teeing up the opportunity to those that want to get right to the news. Roll with what they prefer, but also don&amp;rsquo;t be afraid of trying to hit some of your key points.&lt;/p&gt;
&lt;h4 id="have-your-key-messages-ready"&gt;
&lt;div&gt;
Have your key messages ready
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;Sound bites help hugely here. Analogies, customer references, whatever you want to hit. Have it ready. Also if you&amp;rsquo;ve got a great sound bite that helps tell the story, it can make the reporter&amp;rsquo;s job easier. Just don&amp;rsquo;t swing too far into happy go lucky marketing land. It’s important to remember that you’re talking to a person. Have a conversation - don’t talk at them.&lt;/p&gt;
&lt;h4 id="go-slow"&gt;
&lt;div&gt;
Go slow
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;It may seem obvious when you think about it, but as you&amp;rsquo;re talking the reporter is writing. Or at least you hope they are. Some do it by hand and type up notes late, some type right then and there. When you hear a pause it doesn&amp;rsquo;t always mean to keep going and it seldom means hurry up. Become extra comfortable with pauses. Check in if you&amp;rsquo;re going to fast, if they&amp;rsquo;re following, if they have any questions. I&amp;rsquo;ve had people bring me in a beer before because I&amp;rsquo;d had multiple cups of coffee through a few pitches, and they were trying to slow me down a bit. Know your pace, and then slow it down.&lt;/p&gt;
&lt;h4 id="questions"&gt;
&lt;div&gt;
Questions
&lt;/div&gt;
&lt;/h4&gt;
&lt;p&gt;It&amp;rsquo;s okay if they don&amp;rsquo;t have a lot of questions, they may not. They may have none at all. Yes, pause, and give them a chance, or even ask if they have any. But don&amp;rsquo;t stress too much if they have no questions.&lt;/p&gt;
&lt;p&gt;On the flip side of that - you’re PR person should have prepared a list of questions for you beforehand that the reporter could possibly throw your way. Be sure you’ve thought through and practiced all the Q&amp;amp;A scenarios before the interview so you aren’t caught off-guard when you’re in front of the reporter.&lt;/p&gt;
&lt;h3 id="in-conclusion"&gt;
&lt;div&gt;
In conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;If it&amp;rsquo;s your first go around, don&amp;rsquo;t stress too much. Have the headlines you want in your mind and key messages, or better yet write them out. &lt;em&gt;Personally I write key things on a whiteboard nice and large before I&amp;rsquo;m on the call&lt;/em&gt;. Finally once you&amp;rsquo;re all done, enjoy reading the coverage. &lt;strong&gt;But you&amp;rsquo;re not all done&lt;/strong&gt; after you get some coverage look back, run a retrospective just like you would for a software project. What worked well, why did or didn&amp;rsquo;t something work. What can you improve next time.&lt;/p&gt;
&lt;p&gt;*Full disclosure, this is based across interactions with a small sample size of different PR agencies and individuals. Mileage may differ heavily from PR firm to PR firm, but hopefully the above provides at least some roadmap for more clarity vs. flying blind. As always if you&amp;rsquo;ve got feedback/questions, feel free to let me know &lt;a href="http://www.twitter.com/craigkerstiens"&gt;@craigkerstiens&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Finally a special thanks to &lt;a href="http://www.twitter.com/pavtalk"&gt;Paul Katsen&lt;/a&gt; for much of the inspiration on creating this post and to he and &lt;a href="http://www.twitter.com"&gt;Katie Boysen&lt;/a&gt; for review&lt;/em&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Tue, 21 Jul 2015 23:55:56 GMT</pubDate><guid isPermaLink="true">/2015/07/21/An-intro-PR-guide-for-startups/</guid></item><item><title>Five ways to avoid and control flaky tests</title><link>https://boyter.org/2015/07/ways-avoid-control-flaky-tests/</link><description>&lt;p&gt;Having a reliable test suite should always be the goal in software development. After all if you can&amp;rsquo;t trust the tests then why bother running them at all? This is especially important in a shared coding environment and when running through Continuous Integration (CI).&lt;/p&gt;
&lt;p&gt;1 - Test in Isolation&lt;/p&gt;
&lt;p&gt;It may seem obvious but writing focused tests which do a single thing is one of the most effective ways to avoid them being flaky. Tests which do multiple things increases the chance for failure and can make the tests non deterministic. Always remember to test features and issues in isolation.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 21 Jul 2015 11:09:42 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/ways-avoid-control-flaky-tests/</guid></item><item><title>Delayed Serial STONITH</title><link>https://smcleod.net/2015/07/delayed-serial-stonith/</link><description>&lt;p&gt;A modified version of &lt;a href="http://www.scl.co.uk/rcd_serial/README.rcd_serial"&gt;John Sutton&amp;rsquo;s&lt;/a&gt; rcd_serial cable coupled with our Supermicro reset switch hijacker:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://smcleod.net//img/san/rcd_serial.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;This works with the rcd_serial fence agent &lt;a href="https://github.com/ClusterLabs/fence-agents/tree/master/agents/rcd_serial"&gt;plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Reasons &lt;code&gt;rcd_serial&lt;/code&gt; makes for a very good &lt;a href="https://en.wikipedia.org/wiki/STONITH"&gt;STONITH&lt;/a&gt; mechanism:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It has no dependency on power state.&lt;/li&gt;
&lt;li&gt;It has no dependency on network state.&lt;/li&gt;
&lt;li&gt;It has no dependency on node operational state.&lt;/li&gt;
&lt;li&gt;It has no dependency on external hardware.&lt;/li&gt;
&lt;li&gt;It costs less that $5 + time to build.&lt;/li&gt;
&lt;li&gt;It is incredibly simple and reliable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Essentially the most common STONITH agent type in use is probably those that control UPS / PDUs, while this sounds like a good idea in theory there are a number of issues with relying on a UPS / PDU:&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Tue, 21 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/07/delayed-serial-stonith/</guid></item><item><title>Why Does Software Contain Bugs?</title><link>https://boyter.org/2015/07/software-bugs/</link><description>&lt;p&gt;&amp;ldquo;Why does all software contain bugs?&amp;rdquo; this was a question recently asked of me. My response at the time was because all software is not perfect, but is this true?&lt;/p&gt;
&lt;p&gt;Lets take a very simple example.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    public class Hello {
        public static void main(String[] args) {
            System.out.println(&amp;quot;Hello World!&amp;quot;);
        }
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above example is arguably the simplest program that can be written using Java. It also happens to be the first program usually written by any Java programmer. It simply print outs the text &amp;ldquo;Hello World!&amp;rdquo; when it is run. Surely this program is so simple that it is perfect and therefore bug free?&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 20 Jul 2015 11:06:50 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/software-bugs/</guid></item><item><title>No such thing as "real programming"</title><link>https://www.brightball.com/articles/no-such-thing-as-real-programming</link><description>I read an article earlier today called The self-hating Web Developer that I found on Hacker News and it bothered me. It resonated with me as something that I professionally internalized over my career but it bothered me because Joseph encountered personal financial difficulty for both himself and his family due to the struggle. For that reason (and insomnia), I feel compelled to write this as reference to refer to for anybody else who may be struggling with the same thing.</description><author>Brightball Articles</author><pubDate>Mon, 20 Jul 2015 04:34:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/no-such-thing-as-real-programming</guid></item><item><title>Sardinia travel bookmarks</title><link>https://xenodium.com/sardinia-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;Alghero.&lt;/li&gt;
&lt;li&gt;Baja Sardinia.&lt;/li&gt;
&lt;li&gt;Budoni.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sardinianbeaches.com/beaches-of-sardinia/east/baunei/cala-goloritze/"&gt;Cala Goloritze, Sardinia&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Castelsardo (gifts maybe?).&lt;/li&gt;
&lt;li&gt;Food: Maialetto sardo (Pig), Sebadas, Pardula, Papassinas, Pani e sapa.&lt;/li&gt;
&lt;li&gt;L'Asinara boat trip (abandoned penitentiary).&lt;/li&gt;
&lt;li&gt;La Pelosa beach.&lt;/li&gt;
&lt;li&gt;Nuraghe.&lt;/li&gt;
&lt;li&gt;Porto Cervo.&lt;/li&gt;
&lt;li&gt;Porto Torres.&lt;/li&gt;
&lt;li&gt;San Teodoro.&lt;/li&gt;
&lt;li&gt;Stintino (fishing port).&lt;/li&gt;
&lt;li&gt;Zedda e Piras vinyards (Alghero).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 20 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/sardinia-travel-bookmarks</guid></item><item><title>Vagrant and Ansible</title><link>https://www.wints.org/notes/2015.07.20/</link><description>&lt;p&gt;I&amp;rsquo;m learning Python, and have had fun automating tasks with Python scripts.&lt;/p&gt;
&lt;p&gt;I was polluting my Macbook (Yosemite) quite a bit by installing all libraries globally, until I learned about &lt;a href="http://vagrantup.com"&gt;Vagrant&lt;/a&gt;. Vagrant is essentially a command-line wrapper around VirtualBox. It makes it easy to create/configure/destroy virtual machines from the shell.&lt;/p&gt;
&lt;h5 id="vagrantfile"&gt;Vagrantfile &lt;a href="#vagrantfile"&gt;¶&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;I installed it from &lt;a href="https://www.vagrantup.com/downloads.html"&gt;here&lt;/a&gt;. A summary of my journey is below.&lt;/p&gt;
&lt;p&gt;Created and jumped into a new directory:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-bash"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;$ mkdir newproject &lt;span style="color: #f92672;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cd newproject
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create a Vagrantfile. This creates a file named &amp;ldquo;Vagrantfile&amp;rdquo; and a &amp;ldquo;.vagrant folder&amp;rdquo; in the directory:&lt;/p&gt;</description><author>A Holding Company</author><pubDate>Mon, 20 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.wints.org/notes/2015.07.20/</guid></item><item><title>HillHacks 2015</title><link>https://captnemo.in/blog/2015/07/20/hillhacks/</link><description>&lt;p&gt;A little while back, I came across &lt;a href="https://hillhacks.in" title="hacking and making in the Himalayas"&gt;HillHacks&lt;/a&gt;, a conference in Dharamshala about “hacking and making in the Himalayas”. I was instantly hooked. It took a lot of scheduling troubles, but I decided to stay for the entire unconference, which started at 23rd May.&lt;/p&gt;

&lt;p&gt;Its hard to describe the HillHacks experience in a single blog post. I met so many amazing people from all over the world. Learned a lot of different things. I Had a lot of fun teaching some other things. I helped organize some of the stuff, and managed to stay awake an entire night while participating in an CTF. And on top of that, got to eat delicious food.&lt;/p&gt;

&lt;p&gt;HillHacks as an event, was divided into two segments:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;An unconference (23rd May - 3rd June)&lt;/li&gt;
  &lt;li&gt;Main Conference (4-7 June)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lot of people had arrived before me at the venue and taken care of the basic infrastructure. We had internet connectivity via two local ISPs. We had IPV6 connectivity via a tunnel in Belgium as well.&lt;/p&gt;

&lt;p&gt;There were a lot of fun activities planned everyday: from unicycling to skateboarding and playing Cards against Humanity; it was a lot of fun living with so many strangers and trying to figure out ways to help.&lt;/p&gt;

&lt;p&gt;I did a talk on &lt;a href="http://sdslabs.co" title="SDSLabs is a campus group at IIT Roorkee"&gt;SDSLabs&lt;/a&gt;, a &lt;a href="https://speakerdeck.com/captn3m0/hillhacks-quiz" title="Hillhacks Quiz"&gt;quiz for everyone&lt;/a&gt;, and an &lt;a href="http://slides.com/captn3m0/ctf#/" title="Slides from the talk"&gt;introductory session on CTF contests&lt;/a&gt;. We then participated in a &lt;a href="http://signup.sqrts.de/" title="Page is in german"&gt;CTF&lt;/a&gt; organized in Germany as Team HillHacks. On the last day of the conference, I did a [talk][josd-talk] on “The Joy of Software Development”, which is a &lt;a href="https://josd.captnemo.in/" title="Joy of Software Development Book Website"&gt;book I am working on&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For the first time in my life, I met people who actually use BSD. And to make it even more amazing, I met NetBSD Kernel developers, people on the BSD Security Team, and people who prefer OpenBSD over NetBSD (I’d never really cared for the distinction, as a Linux user)&lt;/p&gt;

&lt;p&gt;We did a lot of hacks, including running an MPD Daemon and streaming it over IceCast. I also spent a lot of time cubing and teaching people how to solve Rubik Cubes. My times have also improved somewhat as a result. Thanks to &lt;a href="https://trouble.is/bio/" title="trouble's bio page"&gt;trouble&lt;/a&gt;, I also learnt how to solve a MegaMinx.&lt;/p&gt;

&lt;p&gt;As part of the School Outreach program (organized by the brilliant &lt;a href="https://twitter.com/mediatinker" title="Her twitter profile"&gt;Tink&lt;/a&gt;), we taught kids about Codes and Ciphers, programming, speedcubing and lots of other things. The kids also performed in the final Gala Show giving us brilliant performances in 3 different plays (all 3 schools had their own plays).&lt;/p&gt;

&lt;p&gt;I learned a lot of different things: how to start with Kernel Programming, DNSSEC, Retro Gaming. Thanks to a few dedicated volunteers, we even made a 8-inch Telescope that made staring at the night sky so much fun. We had a session on Typography, a story telling session in Malayalam (translated to English on the fly). I even learnt a bit of Emacs.&lt;/p&gt;

&lt;p&gt;The list is so long, I don’t think I can do it justice in this single blog post.&lt;/p&gt;

&lt;p&gt;The most amazing part was not the technical things, but the community itself. &lt;a href="https://twitter.com/sva" title="sva on twitter"&gt;sva&lt;/a&gt; would often say that everyone of us has “sudo access on the conference” (geekspeak for full authority). Each of us helped organize it, any way we could. The community got together to setup the stage, tents, network and the entire infrastructure at HillHacks. Zainab even has a blog post on &lt;a href="https://medium.com/@zainabbawa/on-community-and-the-art-of-various-cookings-511c31c33498" title="On community, and the art of various cookings"&gt;social cooking at Hillhacks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As I sit here at the venue, it has been 2 weeks of fun and awesomeness here at HillHacks. I leave with lots of memories and hope to be here next year.&lt;/p&gt;

&lt;p&gt;If this blog post interests you, be sure to check out &lt;a href="https://hackbeach.in" title="HackBeach wiki page"&gt;hackbeach&lt;/a&gt; as well. We are doing a mini-conference around November in Kovalam.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Mon, 20 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/07/20/hillhacks/</guid></item><item><title>Network sockets&amp;amp;mdash;an ordeal (starring C++11)</title><link>https://bastian.rieck.me/blog/2015/sockets_ordeal_cxx11/</link><description>&lt;p&gt;Inspired by &lt;a href="http://blog.annharter.com/2015/07/15/three-dead-protocols.html"&gt;Ann Harter&amp;rsquo;s post about three dead protocols&lt;/a&gt;,
which I would not pronounce dead just yet, I also decided that it was time to re-connect with socket
programming. I foolishly decided that this was also a great time to apply some of the new features
of C++11. Kill two birds with one stone, or something like that. In the end, I narrowly escaped with
my sanity, but was able to finish at least an implementation of &lt;a href="https://tools.ietf.org/html/rfc865"&gt;RFC 865&lt;/a&gt;,
the &lt;em&gt;Quote of the Day&lt;/em&gt; protocol.&lt;/p&gt;
&lt;h1 id="the-quest-begins"&gt;The quest begins&lt;/h1&gt;
&lt;p&gt;C++ does not have a standardized API to deal with sockets. It probably never will. Although there
are some higher-level implementations out there, such as &lt;a href="http://www.boost.org/doc/libs/release/libs/asio"&gt;Boost.Asio&lt;/a&gt;,
my inner Klingon decided that it would be more honourable to learn the concepts from the venerable
POSIX sockets API. To a C++ programmer, this API is somewhat &lt;em&gt;odd&lt;/em&gt;, to say the least. Lots of usage
of &lt;code&gt;void*&lt;/code&gt; force the diligent programmer to make keen use of &lt;code&gt;reinterpret_cast&lt;/code&gt;. Functions return an
integer, with &lt;code&gt;-1&lt;/code&gt; indicating an error, and the magical &lt;code&gt;errno&lt;/code&gt; variable describing the cause.&lt;/p&gt;
&lt;p&gt;Perusal of the documentation yielded the following information for creating a server socket that is
reachable via TCP/IP:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Creating a socket with domain &lt;code&gt;AF_INET&lt;/code&gt; and type &lt;code&gt;SOCK_STREAM&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Setting the socket option &lt;code&gt;SO_REUSEADDR&lt;/code&gt; of level &lt;code&gt;SOL_SOCKET&lt;/code&gt;. Otherwise, stale connections
might hinder the program from re-binding to the desired address after quitting and restarting the
server.&lt;/li&gt;
&lt;li&gt;Creating an instance of &lt;code&gt;sockaddr_in&lt;/code&gt; and filling it with details about the desired address and
port to bind to.&lt;/li&gt;
&lt;li&gt;Calling &lt;code&gt;bind()&lt;/code&gt; to perform the actual binding.&lt;/li&gt;
&lt;li&gt;Calling &lt;code&gt;listen()&lt;/code&gt; on the socket to wait for connections. But wait, this does not actually do
anything! To really &amp;quot;wait&amp;quot; for a connection, we have to &lt;code&gt;accept()&lt;/code&gt; it first.&lt;/li&gt;
&lt;li&gt;The call to &lt;code&gt;accept()&lt;/code&gt; is blocking by default, meaning that program execution will stop until
there is some client to be accepted. The call then returns a socket describing the client
connection.&lt;/li&gt;
&lt;li&gt;The returned socket is a socket which we may finally use to send some data to!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I wrapped the calls described above in a slightly-improved interface for a simple server class so
that other programmers do not have to deal with the innards of the POSIX sockets API as much.  This
is what the API looks like so far:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setBacklog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setBacklog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It is &lt;em&gt;almost-but-not-quite&lt;/em&gt; usable.  However, we only arrived at obtaining a socket for a client.
The socket is again an integer that requires the use of the sockets API. Feeling more foolishness
rise in me, I hastened onwards and wrote a nice class for wrapping a client socket. At present, it
only wraps the &lt;code&gt;send()&lt;/code&gt; function of the POSIX sockets API. But at least I am now able to send
strings instead of &lt;code&gt;const void*&lt;/code&gt;, hooray:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ClientSocket&lt;/span&gt; &lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// fd is coming from somewhere else; see below...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s"&gt;"So much wow!"&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;            &lt;span class="c1"&gt;// Close the connection after so much excitement
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1 id="enter-c11"&gt;Enter C++11&lt;/h1&gt;
&lt;p&gt;Until now, C++11 did not play a large role. Since my pretty server API only reacts to new client
connections (it cannot know whether a client actually &lt;em&gt;sent&lt;/em&gt; something), I though it would be nice
to have a user-configurable functor that is called asynchronously whenever that happens. Enter
&lt;code&gt;std::function&lt;/code&gt; and &lt;code&gt;std::async&lt;/code&gt;. The user needs to specify a function for handling accepted
connections:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;onAccept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;unique_ptr&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ClientSocket&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s"&gt;"Your quote here, for only 9.99 USD!"&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The server then launches this function asynchronously whenever an &lt;code&gt;accept()&lt;/code&gt; call returns:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;clientSocket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;unique_ptr&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ClientSocket&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ClientSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;clientFileDescriptor&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;launch&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_handleAccept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;clientSocket&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I am using an &lt;code&gt;std::unique_ptr&lt;/code&gt; because the server does not want to take ownership of the client
file descriptor at this time. Maybe I am going to change this in the future.&lt;/p&gt;
&lt;h1 id="so"&gt;So?&lt;/h1&gt;
&lt;p&gt;If this seems like a &lt;em&gt;lot&lt;/em&gt; of hassle for doing something as simple as sending a random quote to a
client, you are right. I cried hot tears of shame when I compared my 203 lines of code to Ann&amp;rsquo;s 37,
which even contained some commented code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'socket'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'csv'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;quotes_array_unparsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;CSV&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'goodreads_quotes_export.csv'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quotes_array_unparsed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delete_at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;quotes_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;quotes_array&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;quotes_array_unparsed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;quotes_array_unparsed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;quotes_array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Hash&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;quotes_array&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsub!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;br/&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#def less_than_512&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#  if @quote_body.bytesize &amp;lt; 512&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#	qotd(@quote_body, @quote_author)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#  else &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#    less_than_512&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#	end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;TCPServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kp"&gt;loop&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="no"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="n"&gt;random_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quotes_array&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="vi"&gt;@quote_body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quotes_array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;random_index&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;"Quote"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="vi"&gt;@quote_author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quotes_array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;random_index&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;"Author"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;qotd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;   - &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;qotd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@quote_body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@quote_author&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I am amazed! Of course, this comparison is slightly unfair because I had to write my own version of
Ruby&amp;rsquo;s &lt;code&gt;TCPServer&lt;/code&gt; module. Still, this code is definitely more elegant than mine. To compensate for
this, my implementation of the &lt;em&gt;Quote of the Day&lt;/em&gt; protocol serves up random quotes from &lt;a href="http://www.thedevilsdictionary.com"&gt;Ambrose
Bierce&amp;rsquo;s &lt;em&gt;The Devil&amp;rsquo;s Dictionary&lt;/em&gt;&lt;/a&gt;, which I hope will get me
some pity points.&lt;/p&gt;
&lt;h1 id="where-is-the-code"&gt;Where is the code?&lt;/h1&gt;
&lt;p&gt;Please find the code &lt;a href="https://github.com/Pseudomanifold/SimpleServer"&gt;on its GitHub repository&lt;/a&gt;. I plan
on doing at least an implementation of &lt;a href="https://tools.ietf.org/html/rfc862"&gt;RFC 862&lt;/a&gt;, the &lt;em&gt;Echo&lt;/em&gt;
protocol as well, but this will require more changes to the client socket, namely the ability to
&lt;em&gt;read&lt;/em&gt; stuff as well.&lt;/p&gt;
&lt;p&gt;The code is released under an MIT licence.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 19 Jul 2015 22:59:12 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/sockets_ordeal_cxx11/</guid></item><item><title>3-way Disk Mirrors With ZFSOnLinux</title><link>https://bhoey.com/blog/3-way-disk-mirrors-with-zfsonlinux/</link><description>&lt;p&gt;Traditionally mirrored disk sets in Linux and other operating systems have been limited to two devices. While mirroring has the benefit over other raid levels in that each mirrored device contains a complete copy of the data, the two device limit became inadequate as disk sizes ballooned. In the age of multi-TB drives, simply rebuilding a degraded mirrored array could actually cause the surviving device to fail, eliminating the very redundancy one was expecting.&lt;/p&gt;
&lt;p&gt;ZFS addresses this particular problem in several ways through data checksums, self-healing and smart resilvering instead of blindly rebuilding full array members even if only 1% of disk space is being used.&amp;#160;&lt;a href="https://bhoey.com/blog/3-way-disk-mirrors-with-zfsonlinux/"&gt;[Continue&amp;#160;reading...] &lt;span class="screen-reader-text"&gt;3-way Disk Mirrors With ZFSOnLinux&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a href="https://bhoey.com/blog/3-way-disk-mirrors-with-zfsonlinux/" rel="nofollow"&gt;3-way Disk Mirrors With ZFSOnLinux&lt;/a&gt; appeared first on &lt;a href="https://bhoey.com/blog" rel="nofollow"&gt;BHoey&lt;/a&gt;.&lt;/p&gt;</description><author>BHoey</author><pubDate>Sun, 19 Jul 2015 05:03:22 GMT</pubDate><guid isPermaLink="true">https://bhoey.com/blog/3-way-disk-mirrors-with-zfsonlinux/</guid></item><item><title>Maybe "Now" Is Not the Right Time</title><link>https://josh.works/2015/07/19/2015-7-19-maybe-now-is-not-the-right-time/</link><description>&lt;p&gt;Recently I deleted a bunch of old notes I had in
&lt;a href="https://evernote.com"&gt;Evernote&lt;/a&gt;. Some of the notes were almost immediately unneeded, like old receipts and confirmations. &lt;/p&gt;

&lt;p&gt;Much of the rest was notes related to goals (“Checklist to move out of MD Apartment”, “Planning trip to Buenos Aires”) or to projects I had. (“Set up personal website”, “Outline book on overcoming fear of lead climbing”, etc). &lt;/p&gt;

&lt;p&gt;Some of the things I’ve been working on in the last few weeks I’ve been thinking about for over a year. Whoa. Why did I wait until now to do something that I’d obviously wanted to do over a year ago?&lt;/p&gt;

&lt;h2 id="now-is-a-good-time-to-do-something-but-later-isnt-always-bad"&gt;“Now” is a good time to do something, but “later” isn’t always bad. &lt;/h2&gt;

&lt;p&gt;I’ve tried to find a different way of saying this, but anything else isn’t honest. I’ve felt tremendous guilt lately at not accomplishing some of the projects I’ve laid out for myself.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;I’ve not studied any Spanish, even though I’ve been living in Buenos Aires, fumbling around with my terrible Spanish skills.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I’ve not taken measurable steps on either of two side projects I’ve been meaning to accomplish (and have been wanting to do them for years.)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I’ve spent time reading mostly pointless fiction rather than more meaty non-fiction/histories/biographies, even though I’d much rather spend time in the latter.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I’ve only in the last few days feel like I’ve made significant progress with projects at work. &lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I’ve not done a single physically challenging act in two months. No climbing, no exercise. &lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these things will be accomplished in time. While I shouldn’t sit around until I magically feel motivated to do all of the undone things in my life, I can respect the ebb and flow of motivation, and peg the right projects to the right time. &lt;/p&gt;

&lt;p&gt;I do this at a daily and weekly level (I.E. certain kinds of work when I’m feeling high/low energy, and I keep work limited to mostly-normal working hours), so it is no stretch to extend the principle to a monthly/yearly schedule. (Except for the exercise bit - I feel way better with exercise in my life, and allowed the current inaccessibility of climbing to derail that habit.)&lt;/p&gt;

&lt;p&gt;It’s hard for me to not succumb to the Instagram/Hacker News effect. (I just made that up. It’s the endless viewing of other people’s beautiful lives/successful products makes me think that I am a dismal failure, just because I’m not currently launching something elegent/successful/lucrative/world-changing or having a fabulous time in a beautiful place.) &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does this matter to you?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The same way that it matters to me. Do things that matter. But don’t lose sleep over not doing everything as quickly as you originally thought you might, and don’t be beholden to doing things that you no longer need to do.&lt;/p&gt;

&lt;p&gt;&lt;a href="/a-little-bit-of-slope-makes-up-for-a-lot-of-y-intercept"&gt;It’s the slope, not the Y-intercept. &lt;/a&gt;&lt;/p&gt;</description><author>Josh Thompson</author><pubDate>Sun, 19 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/2015/07/19/2015-7-19-maybe-now-is-not-the-right-time/</guid></item><item><title>Age of Sigmar breaks Warhammer Fantasy, but it's worth it</title><link>https://benovermyer.com/blog/2015/07/age-of-sigmar-breaks-warhammer-fantasy-but-its-worth-it/</link><description>&lt;p&gt;Age of Sigmar grabbed the Warhammer Fantasy rulebook, tore it apart, and threw the remains into the fire. I love the game that came out of that, even if there are some significant negatives to this event.&lt;/p&gt;
&lt;h1 id="from-simulationist-roots-to-casual-narratives"&gt;From simulationist roots to casual narratives&lt;/h1&gt;
&lt;p&gt;Warhammer Fantasy has long been the strategy-heavy cousin to the tactical-heavy Warhammer 40,000. The rules up until this point focused on maneuver and regiments, positioning and thinking ahead. Warhammer 40,000, on the other hand, has always been about skirmishes and characterful, tight battles. Where Fantasy relied on its movement trays and slower pace, 40k allowed for a lot of narrative to come through the gameplay. Age of Sigmar one-ups 40k in this regard. Yes, Age of Sigmar has a lot of holes in the rules. Someone who delights in using rules-as-written against his opponent is going to have a field day with Sigmar. But that's not what this iteration of the game is about. Age of Sigmar seeks to bring casual gaming to the fore. The rules explicitly encourage, via its Most Important Rule, house-ruling and collaborating with your opponent to set up the battle.&lt;/p&gt;
&lt;h1 id="play-any-army-you-come-up-with"&gt;Play any army you come up with&lt;/h1&gt;
&lt;p&gt;One of my favorite things about the rules is its encouragement of creativity in army building. There are no points or required force organization. While this can obviously be abused by asocial types, for those of us that enjoy narrative battles, it's a godsend. I can mix Seraphons (Lizardmen) in with Stormcast Eternals and Exile Aelfs (Dark Elves), and that's perfectly legitimate. If I really wanted to, the rules allow me to field Chaos Warriors alongside Sylvaneth (Dryads) and Duardin (Dwarfs). I can't imagine the scenario where that would make lore sense, but you could do it. All of this makes for some fantastic battle and lore possibilities.&lt;/p&gt;
&lt;h1 id="my-god-it-s-beautiful"&gt;My God, it's beautiful&lt;/h1&gt;
&lt;p&gt;The miniatures in the starter box set are absolutely gorgeous, and make the collector in me very happy. The Lord Celestant in particular is a beautiful model. With his triumphant pose and intimidating Drakoth mount, he makes a fine addition to any army. The Khorgorath model on the Chaos side is really ****ing creepy. It's made of blood and skulls of its victims are pushing their way through its skin.&lt;/p&gt;
&lt;h1 id="there-s-a-free-app-for-army-building"&gt;There's a free app for army building&lt;/h1&gt;
&lt;p&gt;This is a big one. I bought Army Builder ages ago to help me build 40k armies, but Games Workshop is notorious for never releasing anything for free. Privateer Press released a free app awhile ago for its Warmachine and Hordes games, and while you need to pay for your specific army, it does have the benefit of being a first-party app. Now, GW has released the Age of Sigmar app that includes an army builder and the Warscrolls for all existing models for free. The one thing that pisses me off about this app is that I don't get the Warscrolls for the starter box units, despite having shelled out $125 for said box. There's no way to redeem a product code or anything. The only way to get those Warscrolls in the app is to buy the Age of Sigmar book through it, which would be an additional $50. No thanks. But it's GW, so I'll give them points for the progress they &lt;em&gt;did&lt;/em&gt; make.&lt;/p&gt;
&lt;h1 id="tournaments"&gt;...tournaments?&lt;/h1&gt;
&lt;p&gt;Yeah, the Age of Sigmar rules pretty much break any possibility of having tournaments without extensive house-ruling. That's a problem for people who're really into the game. I'll admit to being a little hesitant about this. I've never played in a 40k tournament, but I think it'd be fun to try. I can't imagine playing in an Age of Sigmar tournament, though. The rules aren't geared for that.&lt;/p&gt;
&lt;h1 id="what-about-the-people-who-enjoyed-the-old-game"&gt;What about the people who enjoyed the old game?&lt;/h1&gt;
&lt;p&gt;Games Workshop's move to completely get rid of the old rules and cease supporting it in their stores is a bad one, despite the good game that Age of Sigmar is. The community that built up around WHFB is not so easily dismissed. For some people, their local Games Workshop store is the only place they could play the game they'd put a lot of time and money into, and I've heard rumors that GW stores are disallowing WHFB matches now. That's a terrible policy. &lt;a href="http://www.manticgames.com/" rel="external"&gt;Mantic Games&lt;/a&gt; has their Kings of War game, which keeps very closely to WHFB's roots. They just released a second edition, and have been inviting WHFB players left out in the cold to join their community. This is a great move on Mantic's part, and I really hope it works out for everyone. From what I've seen, &lt;a href="https://web.archive.org/web/20150722045547/http://manticblog.com/2015/07/14/how-the-community-helped-develop-kings-of-war/" rel="external"&gt;Mantic cares a lot more about community&lt;/a&gt; than GW does.&lt;/p&gt;
&lt;h1 id="so-is-it-worth-getting"&gt;So is it worth getting?&lt;/h1&gt;
&lt;p&gt;Yes. Especially since the rules are free, and the Warscrolls - the rules for individual units - are also free. You can get them on &lt;a href="http://www.games-workshop.com/en-US/age-of-sigmar-compendiums" rel="external"&gt;Games Workshop's site&lt;/a&gt;. In my opinion, the starter box is also totally worth the $125. It has wonderful minis, and the books are great too.&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sun, 19 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/07/age-of-sigmar-breaks-warhammer-fantasy-but-its-worth-it/</guid></item><item><title>Hadoop on Ceph: usability survey</title><link>https://makedist.com/posts/2015/07/19/hadoop-on-ceph-usability-survey/</link><description>Hadoop interoperability with Lustre, Quantcast, Gluster, and more.</description><author>Noah Watkins</author><pubDate>Sun, 19 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2015/07/19/hadoop-on-ceph-usability-survey/</guid></item><item><title>Jobs</title><link>https://olshansky.info/movie/jobs/</link><description>Olshansky's review of Jobs</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 18 Jul 2015 11:57:37 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/jobs/</guid></item><item><title>Get Hard</title><link>https://olshansky.info/movie/get_hard/</link><description>Olshansky's review of Get Hard</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 18 Jul 2015 11:56:21 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/get_hard/</guid></item><item><title>The Effective Engineer</title><link>https://june.kim/effective-engineer/</link><author>june.kim</author><pubDate>Sat, 18 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/effective-engineer/</guid></item><item><title>Doors of Italy</title><link>https://solomon.io/doors-of-italy/</link><description>My trip to Italy last year was the first time I’d ever been overseas. Most of the trip was spent walking across Tuscany and Umbria.</description><author>Sam Solomon</author><pubDate>Sat, 18 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/doors-of-italy/</guid></item><item><title>Migrated away from Heroku</title><link>https://benovermyer.com/blog/2015/07/migrated-away-from-heroku/</link><description>&lt;p&gt;Heroku made their free tier awful. That's fair enough, but I need more stability.&lt;/p&gt;
&lt;p&gt;So, I've spun up a Digital Ocean droplet and learned how to deploy Rails apps without the help of a PaaS.&lt;/p&gt;
&lt;p&gt;It's not intuitive for someone who's used to provisioning PHP web app servers, but after finally getting it working, it's actually a pretty cool way of doing things.&lt;/p&gt;
&lt;p&gt;So yeah. Obelisk, the Ruby on Rails blog engine I've written to replace the PHP-based Monkblog engine, is now running on a server that I've provisioned from scratch. Yay!&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sat, 18 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/07/migrated-away-from-heroku/</guid></item><item><title>searchcode the path to profitability</title><link>https://boyter.org/2015/07/searchcode-path-profitability/</link><description>&lt;p&gt;One of the things that has always bothered me about searchcode.com was that it never generated any money. Not a huge problem in itself as a side project, but the costs to run it are not insignificant due to the server requirements. I had looked into soliciting donations but I considered this highly unlikely to produce enough revenue to cover costs considering that sites such as &lt;a href="http://www.gwern.net/"&gt;gwern.net&lt;/a&gt; was unable to make enough to cover even basic costs through &lt;a href="https://www.patreon.com/gwern"&gt;patreon&lt;/a&gt; (although since a recent HN post this has jumped from around $20 a month to over $150).&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 17 Jul 2015 11:01:15 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/searchcode-path-profitability/</guid></item><item><title>Open closest build file in Emacs</title><link>https://xenodium.com/open-closest-build-file-in-emacs</link><description>&lt;p&gt;Whether it's Makefile, SConstruct, BUILD, or your favorite build file, chances are you have to tweak it from time to time. &lt;code&gt;ar/open-build-file&lt;/code&gt; searches your current and parent directories to find a build file.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(defvar ar/project-file-names '(&amp;quot;Makefile&amp;quot; &amp;quot;SConstruct&amp;quot; &amp;quot;BUILD&amp;quot;))

(defun ar/parent-directory (path)
  &amp;quot;Get parent directory for PATH.&amp;quot;
  (unless (equal &amp;quot;/&amp;quot; path)
    (file-name-directory (directory-file-name path))))

(defun ar/find-upwards (path filename)
  &amp;quot;Search upwards from PATH for a file named FILENAME.&amp;quot;
  (let ((file (concat path filename))
        (parent (ar/parent-directory (expand-file-name path))))
    (if (file-exists-p file)
        file
      (when parent
        (ar/find-upwards parent filename)))))

(defun ar/open-closest (filename)
  &amp;quot;Open the closest FILENAME in current or parent dirs (handy for finding Makefiles).&amp;quot;
  (let ((closest-file-path (ar/find-upwards (buffer-file-name)
                                                 filename)))
    (when closest-file-path
      (message closest-file-path)
      (switch-to-buffer (find-file-noselect closest-file-path)))
    closest-file-path))

(defun ar/open-build-file ()
  &amp;quot;Open the closest project file in current or parent directory.
For example: Makefile, SConstruct, BUILD, etc.
Append `ar/project-file-names' to search for other file names.&amp;quot;
  (interactive)
  (catch 'found
    (mapc (lambda (filename)
            (when (ar/open-closest filename)
              (throw 'found t)))
          ar/project-file-names)
    (error &amp;quot;No project file found&amp;quot;)))
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 17 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/open-closest-build-file-in-emacs</guid></item><item><title>A Quick Guide to Net Promoter Score</title><link>https://solomon.io/quick-guide-to-net-promoter-score/</link><description>Looking for a quick guide to Net Promoter Score? You’ve found it. This little guide will give you all the basics.</description><author>Sam Solomon</author><pubDate>Fri, 17 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/quick-guide-to-net-promoter-score/</guid></item><item><title>angular-fng</title><link>https://adamcraven.com/writing/angular-fng/</link><description/><author>Writing on Adam Craven</author><pubDate>Fri, 17 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://adamcraven.com/writing/angular-fng/</guid></item><item><title>The benefit of testing for Developers, Managers and the Business</title><link>https://boyter.org/2015/07/benefit-testing-developers-managers-business/</link><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Fixing regression bugs is analogous to digging a hole only to find the next day it has been filled in and having to dig it out again&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ask any manager, developer or tester working on software without tests what the main pain points are. Nearly all the time the main one mentioned is dealing with regressions. This is bugs that were fixed a year ago which returned. Regression bugs cost the software industry billions of dollars a year. Worse still they are demoralising to everyone involved. Finding or fixing the same bug over and over causes you to start looking for new projects or new jobs.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 16 Jul 2015 11:05:30 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/benefit-testing-developers-managers-business/</guid></item><item><title>Create iOS static fat libraries</title><link>https://xenodium.com/create-ios-static-fat-libraries</link><description>&lt;p&gt;Have separate static libraries for different iOS architectures? Stitch 'em up into a single fat library using with lipo:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ lipo -create libOne_i386.a libOne_x86_64.a libOne_armv7.a libOne_arm64.a -output libOne.a
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 15 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/create-ios-static-fat-libraries</guid></item><item><title>Settling scores with an org table</title><link>https://xenodium.com/settling-scores-with-an-org-table</link><description>&lt;p&gt;Recently kept track of expenses between a group of us. To settle the scores, I emailed an exported HTML table from an org file. This was simple enough and required no external viewer from recepients. The org table, in all its textful glory, looked as follows…&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;
| Date             | Item           |   Charge |
|------------------+----------------+----------|
| [2015-06-18 Thu] | Cash           |    20.00 |
| [2015-07-11 Sat] | Lucky 7        |    42.97 |
| [2015-07-13 Mon] | Santa Maria    |    32.00 |
| [2015-07-12 Sun] | Tayyabs        |    46.00 |
| [2015-07-13 Mon] | The Brass Rail |    39.00 |
| [2015-07-13 Mon] | Underground    |    10.00 |
| [2015-07-10 Fri] | Cash           |    20.00 |
| [2015-07-13 Mon] | Cash           |    20.00 |
| [2015-07-14 Tue] | Cash           |    20.00 |
|------------------+----------------+----------|
|                  | total          | £ 249.97 |
#+TBLFM: @11$3=vsum(@2..@10);£ %.2f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…while the exported HTML below could be easily pasted on to an email.&lt;/p&gt;
&lt;p&gt;Date                 Item             Charge&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;[2015-06-18 Thu]   Cash             20.00
[2015-07-11 Sat]   Lucky 7          42.97
[2015-07-13 Mon]   Santa Maria      32.00
[2015-07-12 Sun]   Tayyabs          46.00
[2015-07-13 Mon]   The Brass Rail   39.00
[2015-07-13 Mon]   Underground      10.00
[2015-07-10 Fri]   Cash             20.00
[2015-07-13 Mon]   Cash             20.00
[2015-07-14 Tue]   Cash             20.00
total            £ 249.97&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{=org}"&gt;#+TBLFM: @11$3=vsum(@2..@10);£ %.2f
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 15 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/settling-scores-with-an-org-table</guid></item><item><title>Battlehack Athens 2015</title><link>https://nutcroft.mataroa.blog/blog/battlehack-athens-2015/</link><description>&lt;p&gt;This May I attended for the first time the Battlehack hackathon series. It was also the first time they were coming to Athens.&lt;/p&gt;
&lt;p&gt;We implemented an &lt;a href="https://github.com/sirodoht/localhero-client/"&gt;Ionic&lt;/a&gt; + &lt;a href="https://github.com/sirodoht/localhero-app"&gt;Sails.js&lt;/a&gt; app, which enables you to help people of your local community. The idea is to learn and teach people stuff, either for profit or voluntarily. The only prerequisite to participate for the winning prize was to use either PayPal or Braintree for payments, so we just used it for those who wanted to pay/get paid in the app.&lt;/p&gt;
&lt;p&gt;Overall, it was an awesome experience. Braintree (the company behind the organization) had prepared everything. Tons of food present at every moment, which does not mean that there weren't also separate meals; coffee and red bulls, even massage sessions!&lt;/p&gt;
&lt;p&gt;After the hacking ended we had to present our creation. Although our app decided not to behave for these crucial 2 minutes of our pitch, some people, i.e. sponsors, liked us and gave us two gifts for using their APIs.&lt;/p&gt;
&lt;p&gt;Definitely recommended as an experience, it was very fun and I already plan to attend next year. The only regret was not sleeping at all the previous day, which resulted in ~60 hours of sleeplessness; at the bucket list of &lt;em&gt;not&lt;/em&gt; to do again!&lt;/p&gt;
&lt;p&gt;P.S. &lt;a href="https://www.youtube.com/watch?v=m1jTxVXyDtc"&gt;Highlights video&lt;/a&gt;.&lt;/p&gt;</description><author>nutcroft</author><pubDate>Wed, 15 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nutcroft.mataroa.blog/blog/battlehack-athens-2015/</guid></item><item><title>Walden</title><link>https://june.kim/walden/</link><author>june.kim</author><pubDate>Tue, 14 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/walden/</guid></item><item><title>FatturaElettronicaPA for .NET has been updated</title><link>https://nicolaiarocci.com/fatturaelettronicapa-for-net-has-been-updated/</link><description>&lt;p&gt;&lt;a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA"&gt;FatturaElettronicaPA&lt;/a&gt; has just been updated to v0.1.4. With this release invoice bodies (&lt;code&gt;FatturaElettronicaBody&lt;/code&gt; items) are also validated. As always, you can install the package directly from &lt;a href="https://www.nuget.org/packages/FatturaElettronicaPA/"&gt;NuGet&lt;/a&gt;. See the &lt;a href="http://nicolaiarocci.com/fattura-elettronica-open-source/"&gt;original post&lt;/a&gt; for more info. Also don’t forget to check the &lt;a href="https://github.com/FatturaElettronicaPA"&gt;related projects&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update: v0.1.6 has also been released.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 14 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/fatturaelettronicapa-for-net-has-been-updated/</guid></item><item><title>Recognize new password prompts in Emacs shell</title><link>https://xenodium.com/recognize-new-password-prompts-in-emacs-shell</link><description>&lt;p&gt;At some point, you may come across a trusted command-line utility prompting you for a password, and Emacs shell happily displaying each typed character to the nearby-world to see. Luckily, you can train Emacs to recognize new password prompts and hide the typed characters in modes deriving from comint. Append the password prompt REGEXP:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(setq comint-password-prompt-regexp (concat comint-password-prompt-regexp
                                            &amp;quot;\\|&amp;quot;
                                            &amp;quot;Password for red alert:&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 13 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/recognize-new-password-prompts-in-emacs-shell</guid></item><item><title>[Review] "Data and Goliath" by Bruce Schneier</title><link>https://ntietz.com/blog/review-data-and-goliath/?utm_source=atom&amp;utm_medium=feed</link><description>&lt;p&gt;I just finished reading Bruce Schneier's latest book, "Data and Goliath." I was apprehensive at first -- I'm a big fan of Schneier's posts online, but I found this randomly at the library and I was hoping not to be disappointed. In the end, it was well worth the read.&lt;/p&gt;
&lt;p&gt;The book was split into three parts. In Part One, he discusses what a world of constant mass surveillance looks like. He illustrates what data everyone is leaking through ordinary activities, how people can and are monitored, and how this data can be used. In Part Two, he explains what is at stake: what the political and economic losses of surveillance are both in the US and abroad. And in Part Three, he explains what can be done about this in a three prong fashion: what the government should do; what corporations should do; and what we, the people, should do. All throughout, he provided compelling examples and illustrations, as well as footnotes with additional references (although, confusingly, these are not referenced inline but are merely listed at the end).&lt;/p&gt;
&lt;p&gt;There were many compelling points in this book, and I can't list them here, but I want to call attention to one in particular. He puts out a call to action for the tech community to (paradoxically) create surveillance tools for the government to use - the argument being that "if we want organizations like the NSA to protect our privacy, we're going to have to give them new ways to perform their intelligence jobs".&lt;/p&gt;
&lt;p&gt;Overall, I think he did a great job making these issues available for a non-technical audience. It was written in a way that will be open to everyone inside or outside the tech community. This book is a must-read in today's surveillance-filled world: buy it for your friends, get it from the library. Spread the word.&lt;/p&gt;</description><author>ntietz.com blog - technically a blog</author><pubDate>Mon, 13 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ntietz.com/blog/review-data-and-goliath/?utm_source=atom&amp;utm_medium=feed</guid></item><item><title>Colorless Tsukuru Tazaki and His Years of Pilgrimage</title><link>https://apurva-shukla.me/bookshelf/colorless-tsukuru-tazaki-and-his-years-of-pilgrimage/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ Eerily sinister, yet exquisitely beautiful. One cannot explain via words the feelings Murakami struck with this remarkable story.…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Sun, 12 Jul 2015 18:30:39 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/colorless-tsukuru-tazaki-and-his-years-of-pilgrimage/</guid></item><item><title>Inside Out</title><link>https://olshansky.info/movie/inside_out/</link><description>Olshansky's review of Inside Out</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 12 Jul 2015 11:42:40 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/inside_out/</guid></item><item><title>The Good Dinosaur</title><link>https://olshansky.info/movie/the_good_dinosaur/</link><description>Olshansky's review of The Good Dinosaur</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 12 Jul 2015 10:28:24 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_good_dinosaur/</guid></item><item><title>The Alchemist</title><link>https://olshansky.info/book/the_alchemist/</link><description>Olshansky's review of The Alchemist by Paulo Coelho</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 12 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/the_alchemist/</guid></item><item><title>Video - Cluster Failover Performance Demo</title><link>https://smcleod.net/2015/07/video-cluster-failover-performance-demo/</link><description>&lt;div style="padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
      
    &lt;/div&gt;</description><author>smcleod.net</author><pubDate>Sun, 12 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/07/video-cluster-failover-performance-demo/</guid></item><item><title>Hadoop on Ceph: diving in</title><link>https://makedist.com/posts/2015/07/12/hadoop-on-ceph-diving-in/</link><description>Using Hadoop to process data stored in the Ceph distributed file system.</description><author>Noah Watkins</author><pubDate>Sun, 12 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2015/07/12/hadoop-on-ceph-diving-in/</guid></item><item><title>Video game transcendental meditation</title><link>https://jasoneckert.github.io/myblog/video-game-transcendental-meditation/</link><description>&lt;p&gt;&lt;img alt="enlightenment" src="enlightenment.png#center" title="enlightenment" /&gt;&lt;/p&gt;
&lt;h1 id="what-is-transcendental-meditation"&gt;What is transcendental meditation?&lt;/h1&gt;
&lt;p&gt;Transcendental meditation is the most commonly practiced form of meditation in the world.  People who practice it often listen to, or repeat, a particular sound or mantra in order to reach a relaxed state of consciousness.  It’s been praised by many for decades as a means of lowering stress and anxiety.&lt;/p&gt;
&lt;h1 id="what-is-a-flow-state-within-a-video-game"&gt;What is a “flow state” within a video game?&lt;/h1&gt;
&lt;p&gt;Video games that require quick thinking, fast reflexes and precision are often difficult to excel at - but with practice, the game can be mastered.  When mastered, the player’s physical precision is almost effortless (encoded in “muscle memory”), the the thought processes seem perfectly natural.  It’s as if your mind is actually “in” the game.  This state is often called “the zone” by gamers, or a “flow state” by psychologists.&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Sun, 12 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/video-game-transcendental-meditation/</guid></item><item><title>systemd, User Instances, Device Units, and Media Archiving</title><link>https://blog.tjll.net/systemd-for-device-activation-and-media-archiving/</link><description>&lt;p&gt;
I recently used &lt;a href="http://www.freedesktop.org/wiki/Software/systemd/"&gt;systemd&lt;/a&gt;, &lt;a href="https://handbrake.fr/"&gt;HandBrake&lt;/a&gt;, and some simple scripts to digitize a large collection of physical media (for personal, archival use.) In this post I'll go through systemd features that made this easier and cover all the components that make the automated pipeline work.
&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;
If systemd, automation, or digital archiving sounds interesting to you, then read on!
&lt;/p&gt;

&lt;div id="table-of-contents"&gt;
&lt;h4&gt;Table of Contents&lt;/h4&gt;
&lt;div id="text-table-of-contents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-problem"&gt;The Problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#hardware"&gt;Hardware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#systemd"&gt;systemd&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#devices"&gt;Devices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-service"&gt;The Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#enabling-the-service"&gt;Enabling the Service&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-script"&gt;The Script&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-the-problem"&gt;
&lt;h4 id="the-problem"&gt;The Problem&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-the-problem"&gt;
&lt;p&gt;
&lt;a href="http://blog.codinghorror.com/books-bits-vs-atoms/"&gt;Atoms take up space&lt;/a&gt;. I'm moving in the near future, so my wife and I have been simplifying and trying to convert whatever we can into digital media rather than physical. This includes a moderately-sized DVD collection - which would be &lt;i&gt;really&lt;/i&gt; nice to convert into media files so they can be stored on my NAS and used in tandem with my already-existing &lt;a href="http://kodi.tv/"&gt;Kodi&lt;/a&gt; setup.
&lt;/p&gt;

&lt;p&gt;
However, there's a bit of a vacuum when it comes to automating this sort of process. Handbrake makes this easier, but the extent of the interaction I want a human to have to perform is to 1) put a DVD in and 2) take the DVD out - no selecting a title track, choosing an encoding format, and so on.
&lt;/p&gt;

&lt;p&gt;
We can make computers do the tedious parts!
&lt;/p&gt;

&lt;p&gt;
We'll start from the ground up, beginning with device activation and ending with media file processing.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-hardware"&gt;
&lt;h4 id="hardware"&gt;Hardware&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-hardware"&gt;
&lt;p&gt;
I have a NAS running Arch Linux which serves as a multi-purpose always-on server. I also had a spare DVD drive laying around after tearing it out of a 2009 Macbook Pro to add a second hard drive, so the first step was to convert that formerly internal drive into a USB-connected external drive.
&lt;/p&gt;

&lt;p&gt;
This is pretty easy by putting the drive into an &lt;a href="http://www.amazon.com/OWC-SuperSlim-Enclosure-SuperDrive-Unibody/dp/B00724YQSY"&gt;external enclosure&lt;/a&gt;, which I can hook into the NAS as a USB device.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-systemd"&gt;
&lt;h4 id="systemd"&gt;systemd&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-systemd"&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-devices"&gt;
&lt;h5 id="devices"&gt;Devices&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-devices"&gt;
&lt;p&gt;
Because Arch Linux uses systemd through-and-through, the init system also manages devices. You can actually see managed devices with the following command on a systemd-managed distribution with:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;shell&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-shell"&gt;&lt;code&gt;&lt;code&gt;systemctl --all --full -t device&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
This lists all 'active' devices, which in systemd nomenclature indicates the device is up, running, and available. In our case, once a CD/DVD is loaded, the &lt;code&gt;dev-cdrom.device&lt;/code&gt; device is &lt;i&gt;activated&lt;/i&gt; and started to make it available.
&lt;/p&gt;

&lt;p&gt;
We need a way to trigger the activation of a script, and this seems like a good system to hook into. Note that this is also possible with udev rules - the hotplugging mechanism that permits you to write &lt;i&gt;rules&lt;/i&gt; that can dictate how devices are mounted and made available to a Linux operating system. However, if we look at the man page for udev, we find this:
&lt;/p&gt;

&lt;pre class="example" id="org812d118"&gt;
&lt;code&gt;RUN{type}&lt;/code&gt;
&lt;code&gt;    Add a program to the list of programs to be executed after processing all the rules for a specific event ...&lt;/code&gt;
&lt;code&gt;&lt;/code&gt;
&lt;code&gt;    ...snip...&lt;/code&gt;
&lt;code&gt;&lt;/code&gt;
&lt;code&gt;    This can only be used for very short-running foreground tasks. Running an event process for a long period of time may block all further events for this or a dependent device.&lt;/code&gt;
&lt;/pre&gt;

&lt;p&gt;
Definitely not a good candidate for a script that can potentially run for a few hours to properly encode optical media.
&lt;/p&gt;

&lt;p&gt;
However, systemd can fit this need pretty well. The feature set of systemd exceeds the scope of this post, but there's good documentation under the following &lt;code&gt;man&lt;/code&gt; pages: &lt;code&gt;systemd.exec&lt;/code&gt;, &lt;code&gt;systemd.service&lt;/code&gt;, and &lt;code&gt;systemd.unit&lt;/code&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-the-service"&gt;
&lt;h5 id="the-service"&gt;The Service&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-the-service"&gt;
&lt;p&gt;
We'll define our script as a systemd &lt;i&gt;service&lt;/i&gt;, and work under the paradigm that &lt;i&gt;starting&lt;/i&gt; our service begins capturing our DVD.
&lt;/p&gt;

&lt;p&gt;
Here's the content of the service unit:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;Systemd&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-legend"&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="org-builtin"&gt;Font used to highlight builtins.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-keyword"&gt;Font used to highlight keywords.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="org-type"&gt;Font used to highlight type and class names.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-systemd"&gt;&lt;code&gt;&lt;code&gt;&lt;span class="org-type"&gt;[Unit]&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;Description&lt;/span&gt;=Automatically rip inserted DVDs&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;After&lt;/span&gt;=dev-cdrom.device&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;BindsTo&lt;/span&gt;=dev-cdrom.device&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;Requisite&lt;/span&gt;=dev-cdrom.device&lt;/code&gt;
&lt;code&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-type"&gt;[Service]&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;WorkingDirectory&lt;/span&gt;=/path/to/where/you/want/media/files&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;Type&lt;/span&gt;=&lt;span class="org-builtin"&gt;oneshot&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;ExecStart&lt;/span&gt;=/usr/local/bin/rip-dvd.sh&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;ExecStart&lt;/span&gt;=/usr/bin/eject /dev/cdrom&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;StandardOutput&lt;/span&gt;=journal&lt;/code&gt;
&lt;code&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-type"&gt;[Install]&lt;/span&gt;&lt;/code&gt;
&lt;code&gt;&lt;span class="org-keyword"&gt;WantedBy&lt;/span&gt;=dev-cdrom.device&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Let's go over the parts that aren't self-explanatory &amp;ndash; we'll start with &lt;code&gt;WantedBy&lt;/code&gt;, as that's the most important part for our task. Note that each of these options are well-explained in the man pages as well:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;WantedBy&lt;/code&gt; - This indicates that the dev-cdrom.device unit will ask for our service to be started when the device itself gets activated. We say WantedBy and not RequiredBy because the latter would indicate that our service is a &lt;i&gt;required dependency&lt;/i&gt; of making our cdrom available - which isn't the case (there's no logical relationship that indicates our autorip service is doing something that &lt;b&gt;must&lt;/b&gt; be available for the cdrom to work)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;After&lt;/code&gt;, &lt;code&gt;BindsTo&lt;/code&gt;, &lt;code&gt;Requisite&lt;/code&gt; - These seem somewhat redundant, but let's look at each:
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;Requisite&lt;/code&gt; - This indicates that the cdrom needs to be running in order for our unit to function. It's similar to using "Requires", except that if our cdrom isn't running, systemd won't try to "start" is as part of beginning our ripping process. This makes sense, as if the disk isn't in the optical drive, systemd can't do much physically to insert the disk and make the cdrom device unit active.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;After&lt;/code&gt; - Ensure that our service begins only after the cdrom unit has started completely. This is important, because otherwise systemd will attempt to aggressively parallelize unit activation once this unit gets triggered by our WantedBy line.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BindsTo&lt;/code&gt; - This isn't a strictly required option, but it makes the implementation cleaner. Essentially our unit will be killed if the indicated unit disappears from some reason - for example, if the disk gets ejected from the optical drive (which makes sense - without a disk to read from, our ripping process should be halted.)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Type=oneshot&lt;/code&gt; - This unit is intended to run then exit without any persistent daemon. This line tells systemd to expect that behavior (our script will encode the DVD, then exit.)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StandardOutput=journal&lt;/code&gt; - In my testing I noticed that I didn't always get script output captured in the journal. Explicitly adding this ensures that any script output is automatically logged to the journal, and can then be easily retrieved with &lt;code&gt;journalctl --user-unit &amp;lt;unit&amp;gt;&lt;/code&gt; (if you've tried to debug cron job behavior, you'll recognize this as pretty useful.)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ExecStart&lt;/code&gt; - For a oneshot service, we can define multiple stanzas. In this case, we wrap up the ripping process into a script, then if that command succeeds, spit the disk out. By default multiple ExecStart lines are dependent upon the success of the preceding execution, so the unit will halt and not eject the disk if ripping fails.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
The most important line of configuration here is &lt;code&gt;WantedBy&lt;/code&gt;. Because systemd has abstracted both devices and services into unit files, we can create arbitrary relationships such as this one. Asking a unit to begin as the result of a device starting then becomes a trivial task, as opposed to using udev's RUN, which could cause problems by inlining scripts into the pipeline that actually initializes the device.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-5" id="outline-container-enabling-the-service"&gt;
&lt;h5 id="enabling-the-service"&gt;Enabling the Service&lt;/h5&gt;
&lt;div class="outline-text-5" id="text-enabling-the-service"&gt;
&lt;p&gt;
We now have a systemd service file defining the script we want to run as a result of inserting a disk. How do we enable it?
&lt;/p&gt;

&lt;p&gt;
One option is to install it system-wide into &lt;code&gt;/etc/systemd/system&lt;/code&gt;, but we're going to use a &lt;i&gt;user instance&lt;/i&gt; for this script. Partially to get familiar with user instances, and partially because it fits our use case: I, as a user, want to run this script based on a trigger. It also follows the principle of least privilege and I have all my dotfiles tracked anyway, so this process becomes nicely version controlled.
&lt;/p&gt;

&lt;p&gt;
Luckily this is pretty straightforward. By placing the unit in &lt;code&gt;/home/$user/.config/systemd/user/autorip.service&lt;/code&gt; (I've named my unit "autorip" here), the user systemd instance becomes aware of the service unit.
&lt;/p&gt;

&lt;p class="info"&gt;
&lt;b&gt;Note&lt;/b&gt;: This was done on an Arch Linux machine which is thoroughly steeped in systemd, so I'm not sure what the steps may be to leverage systemd user instances on another distro. I will mention that after some recent upgrades, I had to follow &lt;a class="info" href="https://wiki.archlinux.org/index.php/Systemd/User#Automatic_start-up_of_systemd_user_instances"&gt;the Arch Wiki instructions to enable user instances to persist after log-out&lt;/a&gt;, otherwise enabled services disappear once the user session is destroyed.
&lt;/p&gt;

&lt;p&gt;
Now that our user instance is aware of the unit's presence, just enable it:
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;shell&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-shell"&gt;&lt;code&gt;&lt;code&gt;systemctl --user enable autorip.service&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
This means that, among other things, our WantedBy setting takes effect, asking to be activated when the cdrom unit is activated.
&lt;/p&gt;

&lt;p&gt;
That's it! Now when the cdrom is inserted, our unit will get triggered, and we get useful script output logging for free.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-the-script"&gt;
&lt;h4 id="the-script"&gt;The Script&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-the-script"&gt;
&lt;p&gt;
Let's talk about the script we need. I initially turned to &lt;a href="https://handbrake.fr/"&gt;HandBrake&lt;/a&gt;, which is an excellent tool for media ripping that also has a command-line utility. I tried a few scripts with it, which worked, but were difficult to get working with a ratio of size to quality that I wanted.
&lt;/p&gt;

&lt;p&gt;
It turns out Don Melton has &lt;a href="https://github.com/donmelton/video-transcoding-scripts"&gt;some absolutely fantastic scripts&lt;/a&gt; that leverage Handbrake for very well-tuned video encoding. I &lt;code&gt;homeshick clone&lt;/code&gt;-ed this and symlinked the scripts into my homeshick-tracked &lt;code&gt;~/.bin&lt;/code&gt; $PATH directory, so my user can call on &lt;code&gt;transcode-video.sh&lt;/code&gt; properly.
&lt;/p&gt;

&lt;p&gt;
All that remains is to glue some pieces together to actually encode the video. &lt;a href="https://gist.github.com/tylerjl/37ef2f52cb23e52d3ca5"&gt;Here's a simplified version&lt;/a&gt; of the script I wrote. Some parts to note:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;I'm using zsh - some features like that &lt;code&gt;${(C)..}&lt;/code&gt; syntax can be shell-specific. (that capitalizes a string, by the way)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filmdate.py&lt;/code&gt; is a small utility I wrote to attempt a guess at the year of a film's title. &lt;a href="https://github.com/tylerjl/filmdate"&gt;The source is on github&lt;/a&gt; if you're interested. I used this because there's little (if any) metadata available on the disk to rely on, and most post-processors need, at minimum, the title and year to parse what movie the filename contains.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;WorkingDirectory&lt;/code&gt; setting in the unit is a temporary directory that I can write the file in, and the last &lt;code&gt;mv&lt;/code&gt; in the script drops the finished file into a directory that my setup watches to pick up media.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
If you've ever tried automation like this, you know that the amount of information you can glean from a plain DVD is pretty bare; essentially only the (sometimes mangled) title is available. In my script I attempt to pull the title from Handbrake, which can sometimes fail. In that case you'll notice I use &lt;code&gt;:=&lt;/code&gt; variable assignment. This allows me to use the &lt;code&gt;set-environment&lt;/code&gt; action in systemd before inserting a disk if I want to statically set the film title before attempting to rip a disk. Thus if I know that a particularly ugly title is going into the DVD drive, I can use:
&lt;/p&gt;

&lt;!-- Troll level: subtle --&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;shell&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-shell"&gt;&lt;code&gt;&lt;code&gt;systemctl --user set-environment &lt;span class="org-variable-name"&gt;TITLE&lt;/span&gt;=&lt;span class="org-string"&gt;"Justin.Bieber.Never.Say.Never"&lt;/span&gt;&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
This means that my script will not overwrite the TITLE variable if it finds one in the environment. This is a little clunky because we set set this globally across all user units instead of for our specific unit, but it works well enough. Issuing
&lt;/p&gt;

&lt;span class="org-src-tab"&gt;&lt;span&gt;shell&lt;/span&gt;&lt;/span&gt;&lt;div class="org-src-container"&gt;
&lt;pre class="src src-shell"&gt;&lt;code&gt;&lt;code&gt;systemctl --user unset-environment TITLE&lt;/code&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Means the script will fallback to using Handbrake to attempt auto-detection. &lt;code&gt;SELECT_TITLE&lt;/code&gt; behaves similarly if the automation can't determine the correct title.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="outline-4" id="outline-container-conclusion"&gt;
&lt;h4 id="conclusion"&gt;Conclusion&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-conclusion"&gt;
&lt;p&gt;
With the script in the right location for our unit's &lt;code&gt;ExecStart&lt;/code&gt; and the &lt;code&gt;.service&lt;/code&gt; enabled, DVDs inserted into the system will trigger activation of our user service. In my case, the first &lt;code&gt;ExecStart&lt;/code&gt; should succeed, moving the file into a pickup location for Kodi, and then eject the disk. This means that digitization is just a matter of inserting the disk and taking it out when I get a &lt;a href="https://pushover.net/"&gt;Pushover&lt;/a&gt; notification from &lt;a href="https://couchpota.to/"&gt;Couchpotato&lt;/a&gt; that my media has been captured correctly.
&lt;/p&gt;

&lt;p&gt;
There's lots of room for improvement here - for example, parsing DVD titles can be finicky, which still requires manual intervention to fix by setting environment variables for the unit. However, the process is much more streamlined than using a point-and-click method, and helped me archive a pretty big stack of media with very little human interaction.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>Tyblog</author><pubDate>Sat, 11 Jul 2015 09:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tjll.net/systemd-for-device-activation-and-media-archiving/</guid></item><item><title>A full play through of my HTML5 game, CanyonRunner</title><link>https://zackproser.com/videos/canyonrunner-playthrough</link><description>I built a complete game using the Phaser.js game development framework</description><author>Zachary Proser</author><pubDate>Sat, 11 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zackproser.com/videos/canyonrunner-playthrough</guid></item><item><title>Bosnia and Hercegovina travel bookmarks</title><link>https://xenodium.com/bosnia-and-hercegovina-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/bosnia-and-hercegovina/travel-tips-and-articles/ten-reasons-to-visit-bosnia-hercegovina"&gt;Ten reasons to visit Bosnia &amp;amp; Hercegovina&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 11 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/bosnia-and-hercegovina-travel-bookmarks</guid></item><item><title>Ireland travel bookmarks</title><link>https://xenodium.com/ireland-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Skellig_Michael"&gt;Skellig Michael&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fishy Fishy in Kinsale: beautiful town on the water.&lt;/li&gt;
&lt;li&gt;Belfast.&lt;/li&gt;
&lt;li&gt;Giant's Causeway.&lt;/li&gt;
&lt;li&gt;Greyhound dog races at Shelbourne Park.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/bilderbergh/status/1066223113774514176?s=12"&gt;Old library chamber, Trinity College, Dublin&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 11 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/ireland-travel-bookmarks</guid></item><item><title>AWS EC2 Instance Types to Use as Test Agents</title><link>https://boyter.org/2015/07/aws-ec2-instance-types-test-agents/</link><description>&lt;p&gt;When you are running test agents on AWS knowing what instance type to run as test agents (for TeamCity or otherwise) can involve a lot of trial and error. Not only can there be great savings to be made by picking the correct instance type you can speed up your builds and get test feedback back faster which can be far more valuable the cost of a few additional cents an hour.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 10 Jul 2015 11:03:10 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/aws-ec2-instance-types-test-agents/</guid></item><item><title>Interview: Die E-Commerce-Plattform von GALERIA Kaufhof</title><link>https://manuel.kiessling.net/2015/07/09/interview-die-e-commerce-plattform-von-galeria-kaufhof/</link><description>In Ausgabe #23 der ShopTechTalks unterhält sich Roman Zenner mit Michael Wegener (talentformation GmbH) und mir über die selbst entwickelte E-Commerce-Plattform von GALERIA Kaufhof. Wir berichten unter anderem über die nötigen Schritte von einer monolithischen Shop-Lösung, die primär von einem externen Dienstleister weiterentwickelt und gepflegt wurde hin zu einem verteilten System, an dem interne Teams arbeiten:</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Thu, 09 Jul 2015 18:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2015/07/09/interview-die-e-commerce-plattform-von-galeria-kaufhof/</guid></item><item><title>Pizza in London</title><link>https://xenodium.com/pizza-in-london</link><description>&lt;p&gt;Not tried these yet. Taking note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bravi Ragazzi (Streatham).&lt;/li&gt;
&lt;li&gt;Homeslice (Covent Garden).&lt;/li&gt;
&lt;li&gt;Lord Morpeth (Hackney).&lt;/li&gt;
&lt;li&gt;Santa Maria (Ealing).&lt;/li&gt;
&lt;li&gt;Voodoo Ray's (Dalston).&lt;/li&gt;
&lt;li&gt;Well Kneaded Wagon (Date-dependent location).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 09 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/pizza-in-london</guid></item><item><title>mp4 to gif</title><link>https://xenodium.com/mp4-to-gif</link><description>&lt;p&gt;Converting mp4 to gif is handy for posting short screencasts. You can convert to gif using ffmpeg and optimize with imagemagick. To install:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;apt-get install ffmpeg imagemagick (linux)
brew install ffmpeg imagemagick (Mac)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Convert to gif:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;ffmpeg -i my.mp4 -pix_fmt rgb24 -r 5 my.gif
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Optimize with:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;convert -dither none -layers Optimize my.gif my_optimized.gif
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;UPDATE: There's also licecap and subsequently optimize with:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;cat source.gif | gifsicle --colors 256 --optimize=3 --delay=15 &amp;gt; target.gif
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;UPDATE: &lt;a href="https://gist.github.com/dergachev/4627207"&gt;Also consider for .mov&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;ffmpeg -i in.mov -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 &amp;gt; out.gif
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 09 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/mp4-to-gif</guid></item><item><title>Fantasy News</title><link>https://solomon.io/fantasy-news/</link><description>Fantasy News is a year-round community for fantasy sports fans.</description><author>Sam Solomon</author><pubDate>Thu, 09 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/fantasy-news/</guid></item><item><title>Exploring Microservices Architecture on Heroku</title><link>https://www.brightball.com/articles/exploring-microservices-architecture-on-heroku</link><description>Building an application with a microservice architecture is an excellent long-term decision if you can afford the increase in upfront time investment to do it properly. Heroku provides a platform that most developers know for simple deployment, but it also dramatically simplifies microservices architecture.</description><author>Brightball Articles</author><pubDate>Thu, 09 Jul 2015 02:17:02 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/exploring-microservices-architecture-on-heroku</guid></item><item><title>The Drawing of the Three (The Dark Tower, #2)</title><link>https://apurva-shukla.me/bookshelf/the-drawing-of-the-three-the-dark-tower-2/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ I loved every single second of the book!

While this book serves to continue the storyline, it does so wonderfully.</description><author>Apurva Shukla's RSS Feed</author><pubDate>Wed, 08 Jul 2015 11:18:05 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-drawing-of-the-three-the-dark-tower-2/</guid></item><item><title>Issues with Google's Bug Prediction Algorithm</title><link>https://boyter.org/2015/07/issues-googles-bug-prediction-algorithm/</link><description>&lt;p&gt;December 2011 the Google Engineering team published a blog post about &lt;a href="http://google-engtools.blogspot.com.au/2011/12/bug-prediction-at-google.html"&gt;bug prediction at Google&lt;/a&gt;. The topic caused quite a lot of discussion at the time over the internet on forums such as Hacker News and the Reddit programming sub-reddit.&lt;/p&gt;
&lt;p&gt;How bug prediction works&lt;/p&gt;
&lt;p&gt;In a nutshell the prediction works by ranking files against checking the file commit history and seeing how many changes have been flagged as bug fixes. Of course this means that code which was previously buggy will still appear in the list. This issue was also addressed in the post and the results were weighted over time to deal with this issue.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 08 Jul 2015 10:58:57 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/issues-googles-bug-prediction-algorithm/</guid></item><item><title>Oh-My-Vagrant “Mainstream” mode and COPR RPM's</title><link>https://purpleidea.com/blog/2015/07/08/oh-my-vagrant-mainstream-mode-and-copr-rpms/</link><description>&lt;p&gt;Making &lt;a href="https://github.com/purpleidea/oh-my-vagrant"&gt;Oh-My-Vagrant&lt;/a&gt; (OMV) more developer accessible and easy to install (from a distribution package like RPM) has always been a goal, but was previously never a priority. This is all sorted out now. In this article, I&amp;rsquo;ll explain how &amp;ldquo;mainstream&amp;rdquo; mode works, and how the RPM work was done. (I promise this will be somewhat interesting!)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;Prerequisites&lt;/span&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you haven&amp;rsquo;t read any of the &lt;a href="https://purpleidea.com/tags/oh-my-vagrant/"&gt;previous articles about Oh-My-Vagrant&lt;/a&gt;, I&amp;rsquo;d recommend you start there. Many of the articles include screencasts, and combined with the &lt;a href="https://github.com/purpleidea/oh-my-vagrant/tree/master/examples"&gt;examples/&lt;/a&gt; folder, this is probably the best way to learn OMV, because the &lt;a href="https://github.com/purpleidea/oh-my-vagrant/issues/79"&gt;documentation could use some love&lt;/a&gt;.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Wed, 08 Jul 2015 04:14:19 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/07/08/oh-my-vagrant-mainstream-mode-and-copr-rpms/</guid></item><item><title>CentOS 7 and HA</title><link>https://smcleod.net/2015/07/centos-7-and-ha/</link><description>&lt;p&gt;First some background&amp;hellip;&lt;/p&gt;
&lt;p&gt;One of the many lessons I&amp;rsquo;ve learnt from my Linux HA / Storage clustering project is that the Debian HA ecosystem is essentially broken, We reached the point where packages were too old, too buggy or in Debian 8&amp;rsquo;s case - outright missing.&lt;/p&gt;
&lt;p&gt;In the past I was very disappointed with RHEL/CentOS 5 / 6 and (until now) have been quite satisfied with Debian as a stable server distribution with historicity more modern packages and kernels.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Tue, 07 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/07/centos-7-and-ha/</guid></item><item><title>Adventures after Google I/O-3(GCM).</title><link>https://prashamhtrivedi.in/adventures-GCM-3.html</link><description>After trying and playing some new stuffs(except M preview) released in Google I/O, I have found some trivial things to take care of. In this part, we will see how GCM 3.0 gives advantage to server team to send notifications and how implementing it affects Android Development.</description><author>Prasham H Trivedi</author><pubDate>Tue, 07 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/adventures-GCM-3.html</guid></item><item><title>WCF net.tcp test client in PowerShell</title><link>https://allanrbo.blogspot.com/2014/08/wcf-nettcp-test-client-in-powershell.html</link><description>Here's a convenient way of creating a WCF net.tcp client for a quick test. It uses PowerShell to compile C# code to an exe on the fly. Note that the interface can be partial (only containing the method you want to call).

&lt;pre&gt;
$source = '
    using System;
    using System.ServiceModel;

    [ServiceContract(Namespace = "http://example.com/SomeSchema")]
    public interface ISomeService
    {
        [OperationContract]
        bool SomeMethod();
    }

    public class Wcftest
    {
        public static void Main(string[] args)
        {
            var binding = new NetTcpBinding();
            var address = new EndpointAddress("net.tcp://" + args[0] + ":808/SomeService");

            var factory = new ChannelFactory&amp;lt;ISomeService&amp;gt;(binding, address);
            var proxy = factory.CreateChannel();

            Console.WriteLine(proxy.SomeMethod());
        }
    }
'
Add-Type `
    -ReferencedAssemblies 'System.ServiceModel.dll' `
    -TypeDefinition $source `
    -Language CSharp `
    -OutputAssembly 'c:\windows\temp\wcftest.exe' `
    -OutputType 'ConsoleApplication'

c:\windows\temp\wcftest.exe "example.com"
del c:\windows\temp\wcftest.*
&lt;/pre&gt;</description><author>Allan's Blog</author><pubDate>Mon, 06 Jul 2015 13:39:39 GMT</pubDate><guid isPermaLink="true">https://allanrbo.blogspot.com/2014/08/wcf-nettcp-test-client-in-powershell.html</guid></item><item><title>What is Usability Testing?</title><link>https://boyter.org/2015/07/usability-testing/</link><description>&lt;p&gt;Usability tests are manual tests used to check that the user interface is understandable. The focus of the tests are to ensure that product meets its intended purpose. These sort of tests can be subjective and are usually impossible to automate. It is important to differentiate usability testing from simply showing an interface to someone and asking them &amp;ldquo;Do you understand how this?&amp;rdquo;. It is usually done by creating a scenario such as &amp;ldquo;Can you find and add this song to a new playlist&amp;rdquo; and observing the steps that the user takes to perform the task.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 06 Jul 2015 10:57:30 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/usability-testing/</guid></item><item><title>Keyboards bookmarks</title><link>https://xenodium.com/keyboards-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.keyboardco.com/blog/index.php/2012/12/an-introduction-to-cherry-mx-mechanical-switches/"&gt;An introduction to Cherry MX mechanical switches&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codekeyboards.com"&gt;Code keyboard&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ethanaa.com/blog/i-%E2%99%A5-keyboards/#silver"&gt;I ♥ Keyboards | Ethan Anderson&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.keyboard.io/"&gt;Keyboardio Blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.keychron.com/"&gt;Keychron | Wireless Mechanical Keyboards for Mac, Windows and phones&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://colemak.com/Learn"&gt;Learn - Colemak keyboard layout&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mechdb.net/"&gt;Mechanical Keyboards Database - custom keyboards photos&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://5z6p.com/products/plaid-through-hole/"&gt;Plaid // Keyboard base board&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ultimatehackingkeyboard.com/shop"&gt;Products – Ultimate Hacking Keyboard&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/cyberDeck/"&gt;r/cyberDeck&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/ErgoMechKeyboards/"&gt;r/ErgoMechKeyboards&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17989303"&gt;Ultimate Hacking Keyboard (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sittingscribe.com/why-learn-the-colemak-keyboard-layout/"&gt;Why Learn the Colemak Keyboard Layout?&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 06 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/keyboards-bookmarks</guid></item><item><title>Leather Backpack</title><link>https://june.kim/leather-backpack/</link><author>june.kim</author><pubDate>Mon, 06 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/leather-backpack/</guid></item><item><title>The One Question Every Prospective College Student Should Be Asking</title><link>https://tiltingatwindmills.dev/the-one-qu-be-asking/</link><description>Apologies for the clickbaity headline. That sort of thing isn't usually my
style. I'll cut right to the chase. The question is "What…</description><author>Tilting at Windmills</author><pubDate>Mon, 06 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/the-one-qu-be-asking/</guid></item><item><title>July 2015 Project List</title><link>https://venam.net/blog/programming/2015/07/06/project-summer-july-2015.html</link><description>Hello fellow readers,  In this post I'll list some of the projects I'm currently working on.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Mon, 06 Jul 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/programming/2015/07/06/project-summer-july-2015.html</guid></item><item><title>Parallels</title><link>https://olshansky.info/movie/parallels/</link><description>Olshansky's review of Parallels</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 05 Jul 2015 17:13:24 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/parallels/</guid></item><item><title>Mutation Testing or How to Test Tests</title><link>https://boyter.org/2015/07/mutation-testing-test-tests/</link><description>&lt;p&gt;Mutation testing is a technique used to verify that tests are providing value. Mutation testing involves modifying the given program in small ways. These could include changing boolean checks such as if a condition is True to being False. A mutated version of code is known as a mutant. For each mutant a the test suite is run against it. The tests when run over the mutant version should have a percentage of failure. Where a mutant is not caught additional tests can be written to cover these cases.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sun, 05 Jul 2015 10:56:03 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/mutation-testing-test-tests/</guid></item><item><title>United States travel bookmarks</title><link>https://xenodium.com/united-states-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.abandonedamerica.us/"&gt;Abandoned America&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/usa/travel-tips-and-articles/americas-best-food-cities-for-travelers-on-a-budget/40625c8c-8a11-5710-a052-1479d2756c74"&gt;America's best food cities for travelers on a budget - Lonely Planet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Antelope_Canyon"&gt;Antelope Canyon (Arizona)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.statelibraryofiowa.org/services/collections/law-library"&gt;Law Library in Iowa&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qr.ae/pGIlFt"&gt;Peter Wade's answer has restaurants throughout the US&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=Supai%252C+Arizona&amp;amp;t=ffab&amp;amp;iax=1&amp;amp;ia=images"&gt;Supai, Arizona&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://texastriffidranch.com/"&gt;The Texas Triffid Ranch | Dallas's Pretty Much Only Carnivorous Plant Gallery&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q%3DTurnip%2BRock%2Bin%2BPort%2BAustin%252C%2BMichigan&amp;amp;t%3Dffab&amp;amp;iax%3D1&amp;amp;ia%3Dimages"&gt;Turnip Rock in Port Austin, Michigan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/EarthPix/status/613912754227965952/photo/1"&gt;Vance Creek Bridge in Washington&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wta.org/"&gt;Washington trail association (hiking)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/Where-can-I-afford-to-live-in-NYC-with-a-100-000-salary-and-no-debt"&gt;Where can I afford to live in NYC with a $100,000 salary and no debt? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 05 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/united-states-travel-bookmarks</guid></item><item><title>Lebanon travel bookmarks</title><link>https://xenodium.com/lebanon-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Baatara_gorge_waterfall"&gt;Baatara gorge waterfall&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instagram.com/steakcrush"&gt;STEAK CRUSH (@steakcrush)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 05 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/lebanon-travel-bookmarks</guid></item><item><title>Slovenia travel bookmarks</title><link>https://xenodium.com/slovenia-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://wildswim.com/lake-bohinj"&gt;Lake Bohinj&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 05 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/slovenia-travel-bookmarks</guid></item><item><title>Belgium travel bookmarks</title><link>https://xenodium.com/belgium-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/planetepics/status/617003120695099392/photo/1"&gt;The Flower Carpet event at the Grand-Place in Brussels&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zerokspot.com/weblog/2020/02/03/travel-arrangements-brussels/"&gt;Travel arrangements around Brussels - zerokspot.com&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 05 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/belgium-travel-bookmarks</guid></item><item><title>Leather Valet Tray</title><link>https://june.kim/valet-tray/</link><author>june.kim</author><pubDate>Sun, 05 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/valet-tray/</guid></item><item><title>Travis CI and Sauce Labs</title><link>https://kyrofa.com/posts/travis-ci-and-sauce-labs/</link><description>I think we can all agree that testing one&amp;rsquo;s Rails project is a good thing. I think we can also agree that those tests should be run on a regular basis (i.e. after every change). I think it&amp;rsquo;s a logical conclusion then that having a continuous integration environment setup for one&amp;rsquo;s project would be considered ideal. This is really pretty easy for open-source projects, since a number of companies provide free support for them.</description><author>kyrofa's blog</author><pubDate>Sun, 05 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/travis-ci-and-sauce-labs/</guid></item><item><title>Who is Responsible for Software Quality?</title><link>https://boyter.org/2015/07/responsible-software-quality/</link><description>&lt;p&gt;In the beginning of my software development career I was interviewing for an intern position at Microsoft. I never did get the job but one think out of that interview process really stuck with. The second interviewer after the usual getting to know you chat aded me the following question. &amp;ldquo;On any given software project we have developers, software testers / quality assurance and managers involved. Who is responsible for the quality of the software?&amp;rdquo;. Being young and naive I confidently responded that the QA/testers were. After a long discussion artfully controlled by the interviewer I came to change my opinion. Below is the line of reasoning I went through with him.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sat, 04 Jul 2015 10:54:08 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/responsible-software-quality/</guid></item><item><title>Talks</title><link>https://boyter.org/talks/</link><description>&lt;p&gt;A few of the talks I have given and the slide desks are included below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python @ searchcode.com &lt;a href="http://www.boyter.org/wp-content/uploads/2015/07/sypy_searchcode.key.zip"&gt;sypy_searchcode.key&lt;/a&gt; (keynote) &lt;a href="http://www.boyter.org/wp-content/uploads/2015/07/sypy_searchcode.pptx"&gt;sypy_searchcode&lt;/a&gt; (powerpoint)&lt;/li&gt;
&lt;li&gt;Decoding CAPTCHA’s for Fun and Profit &lt;a href="https://github.com/boyter/decodingcaptchas"&gt;DecodingCaptchas Reveal.js&lt;/a&gt; (futher details can be found &lt;a href="http://www.boyter.org/2015/03/decoding-captchas-presentation/"&gt;http://www.boyter.org/2015/03/decoding-captchas-presentation/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;How AWS and Go Transformed a Public Broadcaster &lt;a href="https://boyter.org/static/aws-go-archive-presso/"&gt;https://boyter.org/static/aws-go-archive-presso/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sloc Cloc and Code - Can a crusty Go program outperform a well written Rust Project? &lt;a href="https://boyter.org/static/gophercon-syd-presentation/"&gt;https://boyter.org/static/gophercon-syd-presentation/&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=jd-sjoy3GZo"&gt;https://www.youtube.com/watch?v=jd-sjoy3GZo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DataEngBytes 2023 - Processing 40 TB of code from ~10 million projects with a dedicated server and Go for $100 &lt;a href="https://boyter.org/static/dataenbytes2023/"&gt;https://boyter.org/static/dataenbytes2023/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GopherCon 2023 - Bloom Filters: Building a Cutting Edge Go Search Engine to Explore the World&amp;rsquo;s Source Code &lt;a href="https://boyter.org/static/gophercon-syd-presentation-2023/"&gt;https://boyter.org/static/gophercon-syd-presentation-2023/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sat, 04 Jul 2015 09:12:08 GMT</pubDate><guid isPermaLink="true">https://boyter.org/talks/</guid></item><item><title>The Essays of Warren Buffett : Lessons for Corporate America</title><link>https://olshansky.info/book/the_essays_of_warren_buffett/</link><description>Olshansky's review of The Essays of Warren Buffett : Lessons for Corporate America by Warren Buffett</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 04 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/the_essays_of_warren_buffett/</guid></item><item><title>Starting Elm</title><link>https://gilmi.me/post/2015/07/04/starting-elm</link><description>&lt;p&gt;&lt;b&gt;Edit&lt;/b&gt;: this is old and probably no longer accurate!&lt;/p&gt;&lt;p&gt;** &lt;i&gt;This post has been revamped and added to the Elm website, you can read it &lt;a href="http://elm-lang.org/get-started"&gt;here&lt;/a&gt;.&lt;/i&gt; **&lt;/p&gt;&lt;p&gt;In this post I will try to guide you through some first steps of writing &lt;a href="http://elm-lang.org"&gt;Elm&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;First, we'll talk about the installation process and the tools that come with it,
but since Elm has a pretty good &lt;a href="http://elm-lang.org/try"&gt;Online Editor&lt;/a&gt; you can definitely skip it for now.&lt;/p&gt;&lt;p&gt;After that we'll talk about actually learning how to write Elm programs.
The &lt;a href="http://elm-lang.org"&gt;Elm website&lt;/a&gt; has a lot of information in it and it's not always clear where to start,
so this guide will try to put these heap of information into order.&lt;/p&gt;&lt;h1 id="installation"&gt;Installation&lt;/h1&gt;&lt;p&gt;First, visit the &lt;a href="http://elm-lang.org/install"&gt;Install page&lt;/a&gt; on the elm site, download an installer for your
platform and install Elm-platform, which will install the following tools:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;elm&lt;/li&gt;&lt;li&gt;elm-package&lt;/li&gt;&lt;li&gt;elm-make&lt;/li&gt;&lt;li&gt;elm-repl&lt;/li&gt;&lt;li&gt;elm-reactor&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Let's go over them one by one:&lt;/p&gt;&lt;h2 id="elm"&gt;elm&lt;/h2&gt;&lt;p&gt;&lt;code&gt;elm&lt;/code&gt; is actually a way to run all other tools.
Try opening a terminal and run &lt;code&gt;elm&lt;/code&gt; to see the help message.&lt;/p&gt;&lt;h2 id="elm-package"&gt;elm-package&lt;/h2&gt;&lt;p&gt;&lt;a href="https://github.com/elm-lang/elm-package"&gt;elm-package&lt;/a&gt; is a package managing tool for elm, making it easy to install and publish packages
to and from &lt;a href="http://package.elm-lang.org"&gt;package.elm-lang.org&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;When starting a new elm project, run:&lt;/p&gt;&lt;pre&gt;&lt;code class="sh"&gt;elm package install&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This will install the &lt;code&gt;elm-core&lt;/code&gt; package and will create an elm project file: &lt;code&gt;elm-package.json&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;In &lt;code&gt;elm-package.json&lt;/code&gt; we state information on the project, such as:
the project name, author, license, dependencies, etc.&lt;/p&gt;&lt;h3 id="interesting-commands:"&gt;Interesting commands:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;install&lt;/code&gt;: install dependencies in elm-package.json&lt;/li&gt;&lt;li&gt;&lt;code&gt;publish&lt;/code&gt;: publish your library to package.elm-lang.org&lt;/li&gt;&lt;li&gt;&lt;code&gt;bump&lt;/code&gt;: bump version numbers based on API changes&lt;/li&gt;&lt;li&gt;&lt;code&gt;diff&lt;/code&gt;: get the difference between two APIs&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="elm-make"&gt;elm-make&lt;/h2&gt;&lt;p&gt;&lt;a href="https://github.com/elm-lang/elm-make"&gt;elm-make&lt;/a&gt; is used to compile elm code (file or project) into HTML or JavaScript.&lt;/p&gt;&lt;p&gt;When compiling a file (for example: &lt;code&gt;Main.elm&lt;/code&gt;) into an HTML file (for example: &lt;code&gt;index.html&lt;/code&gt;),
you probably want to write something like this:&lt;/p&gt;&lt;pre&gt;&lt;code class="sh"&gt;elm make Main.elm --output=index.html&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="interesting-flags:"&gt;Interesting flags:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;--warn&lt;/code&gt;: Prints warnings to improve code quality&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="elm-repl"&gt;elm-repl&lt;/h2&gt;&lt;p&gt;&lt;a href="https://github.com/elm-lang/elm-repl"&gt;elm-repl&lt;/a&gt; is a Read-Evaluate-Print Loop tool for Elm.
In it you can write elm expressions and evaluate them using Node.js.
You can also import code and libraries, but for obvious reasons browser related stuff will not work.&lt;/p&gt;&lt;h3 id="important-commands:"&gt;Important commands:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;:help&lt;/code&gt;: will print a help message&lt;/li&gt;&lt;li&gt;&lt;code&gt;:quit&lt;/code&gt;: quit the repl&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="elm-reactor"&gt;elm-reactor&lt;/h2&gt;&lt;p&gt;&lt;a href="https://github.com/elm-lang/elm-reactor"&gt;elm-reactor&lt;/a&gt; is an interactive development tool for elm.
With elm-reactor you can run elm code without using elm-make to compile them first,
&lt;a href="http://elm-lang.org/blog/interactive-programming"&gt;hot swapping&lt;/a&gt; and &lt;a href="http://debug.elm-lang.org/"&gt;time travel debugging&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Running &lt;code&gt;elm reactor&lt;/code&gt; will open a web server on 0.0.0.0:8000
where you can go to from any browser and select the file you want to run.
If you want to use elm reactor's abilities, press the wrench next to the name of the file on the left.
It will open the file with a column on the right where you can use those capabilities.&lt;/p&gt;&lt;h3 id="important-flags:"&gt;Important flags:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;-a=ADDRESS&lt;/code&gt;: Change the address in which elm reactor runs. Since the default address, 0.0.0.0 is not supported on browser such as chrome and is broadcasting to anyone, I recommend always using &lt;code&gt;-a=localhost&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;-p=PORT&lt;/code&gt;: Change the port in which elm reactor runs.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So for example, if you want to run the elm reactor, write:&lt;/p&gt;&lt;pre&gt;&lt;code class="sh"&gt;elm reactor -a=localhost&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="learning-elm"&gt;Learning Elm&lt;/h1&gt;&lt;p&gt;In the &lt;a href="http://elm-lang.org/docs"&gt;documentation&lt;/a&gt; page on the website, you can find a bunch of resources on elm.&lt;/p&gt;&lt;p&gt;For beginners, I recommend first starting with the &lt;i&gt;Elm Complete Guide&lt;/i&gt; (&lt;a href="http://elm-lang.org/guide/core-language"&gt;link to part 1&lt;/a&gt;) and play with what you learn
on the &lt;code&gt;elm-repl&lt;/code&gt; or &lt;a href="http://elm-lang.org/try"&gt;Online Editor&lt;/a&gt;. Writing Elm is essential to understanding it, and Elm
Provides you the tools to easily do so.&lt;/p&gt;&lt;p&gt;After the Elm Complete Guide, you might want to read about Elm's &lt;a href="http://elm-lang.org/docs/syntax"&gt;Syntax&lt;/a&gt; and &lt;a href="http://elm-lang.org/docs/style-guide"&gt;Style Guide&lt;/a&gt;.
(an important thing to note is that there are constructs in Elm that are indentation sensitive.)&lt;/p&gt;&lt;p&gt;Checkout the many examples in the &lt;a href="http://elm-lang.org/examples"&gt;Examples&lt;/a&gt; page.&lt;/p&gt;&lt;p&gt;Read the &lt;a href="https://github.com/evancz/elm-architecture-tutorial/"&gt;Elm Architecture Tutorial&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;You can also go over the &lt;a href="https://www.classes.cs.uchicago.edu/current/22300-1/Home.html"&gt;cs223 Functional Programming course&lt;/a&gt; by the University of Chicago
which has many good tutorials on elm and purely functional data structures, but bear in mind
that the course uses Elm 0.14.1, which might be a little different. No worries! That's
why you read the complete guide and the syntax guide.&lt;/p&gt;&lt;p&gt;Read more tutorials like &lt;a href="http://bendyworks.com/elm-frontend-right-now/"&gt;Elm for the Frontend, Right Now&lt;/a&gt;,  &lt;a href="https://github.com/TheSeamau5/elm-checkerboardgrid-tutorial"&gt;Checkboard Grid Tutorial&lt;/a&gt; and &lt;a href="http://blog.jessitron.com/2015/08/an-elm-example-reading-url-parameters.html"&gt;Building HTML by Parsing Parameters&lt;/a&gt;
and others you can find on &lt;a href="http://reddit.com/r/elm"&gt;/r/elm&lt;/a&gt; and the &lt;a href="https://groups.google.com/forum/?fromgroups#!forum/elm-discuss"&gt;mailing list&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;But most importantly, don't forget to &lt;b&gt;write code&lt;/b&gt;! Here are a few ideas for simple projects for you to get started:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;An elm program that writes &lt;i&gt;Right&lt;/i&gt; or &lt;i&gt;Left&lt;/i&gt; in the middle of the screen depending on whether the mouse cursor is on the left half of the screen or right half of the screen&lt;/li&gt;&lt;li&gt;An elm program that displays dots randomly on the screen, with reset and pause/play buttons&lt;/li&gt;&lt;li&gt;An elm program that displays the list of repositories of a github user entered on a text field&lt;/li&gt;&lt;li&gt;Snake clone (extra: add highscore)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And, if you ever get stuck, try posting on the &lt;a href="https://groups.google.com/forum/?fromgroups#!forum/elm-discuss"&gt;mailing list&lt;/a&gt; or come to #elm IRC channel on irc.freenode.net&lt;/p&gt;</description><author>λm.me</author><pubDate>Sat, 04 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://gilmi.me/post/2015/07/04/starting-elm</guid></item><item><title>Heroku PostgreSQL vs Amazon RDS for PostgreSQL</title><link>https://www.brightball.com/articles/heroku-postgresql-vs-amazon-rds-for-postgresql</link><description>PostgreSQL is becoming the relational database of choice for web development for a whole host of good reasons.  That means that development teams have to make a decision on whether to  host their own or use a database as a service provider. The two biggest players in the world of PostgreSQL are Heroku PostgreSQL and Amazon RDS for PostgreSQL. Here's a detailed comparison.</description><author>Brightball Articles</author><pubDate>Fri, 03 Jul 2015 14:04:23 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/heroku-postgresql-vs-amazon-rds-for-postgresql</guid></item><item><title>A story about Hubris and Integration Tests</title><link>https://boyter.org/2015/07/story-hubris-integration-tests/</link><description>&lt;p&gt;Philip Dormer Stanhope, 4th Earl of Chesterfield (pictured) managed to embarrass me in front of my peers once. Sort of. In truth it was my hubris that caused the incident. Here is how it happened and what I learnt through the process.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.boyter.org/wp-content/uploads/2016/08/200px-Philip_Stanhope_4th_Earl_of_Chesterfield.png"&gt;&lt;!-- raw HTML omitted --&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the summer of 2010 I was tasked with developing a new application where I worked. The requirement was fairly simple &amp;ldquo;We need a web application to upload a CSV&amp;rdquo;. Requirements such as this aren&amp;rsquo;t exactly conducive to a good outcome but I was confident that given the data required to upload it would be fairly easy to do.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 03 Jul 2015 10:51:07 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/story-hubris-integration-tests/</guid></item><item><title>Fishing with Emacs</title><link>https://xenodium.com/fishing-with-emacs</link><description>&lt;p&gt;OK not quite, but having recently learned about &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Appending-Kills.html"&gt;C-M-w (append-next-kill)&lt;/a&gt;, I used it in a keyboard macro to fish out matching lines. This is similar to &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Other-Repeating-Search.html"&gt;flush-lines&lt;/a&gt;, except the kill ring is also populated. This is handy, if you need the flushed lines. Here's an example.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/fishing-with-emacs/fishing.gif" /&gt;&lt;/p&gt;
&lt;p&gt;Here's the equivalent in Emacs lisp:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(defun flush-kill-lines (regex)
  &amp;quot;Flush lines matching REGEX and append to kill ring.  Restrict to \
region if active.&amp;quot;
  (interactive &amp;quot;sFlush kill regex: &amp;quot;)
  (save-excursion
    (save-restriction
      (when (use-region-p)
        (narrow-to-region (point) (mark))
        (goto-char 0))
      (while (search-forward-regexp regex nil t)
        (move-beginning-of-line nil)
        (kill-whole-line)))))
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 03 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/fishing-with-emacs</guid></item><item><title>California travel bookmarks</title><link>https://xenodium.com/california-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Sequoia_National_Park"&gt;General Sherman Tree at Sequoia National Park&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 03 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/california-travel-bookmarks</guid></item><item><title>Shiny Apps</title><link>https://trigonaminima.github.io/2015/07/shiny-apps/</link><description>This a collection of small shiny apps I have made (or going to make) to learn shiny (by RStudio). The list of apps in this repo are listed (and documented) on this page. To learn more about the apps (what they do and how were they developed to do what they do) just read further.</description><author>Playground</author><pubDate>Thu, 02 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://trigonaminima.github.io/2015/07/shiny-apps/</guid></item><item><title>Update on Rigel and response from DjurAkuten</title><link>https://liza.io/update-on-rigel-and-response-from-djurakuten/</link><description>&lt;p&gt;Context: &lt;a href="https://liza.io/the-month-from-hell/"&gt;The Month from Hell&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="djurakuten"&gt;DjurAkuten&lt;/h2&gt;
&lt;p&gt;After numerous attempts David finally got through to DjurAkuten, the clinic that did Rigel&amp;rsquo;s neutering surgery and decided to put a catheter in him because they thought his bladder looked big - the one he left with a urinary infection and an inability to pee.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Wed, 01 Jul 2015 14:41:58 GMT</pubDate><guid isPermaLink="true">https://liza.io/update-on-rigel-and-response-from-djurakuten/</guid></item><item><title>How searchcode.com is Unit and Integration Tested</title><link>https://boyter.org/2015/07/searchcode-com-unit-integration-tested/</link><description>&lt;p&gt;searchcode is a source code and documentation search engine. It allows users to is search over 20 billions lines of code and millions of API documentation. It at the time of writing gets over 300,000 unique visitors a month processes many millions of API requests.&lt;/p&gt;
&lt;p&gt;What follows is how I am testing searchcode, the issues I hit and where I think I am getting the most value. As big believer in testing as a methodology of improving code quality, one of my goals when rewriting searchcode was to ensure that it had a comprehensive test suite.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 01 Jul 2015 10:46:18 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/07/searchcode-com-unit-integration-tested/</guid></item><item><title>Rebind caps lock to control key on Mac OS X</title><link>https://xenodium.com/rebind-caps-lock-to-control-key-on-mac-os-x</link><description>&lt;p&gt;Let's see if this one sticks. I'll give caps lock as control a try. Rebinding the keys on Mac OS X is easy enough:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/rebind-caps-lock-to-control-key-on-mac-os-x/caps-lock-to-control.png" /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;System Preferences -&amp;gt; Keyboard -&amp;gt; Keyboard Tab -&amp;gt; Modifier Keys…&lt;/p&gt;
&lt;/blockquote&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 01 Jul 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/rebind-caps-lock-to-control-key-on-mac-os-x</guid></item><item><title>Flaky Tests</title><link>https://boyter.org/2015/06/flaky-tests/</link><description>&lt;p&gt;A test is considered flaky or flakey if it if fails occasionally. Generally flaky tests are considered to be a bad thing and should be modified to ensure they work correctly every time. This is because a test that is not trustworthy will be ignored even when indicating real failure.&lt;/p&gt;
&lt;p&gt;There are many situations that can cause to become flaky. Integration and acceptance tests are generally the tests in your test suite most likely to become flaky. They generally have more integrations across your software stack and as such there are more things likely to go wrong. We going to go through a few of the main reasons and go through in detail what you can do about a specific one.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 01 Jul 2015 01:50:04 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/06/flaky-tests/</guid></item><item><title>Clean Testable Repository Data Access in C Sharp</title><link>https://boyter.org/2015/06/clean-testable-repository-data-access-sharp/</link><description>&lt;p&gt;Below is an implementation of an extremely clean data access pattern possible using C# and Entity Framework. It saves you the effort of mocking the database context as the code you end up writing is so simple it is all compile time checked.&lt;/p&gt;
&lt;p&gt;The advantages of this are firstly that everything is very easy to test as you can perform all joins in your service layer with mocks of the repository. Secondly it makes your data layer stupidly simple allowing you to forgo writing many tests which would provide little value.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 01 Jul 2015 01:44:13 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/06/clean-testable-repository-data-access-sharp/</guid></item><item><title>Passing Static Credentials Upstream through NGinx: Making NGinx add credentials to upstream requests</title><link>https://joshuarogers.net/articles/2015-06/passing-static-credentials-upstream-through-nginx/</link><description>Just over a year ago we went over how to setup a reverse proxy that would require our users to authenticate. In our original proxy article, we generated some NGinx configuration that looked a bit like&amp;hellip;
location / { proxy_pass http://jira; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } And it worked. And everyone was happy. Until the day the request came in that NGinx should add a fixed set of credentials to all upstream web requests.</description><author>Joshua Rogers</author><pubDate>Tue, 30 Jun 2015 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2015-06/passing-static-credentials-upstream-through-nginx/</guid></item><item><title>Searchable ebooks in Emacs</title><link>https://xenodium.com/searchable-ebooks-in-emacs</link><description>&lt;p&gt;If you haven't bought &lt;a href="https://www.masteringemacs.org/book"&gt;Mastering Emacs&lt;/a&gt; by &lt;a href="https://twitter.com/mickeynp"&gt;Mickey Petersen&lt;/a&gt;, you should. It's a wonderful source of Emacs tips. Having just finished the ebook on my Kindle, I was keen to go back and fish out some of that newly found wisdom. My immediate reaction was to figure out a way to make the ebook searchable from Emacs.&lt;/p&gt;
&lt;p&gt;The ebook is available in epub and pdf format. Though Emacs's docview is super handy for viewing pdf's, searching didn't feel as comfortable as searching in org mode. The epub, on the other hand, proved useful. &lt;a href="http://pandoc.org"&gt;Pandoc&lt;/a&gt; can easily convert from epub to org.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;pandoc  --from=epub --to=org mastering-emacs.epub &amp;gt; mastering-emacs.org
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After a some tidying (mostly removing BEGIN_HTML/END_HTML blocks and adding TITLE/AUTHOR), the resulting org file is surprisingly clean and easy to search/navigate. &lt;a href="https://github.com/ShingoFukuyama/helm-swoop"&gt;helm-swoop&lt;/a&gt; and &lt;a href="https://github.com/emacs-helm/helm/blob/199b9feb396eedc0e502dd767b19060f7dc09f6a/helm-org.el"&gt;helm-org-in-buffer-headings&lt;/a&gt; are great for that.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/searchable-ebooks-in-emacs/mastering-emacs-org-00.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/searchable-ebooks-in-emacs/mastering-emacs-org-01.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/searchable-ebooks-in-emacs/mastering-emacs-org-02.png" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 30 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/searchable-ebooks-in-emacs</guid></item><item><title>Cerberus 0.9 has been released</title><link>https://nicolaiarocci.com/cerberus-0-9-has-been-released/</link><description>&lt;p&gt;A few days ago &lt;a href="https://github.com/nicolaiarocci/cerberus"&gt;Cerberus 0.9&lt;/a&gt; was released. It includes a bunch of new cool features, let’s browse through some of them.&lt;/p&gt;
&lt;h2 id="collection-rules"&gt;Collection rules&lt;/h2&gt;
&lt;p&gt;First up is the new set of &lt;code&gt;anyof&lt;/code&gt;, &lt;code&gt;allof&lt;/code&gt;, &lt;code&gt;noneof&lt;/code&gt; and &lt;code&gt;oneof&lt;/code&gt; validation rules. &lt;code&gt;anyof&lt;/code&gt; allows you to list multiple sets of rules to validate against. The field will be considered valid if it validates against one set in the list. For example, to verify that a property is a number between 0 and 10 or 100 and 110, you could do the following:&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 30 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/cerberus-0-9-has-been-released/</guid></item><item><title>The long road to Async/Await in JavaScript</title><link>https://thomashunter.name/posts/2015-06-30-the-long-road-to-asyncawait-in-javascript</link><author>Thomas Hunter II</author><pubDate>Tue, 30 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2015-06-30-the-long-road-to-asyncawait-in-javascript</guid></item><item><title>The Hybrid World is Coming</title><link>https://tanelpoder.com/2015/06/29/the-hybrid-world-is-coming/</link><description>&lt;p&gt;Here’s the video of E4 keynote we delivered together with &lt;a href="http://kerryosborne.oracle-guy.com/" target="_blank"&gt;Kerry Osborne&lt;/a&gt; a few weeks ago.&lt;/p&gt;
&lt;p&gt;It explains what we see is coming, at a high level, from long time Oracle database professionals’ viewpoint and using database terminology (as the E4 audience is all Oracle users like us).&lt;/p&gt;
&lt;p&gt;However, this change is not really about Oracle database world, it’s about a &lt;em&gt;much&lt;/em&gt; wider shift in enterprise computing: modern Hadoop data lakes and clouds are here to stay. They are already taking over many workloads traditionally executed on in-house RDBMS systems on SAN storage arrays – especially all kinds of reporting and analytics. Oracle is just one of the many vendors affected by all this and they’ve also jumped onto the Hadoop bandwagon.&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Tue, 30 Jun 2015 02:14:13 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2015/06/29/the-hybrid-world-is-coming/</guid></item><item><title>The Unsung Benefits of Software Testing</title><link>https://boyter.org/2015/06/unsung-benefits-software-testing/</link><description>&lt;p&gt;One benefit that is generally not talked about when discussing testing is the following. The feeling of productivity because you are writing lots of code.&lt;/p&gt;
&lt;p&gt;Think about that for a moment. Ask any developer who wants to develop why they became a developer. One of the first things that comes up is &amp;ldquo;I enjoy writing code&amp;rdquo;. This is one of the things that I personally enjoy doing. Writing code, any code especially when its solving my current problem makes me feel productive. It makes me feel like I&amp;rsquo;m getting somewhere. Its empowering.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Tue, 30 Jun 2015 01:35:06 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/06/unsung-benefits-software-testing/</guid></item><item><title>Snaily updates</title><link>https://liza.io/snaily-updates/</link><description>&lt;p&gt;I was going to try to remember all the things I&amp;rsquo;ve done in the last month on snails, but this seems impossible. So here&amp;rsquo;s a lazy list of git commits within this time:&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Mon, 29 Jun 2015 21:32:35 GMT</pubDate><guid isPermaLink="true">https://liza.io/snaily-updates/</guid></item><item><title>Persistent undo functionality in vim</title><link>https://bastian.rieck.me/blog/2015/persistent_undo_vim/</link><description>&lt;p&gt;Sometimes, it is the small things that make my day. I recently discovered that
recent versions of vim offer a persistent undo functionality. This means I can
edit my files, close them, and still be able to undo changes when I open them
the next time. How cool is that?&lt;/p&gt;
&lt;p&gt;The activation could not be simpler. Just place the following in your &lt;code&gt;.vimrc&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set undofile
set undodir=$HOME/.vim/undo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The file path in &lt;code&gt;undodir&lt;/code&gt; should refer to an actual directory in your &lt;code&gt;.vim&lt;/code&gt;
directory, so it might need to be created first. Furthermore, you can use the
variables &lt;code&gt;undolevels&lt;/code&gt; and &lt;code&gt;undoreload&lt;/code&gt; to specify how many changes can be
undone at most and how many modified lines should be saved, respectively.&lt;/p&gt;
&lt;p&gt;I love vim more and more every day.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Mon, 29 Jun 2015 21:02:55 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/persistent_undo_vim/</guid></item><item><title>The Virtuous Traitor</title><link>https://peterlyons.com/problog/2015/06/the-virtuous-traitor/</link><description>&lt;p&gt;I was just reading some articles and comment threads debating the issue of &lt;code&gt;git merge&lt;/code&gt; verses &lt;code&gt;git rebase&lt;/code&gt;. I think it's a good case study for a decision-making methodology of actually trying both sides. I think outside of software development, the cost of trying both sides of a debate can be high in terms of time, effort, and money. Let's say hypothetically there are several competing theories of long-term crop management for farmers. It would take many years, lots of technical know-how, and lots of dedication to split a large farm into portions, each serving as a guinea pig for a particular crop management technique. However, in software development, many of these techniques can easily be tried on some small/fast basis like a side project, a particular feature, etc.&lt;/p&gt;
&lt;p&gt;For example, my web site has a mix of content and features that make it debatable as to whether a real dynamic application is warranted or would a static site generator approach suffice. I bypassed a lot of debate by just running it both ways for a meaningful amount of time, and at the end it was clear to me which way I preferred.&lt;/p&gt;
&lt;p&gt;When you see some of these debates, for example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;git vs mercurial&lt;/li&gt;
&lt;li&gt;merge vs rebase&lt;/li&gt;
&lt;li&gt;functional vs OO&lt;/li&gt;
&lt;li&gt;shell scripts vs configuration mgmt&lt;/li&gt;
&lt;li&gt;use DB constraints heavily or lightly&lt;/li&gt;
&lt;li&gt;language X vs language Y&lt;/li&gt;
&lt;li&gt;tool X vs tool Y&lt;/li&gt;
&lt;li&gt;Would I prefer consulting to full-time employment?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's good to think about how much time and effort would it take to actually give each option an honest, non-trivial try. Often I find it's worth it and after the fact I have real first-hand knowledge to show for it. I'm particularly fond of first-hard knowledge/experience and skeptical of opinions held based on reading/hearing third-party opinions.&lt;/p&gt;
&lt;p&gt;Here's a few recent things I put through this methodology:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is coffeescript worth using?&lt;/li&gt;
&lt;li&gt;Are docker containers interesting and useful?&lt;/li&gt;
&lt;li&gt;Is ansible better than my existing shell scripts?&lt;/li&gt;
&lt;li&gt;Would Atom be any better than Sublime?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Based on the cases made in the articles I was reading today, I plan to try a rebase-driven methodology on my next git project given I've mostly been doing merges and see how it goes.&lt;/p&gt;
&lt;p&gt;Play for both teams. It's often the best way to guide a decision. And don't forget that after a while things change and sometimes we need to re-visit old preferences.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Mon, 29 Jun 2015 05:38:19 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2015/06/the-virtuous-traitor/</guid></item><item><title>Testing In Software Engineering</title><link>https://boyter.org/2015/06/testing-software-engineering/</link><description>&lt;p&gt;Testing is software engineering is a method of providing information about code quality when developing a piece of software. The intent of writing and running tests is the enforce good software design and identify software bugs and defects. These defects can include specification/requirement errors as well as developer mistakes.&lt;/p&gt;
&lt;p&gt;The general aim of software testing is the ensure that software meets the following goals,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Meets its requirements gathered before its design and implementation&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 29 Jun 2015 01:38:23 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/06/testing-software-engineering/</guid></item><item><title>Grouping Tests: Unit/Integration vs Fast/Slow Tests</title><link>https://boyter.org/2015/06/grouping-tests-unitintegration-fastslow-tests/</link><description>&lt;p&gt;There is a great deal of argument in the testing community over how to label tests. One camp likes to label tests using levels such that unit tests are in one group, integration in another and so forth. The other likes to label them based on how long they take to run ignoring what level they are in. Fast tests are those that run in milliseconds while slow take longer then this. The reason this is important is that when adopting a testing process slow and flaky tests (those which fail often) are the enemy. Slow tests tend to be run less often in the development process. A delay of a few seconds can seriously interrupt a developer or testers workflow. Also the more often your tests fail randomly the less confidence you are likely to have in them, ignoring genuine errors until they fail multiple times.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 29 Jun 2015 01:36:47 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/06/grouping-tests-unitintegration-fastslow-tests/</guid></item><item><title>Sanity Testing</title><link>https://boyter.org/2015/06/sanity-testing/</link><description>&lt;p&gt;Software sanity tests are closely associated with smoke tests. They attempt to determine if is reasonable to continue with testing a given piece of software. The objective is not to test all functionality, but to determine if there is value in doing so. You can consider it a &amp;ldquo;Should I continue to test this?&amp;rdquo; check. Sanity tests differ from smoke tests as they exist to check if new functionality has been met and existing bugs have been resolved.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Mon, 29 Jun 2015 01:13:41 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/06/sanity-testing/</guid></item><item><title>Silicon Valley: Season 1</title><link>https://olshansky.info/tv/silicon_valley_season_1/</link><description>Olshansky's review of Silicon Valley: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 28 Jun 2015 07:57:16 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/silicon_valley_season_1/</guid></item><item><title>Jurassic Park</title><link>https://olshansky.info/movie/jurassic_park/</link><description>Olshansky's review of Jurassic Park</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 28 Jun 2015 07:48:51 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/jurassic_park/</guid></item><item><title>Generic Programming: The Concept</title><link>https://whackylabs.com/programming/generic/2015/06/27/generic-programming-the-concept/</link><description>&lt;h3 id="problem"&gt;Problem&lt;/h3&gt;

&lt;p&gt;Say, we have a type &lt;code class="language-plaintext highlighter-rouge"&gt;Animal&lt;/code&gt; which is at this time just an idea, so a protocol.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;protocol&lt;/span&gt; &lt;span class="kt"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;say&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Next, say we want a generic function that works with &lt;code class="language-plaintext highlighter-rouge"&gt;Animal&lt;/code&gt;.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Animal&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;animal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;animal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;say&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Looks good. Now let’s create our concrete types.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;Mammal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;say&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello! I'm a mammal!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;Reptile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;say&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello! I'm a replite"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And bring it to use&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Mammal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Reptile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;animals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Animal&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;animal&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;animals&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;animal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Oh o! Unfortunately this code won’t compile. This is the error the compiler might throw on your machine.&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;error: generic parameter 'T' cannot be bound to non-@objc protocol type 'Animal'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Let’s rewrite our implementation in C++ and see what sort of error we get.&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Say&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Say&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Mammal&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Say&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Hello! I'm a mammal."&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Reptile&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Say&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Hello! I'm a reptile."&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Mammal&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Reptile&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Animal&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;animals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;for_each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;animals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;animals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;[](&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Animal&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;animal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;animal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Say&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you compile this with your C++11 compiler &lt;code class="language-plaintext highlighter-rouge"&gt;clang++ -std=c++11 -stdlib=libc++ code.cpp&lt;/code&gt;, you might get an error such as:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;error: allocating an object of abstract class type 'Animal'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But, we are never allocating the instance of type &lt;code class="language-plaintext highlighter-rouge"&gt;Animal&lt;/code&gt; right? This is time to get our understanding of Generic Programming better.&lt;/p&gt;

&lt;h3 id="terminology"&gt;Terminology&lt;/h3&gt;

&lt;p&gt;Generic Programming works around these main terminologies:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;Model&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;Refinement&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt; is the core design or interface. &lt;code class="language-plaintext highlighter-rouge"&gt;Model&lt;/code&gt; is what conforms to the &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt; and provides a implementation of the &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt;. &lt;code class="language-plaintext highlighter-rouge"&gt;Refinement&lt;/code&gt; is like inheriting a &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt; and adding more things to it. And finally &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt; deals with specifying what and what not a &lt;code class="language-plaintext highlighter-rouge"&gt;Type&lt;/code&gt; that wishes to use the &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt; is allowed to do.&lt;/p&gt;

&lt;p&gt;In C++, we can have a &lt;code class="language-plaintext highlighter-rouge"&gt;pure virtual base class&lt;/code&gt;, where the base class provides no implementation for any member function. Swift hipster might know this idea as a &lt;code class="language-plaintext highlighter-rouge"&gt;protocol&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Along with that we have something in Swift that C++ programmers are not used to. It’s the use of &lt;code class="language-plaintext highlighter-rouge"&gt;protocol&lt;/code&gt; for &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt;. With C++, the compiler implicitly adds the &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt; for us.&lt;/p&gt;

&lt;p&gt;Let’s take a look at some examples.&lt;/p&gt;

&lt;p&gt;This is a &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt;:&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Say&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is a &lt;code class="language-plaintext highlighter-rouge"&gt;Model&lt;/code&gt;:&lt;/p&gt;
&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Mammal&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is &lt;code class="language-plaintext highlighter-rouge"&gt;Refinement&lt;/code&gt;:&lt;/p&gt;
&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WalkingAnimal&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Walk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is a &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt;:&lt;/p&gt;
&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;protocol&lt;/span&gt; &lt;span class="kt"&gt;Equatable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In Swift we use the term &lt;code class="language-plaintext highlighter-rouge"&gt;protocol&lt;/code&gt; for both &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt;, and this could be a source of confusion to many. Whereas, in C++ we don’t have any way to design &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt;, which helps when writing code, but when the code fails to compile for some reaons it might get hard to understand why.&lt;/p&gt;

&lt;p&gt;First let us try to understand the relationship between a &lt;code class="language-plaintext highlighter-rouge"&gt;Model&lt;/code&gt; and a &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt;. Let’s say we have a  &lt;code class="language-plaintext highlighter-rouge"&gt;Model&lt;/code&gt; named &lt;code class="language-plaintext highlighter-rouge"&gt;Student&lt;/code&gt; as:&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Equatable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;studentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;studentId&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;studentId&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Here &lt;code class="language-plaintext highlighter-rouge"&gt;Student&lt;/code&gt; conforms to the &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt;. So any function that is designed to with types &lt;code class="language-plaintext highlighter-rouge"&gt;Equatable&lt;/code&gt; can work with &lt;code class="language-plaintext highlighter-rouge"&gt;Student&lt;/code&gt;. But, we have to keep in mind that the &lt;code class="language-plaintext highlighter-rouge"&gt;Student&lt;/code&gt; is &lt;strong&gt;not&lt;/strong&gt; a &lt;code class="language-plaintext highlighter-rouge"&gt;Model&lt;/code&gt; of &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt; named &lt;code class="language-plaintext highlighter-rouge"&gt;Equatable&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next let us explore the relationship between a &lt;code class="language-plaintext highlighter-rouge"&gt;Model&lt;/code&gt; and a &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt;. If we have a generic stack implementation:&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;Stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isEmpty&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeLast&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What could be the core &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt; of a stack? If we take a look at it, we might say a stack is a data structure where you push items and later on pop them back. So, we can say the &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt; of stack can be written as:&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;protocol&lt;/span&gt; &lt;span class="kt"&gt;Stack&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;typealias&lt;/span&gt; &lt;span class="kt"&gt;Item&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, we can &lt;code class="language-plaintext highlighter-rouge"&gt;Model&lt;/code&gt; an &lt;code class="language-plaintext highlighter-rouge"&gt;Array&lt;/code&gt; backed stack on this &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt; as:&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;ArrayStack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Stack&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isEmpty&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeLast&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Or, we can go crazy and write a weird stack, where you pop data filtered by some epoch timestamp that we provide at runtime.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;TimeStack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Stack&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;CFTimeInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[:]&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;epoch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CACurrentMediaTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;CACurrentMediaTime&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;epoch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id="solution"&gt;Solution&lt;/h3&gt;

&lt;p&gt;With our basics now clear, we can take a look again at the original problem. What was wrong with our &lt;code class="language-plaintext highlighter-rouge"&gt;Animal&lt;/code&gt; example at the top?&lt;/p&gt;

&lt;p&gt;The problem is with both the implementations.&lt;/p&gt;

&lt;p&gt;In the Swift implementation, we’ve designed our &lt;code class="language-plaintext highlighter-rouge"&gt;Animal&lt;/code&gt; as a &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt;, as can be observed with the &lt;code class="language-plaintext highlighter-rouge"&gt;func greet&amp;lt;T: Animal&amp;gt;&lt;/code&gt;, but then later we are trying to use it as &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt; by doing things like &lt;code class="language-plaintext highlighter-rouge"&gt;class Mammal: Animal&lt;/code&gt;. And this is what compiler is complaining about.&lt;/p&gt;

&lt;p&gt;With our C++ implementation, as our dear clang compiler was trying to inform us, the &lt;code class="language-plaintext highlighter-rouge"&gt;Animal&lt;/code&gt; is actually a &lt;code class="language-plaintext highlighter-rouge"&gt;Concept&lt;/code&gt;, but we are trying to use it as &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt; by doing things like &lt;code class="language-plaintext highlighter-rouge"&gt;std::vector&amp;lt;Animal&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And hence both the usages are invalid.&lt;/p&gt;

&lt;p&gt;That’s all for today. We shall explore the other Generic Programming terminologies later someday.&lt;/p&gt;

&lt;p&gt;Have a nice day!&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Sat, 27 Jun 2015 20:58:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/programming/generic/2015/06/27/generic-programming-the-concept/</guid></item><item><title>A little bit of slope makes up for a lot of y-intercept</title><link>https://josh.works/a-little-bit-of-slope-makes-up-for-a-lot-of-y-intercept</link><description>&lt;p&gt;The following is &lt;a href="https://www.quora.com/What-are-the-most-profound-life-lessons-from-Stanford-Professor-John-Ousterhout/answer/Charles-Chen-8?share=6cdcb4fb&amp;amp;srid=8LAe"&gt;recounted on 
Quora&lt;/a&gt;, from a lecture by Stanford
professor &lt;a href="http://web.stanford.edu/~ouster/cgi-bin/home.php"&gt;John Ousterhout&lt;/a&gt; (he’s in the Computer Science department):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Here’s today’s thought for the weekend.  A little bit of slope makes up for a lot of Y-intercept.  &lt;/p&gt;

  &lt;p&gt;[Laughter]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img alt="" src="/squarespace_images/static_556694eee4b0f4ca9cd56729_56035dbbe4b07ebf58d79d16_558ca9b4e4b0391692169928_1435281858196_y-intercept.pngy-intercept_" /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;So at a mathematical level this is an obvious truism.  You know if you have two lines, the red line and the blue line and the red line has a lower Y-intercept but a greater slope then eventually the red line will cross the blue line.&lt;/p&gt;

  &lt;p&gt;And if the Y-axis is something good, depending on your definition of something good, then I think most people would pick the red trajectory over the blue trajectory (..unless you think you’re going to die before you get to the crossing point).&lt;/p&gt;

  &lt;p&gt;[Laughter]
&lt;!-- more --&gt;&lt;/p&gt;

  &lt;p&gt;So in a mathematical sense it’s kind of obvious.  But I didn’t really mean in a mathematical sense, I think this is a pretty good guideline for life also.  What I mean is that how fast you learn is a lot more important than how much you know to begin with.  So in general I say that people emphasize too much how much they know and not how fast they’re learning.&lt;/p&gt;

  &lt;p&gt;That’s good news for all of you people because you’re in Stanford and that means you learn really, really fast.  This is a great advantage for you.  Now let me give you some examples.  The first example is: you shouldn’t be afraid to try new things even if you’re completely clueless about the area you’re going into.  No need to be afraid about that.  As long as you learn fast you’ll catch up and you’ll be fine.&lt;/p&gt;

  &lt;p&gt;For example I often hear conversations the first week of class where somebody will be bemoaning, “Oh so-and-so knows blah-blah-blah, how am I ever going to catch up to them?”  Well, if you’re one of the people who knows blah-blah-blah it’s bad news for you because honestly everyone is going to catch up really quickly.  Before you know it that advantage is going to be gone and if you aren’t learning too you’re going to be behind.&lt;/p&gt;

  &lt;p&gt;Another example is that a lot of people get stuck in ruts in their lives.  They realize they’re in the wrong job for them.  I have the wrong job or the wrong spouse or whatever…&lt;/p&gt;

  &lt;p&gt;[Laughter]&lt;/p&gt;

  &lt;p&gt;And they’re afraid to go off and try something new.  Often they’re worried, I’m going to really look bad if I go..&lt;/p&gt;

  &lt;p&gt;[Laughter]&lt;/p&gt;

  &lt;p&gt;I’m kidding about the spouse.  But, seriously people will be afraid to try some new thing because they’re worried they’ll look bad or will make a lot of rookie mistakes.  But, I say, just go do it and focus on learning.  &lt;/p&gt;

  &lt;p&gt;[Laughter]&lt;/p&gt;

  &lt;p&gt;Let me take the spouse out of the equation for now.&lt;/p&gt;

  &lt;p&gt;[Laughter]&lt;/p&gt;

  &lt;p&gt;Focus on the job.&lt;/p&gt;

  &lt;p&gt;Another example is hiring.  Before I came back to academia a couple of years ago I was out doing startups.  What I noticed is that when people hire they are almost always hire based on experience.  They’re looking for somebody’s resume trying to find the person who has already done the job they want them to do three times over.  That’s basically hiring based on Y-intercept.&lt;/p&gt;

  &lt;p&gt;Personally I don’t think that’s a very good way to hire.  The people who are doing the same thing over and over again often get burnt out and typically the reason they’re doing the same thing over and over again is they’ve maxed out.  They can’t do anything more than that.  And, in fact, typically what happens when you level off is you level off slightly above your level of competence.  So in fact you’re not actually doing the current job all that well.&lt;/p&gt;

  &lt;p&gt;So what I would always hire on is based on aptitude, not on experience.  You know, is this person ready to do the job?  They may never have done it before and have no experience in this area, but are they a smart person who can figure things out?  Are they a quick learner?  And I’ve found that’s a much better way to get really effective people.&lt;/p&gt;

  &lt;p&gt;So I think this is a really interesting concept you can apply in a lot of different ways.  And the key thing here I think is that slow and steady is great.  You don’t have to do anything heroic.  You know the difference in slopes doesn’t have to be that great if you just every day think about learning a little bit more and getting a little bit better, lots of small steps, its amazing how quickly you can catch up and become a real expert in the field.&lt;/p&gt;

  &lt;p&gt;I often ask myself: have I learned one new thing today?  Now you guys are younger and, you know, your slope is a little bit higher than mine and so you can learn 2 or 3 or 4 new things a day.  But if you just think about your slope and don’t worry about where you start out you’ll end up some place nice.&lt;/p&gt;

  &lt;p&gt;Ok, that’s my weekend thought.&lt;/p&gt;

  &lt;p&gt;[Applause]&lt;/p&gt;
&lt;/blockquote&gt;</description><author>Josh Thompson</author><pubDate>Fri, 26 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://josh.works/a-little-bit-of-slope-makes-up-for-a-lot-of-y-intercept</guid></item><item><title>Broken Build</title><link>https://www.craigpardey.com/post/2015-06-26-build/</link><description>&lt;p&gt;I have used automated build tools on all my projects since 2000.  Back then it was CruiseControl in all its XML-configuration glory.  Today it is usually &lt;a href="https://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;, or sometimes &lt;a href="https://www.jetbrains.com/teamcity/"&gt;TeamCity&lt;/a&gt;, and I recently tried out &lt;a href="http://go.cd"&gt;ThoughtWorks Go&lt;/a&gt;.  The user interfaces have generally improved over time, and now there is probably a &amp;ldquo;plugin for that&amp;rdquo; thing you used to script manually, but overall not much has changed in the last 15 years.&lt;/p&gt;
&lt;p&gt;In fact, I feel that The Build is actually flakier now than it was then, mostly due to the increased complexity.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Fri, 26 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2015-06-26-build/</guid></item><item><title>The Poor Man's Postmortem - Lemma</title><link>https://etodd.io/2015/06/25/poor-mans-postmortem-lemma/</link><description>&lt;p&gt;
	The big secret of our industry is, we don't actually enjoy making games. We
	slave away in obscurity for years in anticipation of one glorious day.
&lt;/p&gt;
&lt;p&gt;
	Not release day, no. The day we can finally write a postmortem full of
	pretentious anecdotes, bad jokes, and unsolicited advice.
&lt;/p&gt;
&lt;/p&gt;
	Well I just finished a game, and doggone it, I am going to exercise my
	inalienable rights as a developer.
&lt;/p&gt;

&lt;figure&gt;
	&lt;div class="video"&gt;&lt;/div&gt;
	&lt;figcaption&gt;
		Lemma is immersive first-person parkour in a surreal, physics-driven
		voxel world.
	&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2&gt;Things to do when making a game&lt;/h2&gt;

&lt;p&gt;
	Ancient gamedev postmortem traditions mandate that this section be titled
	"what went right". Unfortunately, the game was so shockingly good and so
	many things went right that a full overview would stretch on endlessly.
&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 26 Jun 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/06/25/poor-mans-postmortem-lemma/</guid></item><item><title>TTY Week</title><link>https://venam.net/blog/unix/2015/06/26/tty-week.html</link><description>Hello fellow readers, This week is TTY week at nixers.net.  Last summer we did the same challenge and it turned out a pretty enjoyable and a great learning experience. I'm going to add logs in this post and hopefully it'll render beautifully (because I can't check my blog from the TTY.)</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Fri, 26 Jun 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/unix/2015/06/26/tty-week.html</guid></item><item><title>The Gunslinger (The Dark Tower, #1)</title><link>https://apurva-shukla.me/bookshelf/the-gunslinger-the-dark-tower-1/</link><description>⭐ ⭐ ⭐ ⭐ Slowly building momentum in order to set the epic series!

Whilst starting as bland, King’s writing style instantly kicked up as his…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Thu, 25 Jun 2015 14:02:21 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-gunslinger-the-dark-tower-1/</guid></item><item><title>Bird atop Twin Peaks</title><link>https://june.kim/bird-atop-twin-peaks/</link><author>june.kim</author><pubDate>Thu, 25 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/bird-atop-twin-peaks/</guid></item><item><title>Anvil: Double O Seven</title><link>https://zserge.com/posts/anvil-0.0.7/</link><description>Anvil: version 0.0.7 released! If you missed the news - Anvil is a tiny reactive UI library for Android. It&amp;rsquo;s based on the concept of the virtual layout (much like React.js) and brings declarative layouts with data bindings, componentization, styles, animations etc in pure Java.
It also supports Kotlin, which is a great language and I hope it will replace Java on Android some day.
Version 0.0.6 was suprisingly stable, but life goes on, and here&amp;rsquo;s version 0.</description><author>zserge's blog</author><pubDate>Thu, 25 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/anvil-0.0.7/</guid></item><item><title>Windows scheduled task to auto logoff</title><link>https://allanrbo.blogspot.com/2015/06/heres-some-powershell-to-remotely.html</link><description>Here's some PowerShell to remotely schedule a task to log out 2+ hours idle users:
&lt;pre&gt;function InstallAutoLogoff($computer)
{
    invoke-command -computer $computer `
    {
        schtasks.exe /delete /tn AutoLogOff /f 2&amp;gt;&amp;amp;1 | Out-Null

        set-content c:\windows\temp\AutoLogOffTask.xml `
        '&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-16&amp;quot;?&amp;gt;
        &amp;lt;Task version=&amp;quot;1.2&amp;quot; xmlns=&amp;quot;http://schemas.microsoft.com/windows/2004/02/mit/task&amp;quot;&amp;gt;
          &amp;lt;Triggers&amp;gt;
            &amp;lt;TimeTrigger&amp;gt;
              &amp;lt;Repetition&amp;gt;
                &amp;lt;Interval&amp;gt;PT30M&amp;lt;/Interval&amp;gt;
              &amp;lt;/Repetition&amp;gt;
              &amp;lt;StartBoundary&amp;gt;2015-01-01T00:00:00&amp;lt;/StartBoundary&amp;gt;
            &amp;lt;/TimeTrigger&amp;gt;
          &amp;lt;/Triggers&amp;gt;
          &amp;lt;Actions Context=&amp;quot;Author&amp;quot;&amp;gt;
            &amp;lt;Exec&amp;gt;
              &amp;lt;Command&amp;gt;PowerShell.exe&amp;lt;/Command&amp;gt;
              &amp;lt;Arguments&amp;gt;-Command $r1 = quser.exe; $idPos = $r1[0].IndexOf(''ID  ''); foreach($row in $r1) { $r2 = $row.Substring($idPos).Trim() -split ''  +''; if($r2[2].Contains('':'')) { $t = $r2[2].Replace('':'', ''.''); if($t.Contains(''+'') -or ($t -as [double] -ge 2)) { rwinsta.exe $r2[0] } } }&amp;lt;/Arguments&amp;gt;
            &amp;lt;/Exec&amp;gt;
          &amp;lt;/Actions&amp;gt;
        &amp;lt;/Task&amp;gt;'

        schtasks.exe /create /tn AutoLogOff /ru system /xml c:\windows\temp\AutoLogOffTask.xml
        del c:\windows\temp\AutoLogOffTask.xml
    }
}

InstallAutoLogoff 'myserver1'
InstallAutoLogoff 'myserver2'
InstallAutoLogoff 'myserver3'
&lt;/pre&gt;</description><author>Allan's Blog</author><pubDate>Wed, 24 Jun 2015 13:52:36 GMT</pubDate><guid isPermaLink="true">https://allanrbo.blogspot.com/2015/06/heres-some-powershell-to-remotely.html</guid></item><item><title>The Little Prince</title><link>https://june.kim/little-prince/</link><author>june.kim</author><pubDate>Mon, 22 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/little-prince/</guid></item><item><title>Leather Tripod Chair</title><link>https://june.kim/tripod-chair/</link><author>june.kim</author><pubDate>Mon, 22 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/tripod-chair/</guid></item><item><title>JNR-FUSE library for using FUSE from Java</title><link>https://serce.me/posts/2015-06-22-jnr-fuse</link><description>This article explains how to implement a userspace file system using Java, connecting Java and native code without writing C code, to achieve maximum performance.</description><author>SerCe's blog</author><pubDate>Mon, 22 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://serce.me/posts/2015-06-22-jnr-fuse</guid></item><item><title>Adventures after Google I/O-2(iOS).</title><link>https://prashamhtrivedi.in/adventures-iOS-2.html</link><description>After trying and playing some new stuffs(except M preview) released in Google I/O, I have found some trivial things to take care of. In this part, we will see how should we take care if we add iOS details in our google cloud console and how it can affect android development.</description><author>Prasham H Trivedi</author><pubDate>Mon, 22 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/adventures-iOS-2.html</guid></item><item><title>Portugal travel bookmarks</title><link>https://xenodium.com/portugal-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/As-a-Dermatologist-what-life-changing-skin-care-advice-would-you-give-me"&gt;As a Dermatologist, what life changing skin care advice would you give me?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=avenida+dos+platanos&amp;amp;ia=images"&gt;Avenida dos Platanos&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://brunoamaral.eu/page/beautiful-lisbon/"&gt;Beautiful Lisbon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/Sardinia/comments/14uwypj/best_restaurants_in_alghero/"&gt;Best restaurants in Alghero?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Boca do inferno.&lt;/li&gt;
&lt;li&gt;Cabo da Roca.&lt;/li&gt;
&lt;li&gt;Casa dos passarinhos (Steak on hot stone, tuna steak with “mirandesa” sauce, monkfish masada).&lt;/li&gt;
&lt;li&gt;Cascais - Guincho.&lt;/li&gt;
&lt;li&gt;Cervejaria Ramiro (seafood restaurant in town).&lt;/li&gt;
&lt;li&gt;Eduard 7th park.&lt;/li&gt;
&lt;li&gt;Estoril.&lt;/li&gt;
&lt;li&gt;Fox Trot (bar).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Hachij%C5%8D-jima"&gt;Hachijō-jima island&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=ilha+da+culatra&amp;amp;t=ffab&amp;amp;iax=1&amp;amp;ia=images"&gt;Ilha da Culatra (good for families)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=ilha+da+tavira&amp;amp;t=ffab&amp;amp;iax=1&amp;amp;ia=images"&gt;Ilha da Tavira (good for food @ Portas do Mar)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=ilha+deserta&amp;amp;t=ffab&amp;amp;iax=1&amp;amp;ia=images"&gt;Ilha Deserta (seafood as Estaminé)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Jeronimos Monastery (Lisbon).&lt;/li&gt;
&lt;li&gt;Lisbon Castle.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lisbonlux.com/lisbon-shops/mercado-da-ribeira.html"&gt;Mercado da Ribeira in Lisbon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Mouro's castle (Sintra).&lt;/li&gt;
&lt;li&gt;Mouro's castle.&lt;/li&gt;
&lt;li&gt;Pasteis de Belem (Lisbon).&lt;/li&gt;
&lt;li&gt;Pastelaria piriquita eat queijadas de sintra.&lt;/li&gt;
&lt;li&gt;Pasteleria Piriquita (Sintra).&lt;/li&gt;
&lt;li&gt;Pavilhao Chines (bar).&lt;/li&gt;
&lt;li&gt;Pena's Pallace (must see if you go to sintra)&lt;/li&gt;
&lt;li&gt;Pena's Pallace (Sintra).&lt;/li&gt;
&lt;li&gt;Pensao do Amor (bar).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.etfoodvoyage.com/category/locations/portugal/"&gt;Portugal Archives - ET Food Voyage&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Praça do comercio.&lt;/li&gt;
&lt;li&gt;Quinta da Regaleira&lt;/li&gt;
&lt;li&gt;Quinta da Regaleira (Sintra).&lt;/li&gt;
&lt;li&gt;Sintra village&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Sintra"&gt;Sintra&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Stop do bairro (tamboril rice, prawn curry, and seafood rice).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.surfcastle.com/surf/school"&gt;Surfcastle&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/archpng/status/1115037292752723968"&gt;São Bento railway station&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Sé (Lisbon Cathedral).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/lonelyplanet/status/612282216635363328/photo/1"&gt;The best beaches in Portugal's Algarve&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Torre Belem (Lisbon).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.eventbrite.com/e/web-summit-ladies-craft-night-tote-bag-embroidery-workshop-tickets-51503431149"&gt;Web Summit Ladies Craft Night - Tote Bag Embroidery Workshop Tickets, Tue, Nov 6, 2018 at 7:00 PM (Eventbrite)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-tips-would-you-give-to-a-newbie-who-wants-to-travel-like-you"&gt;What tips would you give to a newbie who wants to travel like you? - Quora&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://edition.cnn.com/travel/article/world-longest-pedestrian-suspension-bridge-portugal-arouca/index.html"&gt;World's longest pedestrian suspension bridge&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 21 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/portugal-travel-bookmarks</guid></item><item><title>Bulgaria travel bookmarks</title><link>https://xenodium.com/bulgaria-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/EarthPix/status/612661559018528768/photo/1"&gt;Devetashka Cave&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 21 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/bulgaria-travel-bookmarks</guid></item><item><title>Presenting bookmarks</title><link>https://xenodium.com/presenting-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://s.hbr.org/1A4l5OX"&gt;How to give a presentation people will remember&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://s.hbr.org/1A3uvKp"&gt;How to give a stellar presentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.troyhunt.com/2015/06/speaker-style-bingo-10-presentation.html?m%3D1"&gt;Speaker style bingo: 10 presentation anti-patterns&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 21 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/presenting-bookmarks</guid></item><item><title>Bali travel bookmarks</title><link>https://xenodium.com/bali-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/indonesia/nusa-tenggara/gili-islands"&gt;Gili Islands travel (Nusa Tenggara, Indonesia - Lonely Planet)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://snorkelaroundtheworld.com/2018/09/manta-snorkeling-nusa-penida/"&gt;Manta snorkeling Nusa Penida – When? Where? How much?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Pura Lempuyang, Bali.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 21 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/bali-travel-bookmarks</guid></item><item><title>Changing the gears to Generic Programming</title><link>https://whackylabs.com/programming/generic/2015/06/20/changing-the-gears-to-generic-programming/</link><description>&lt;p&gt;Practical usage of generic programming can be narrowed down to two forms:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Writing top level generic functions&lt;/li&gt;
  &lt;li&gt;Writing generic custom types&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id="generic-functions"&gt;Generic Functions&lt;/h3&gt;

&lt;p&gt;Writing top level generic functions is easier. Its more of like you write a normal function and later on you realize that this function is not restricted to any type, rather it is just an abstract algorithm that can be used by many types, you upgrade it to generic type. For example,&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;isEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;can be easily abstracted out to a generic form such as&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;isEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This generic form would work as long as &lt;code class="language-plaintext highlighter-rouge"&gt;T&lt;/code&gt; supports a &lt;code class="language-plaintext highlighter-rouge"&gt;==&lt;/code&gt; operation. Which brings us to the term you will often find with generic programming, &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraints&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So, the above example would work fine with all types that support &lt;code class="language-plaintext highlighter-rouge"&gt;==&lt;/code&gt; operation. Such as:&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"Y"&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"N"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;10.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;10.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"Y"&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"N"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"Y"&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"N"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But would easily break down when used like:&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Vector2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;yy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"Y"&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"N"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// output compilation failure&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And the reason being, that the &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt; has been violated. The type &lt;code class="language-plaintext highlighter-rouge"&gt;Vector2&lt;/code&gt; does not provides an &lt;code class="language-plaintext highlighter-rouge"&gt;==&lt;/code&gt; operation. The fix is simple,
satisfy the &lt;code class="language-plaintext highlighter-rouge"&gt;Type Constraint&lt;/code&gt;&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Vector2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Vector2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Another type of error that could arise with generic functions is, where the constraints are not violated syntactically, by are logically broken. For example:&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;w1&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"world"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;w2&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"world"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"Y"&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"N"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// output N&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, our &lt;code class="language-plaintext highlighter-rouge"&gt;isEqual()&lt;/code&gt; sees that the types are &lt;code class="language-plaintext highlighter-rouge"&gt;const char *&lt;/code&gt; and the compiler knows how to compare two pointers. But the result might or might not be what we were expecting. If you were expecting a &lt;code class="language-plaintext highlighter-rouge"&gt;string&lt;/code&gt; comparison, you’ve to tell the compiler how to do that.&lt;/p&gt;

&lt;p&gt;For our specific case, it can be achieved by providing an overloaded implementation that just takes &lt;code class="language-plaintext highlighter-rouge"&gt;const char *&lt;/code&gt;&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;isEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;strcmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id="generic-types"&gt;Generic Types&lt;/h3&gt;

&lt;p&gt;The main power of generic programming lies when working with generic types. Just as generic functions abstract the algorithm to a type-free
level, generic types abstract our design to type free level.&lt;/p&gt;

&lt;p&gt;Think of generic types as if us providing the type information for the compiler, and passing the responsibility of creating the actual types to
the compiler.&lt;/p&gt;

&lt;p&gt;To get an quick overview, the &lt;code class="language-plaintext highlighter-rouge"&gt;Vector2&lt;/code&gt; type that we wrote above for &lt;code class="language-plaintext highlighter-rouge"&gt;float&lt;/code&gt; types can easily be rewritten as a generic type&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Vector2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;yy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xx&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And the &lt;code class="language-plaintext highlighter-rouge"&gt;==&lt;/code&gt; implementation should just fit with the change:&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, where should we actually use the generic types in real world? To address this question, you’ve to switch you mindset from run-time
polymorphism to compile-time polymorphism. Let’s consider an example where you have designed your types in the classical object-oriented
fashion, that is using inheritence&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Shape&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;Shape&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;PrintArea&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"area = "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Rectangle&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Shape&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;Rectangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Circle&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Shape&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;Circle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;3.14&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Circle&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Shape&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;for_each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;[](&lt;/span&gt;&lt;span class="n"&gt;Shape&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;PrintArea&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, we have a base &lt;code class="language-plaintext highlighter-rouge"&gt;Shape&lt;/code&gt; class that does provides the public interface and leaves the actual implementation details to the subclasses. In this case the actual calculation of the area. Internally, we’re calling the &lt;code class="language-plaintext highlighter-rouge"&gt;Area()&lt;/code&gt; function on &lt;code class="language-plaintext highlighter-rouge"&gt;Shape&lt;/code&gt; and let the run-time do the actual look-up for the implementation by looking at the type information.&lt;/p&gt;

&lt;p&gt;In another words, what we are actually doing is that delegating some part of the implementation of our &lt;code class="language-plaintext highlighter-rouge"&gt;Shape&lt;/code&gt; class to subclasses. Another
way of achieving the same results is by not depending on subclasses for overrides, but delegating the implementation to some external classes.&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;ShapeImpl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RectangleImpl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ShapeImpl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;RectangleImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CircleImpl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ShapeImpl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;CircleImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;3.14&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Shape&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;Shape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ShapeImpl&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;impl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;impl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;PrintArea&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"area = "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ShapeImpl&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;RectangleImpl&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;RectangleImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CircleImpl&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;CircleImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Shape&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Shape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Shape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;for_each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;[](&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Shape&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrintArea&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I don’t know if we’ve achieved any actual improvement over the earlier implementation with this or not. But, this gives you an idea that the
implementation can be dragged out of the core class while keeping the visible interface of the &lt;code class="language-plaintext highlighter-rouge"&gt;Shape&lt;/code&gt; intact.&lt;/p&gt;

&lt;p&gt;If we can achieve this, we can even go a step further and actually provide the implementation at compile time. In other words, we can simply make the &lt;code class="language-plaintext highlighter-rouge"&gt;Shape&lt;/code&gt; class generic, and let the compiler plug-in the implementation details at compile-time.&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="nc"&gt;Impl&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Shape&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;Shape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Impl&lt;/span&gt; &lt;span class="n"&gt;impl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;impl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;PrintArea&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"area = "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Impl&lt;/span&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, we can create and use our generic shape instances as:&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;    &lt;span class="n"&gt;Shape&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;RectangleImpl&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RectangleImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;Shape&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CircleImpl&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;circle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CircleImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrintArea&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;circle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrintArea&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The only type constraints on the &lt;code class="language-plaintext highlighter-rouge"&gt;RectangleImpl&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;CircleImpl&lt;/code&gt; is that they need to have a &lt;code class="language-plaintext highlighter-rouge"&gt;Area()&lt;/code&gt; function.&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RectangleImpl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;RectangleImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CircleImpl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;CircleImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;3.14&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The C++ compiler is smart enough to see the constraints are not violated by any new delegate class. For example if we introduce a &lt;code class="language-plaintext highlighter-rouge"&gt;TriangleImpl&lt;/code&gt; as:&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TriangleImpl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;TriangleImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;Shape&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TriangleImpl&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;triangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TriangleImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;triangle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrintArea&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The compiler will immediately throw error messages, unless you fix your implementation by providing the &lt;code class="language-plaintext highlighter-rouge"&gt;Area()&lt;/code&gt; function.&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TriangleImpl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;TriangleImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, if you notice that we are not using an &lt;code class="language-plaintext highlighter-rouge"&gt;std::vector&lt;/code&gt; anymore, that is because we don’t have a &lt;code class="language-plaintext highlighter-rouge"&gt;Shape&lt;/code&gt; type anymore. And if you find
yourself thinking in this direction, you need to get out of the run-time polymorphic mindset. When using compile-time polymorphism you’ve to keep in mind the fact that now you’re not in control of creating the custom types, rather you’ve passed on that authority to the compiler.&lt;/p&gt;

&lt;p&gt;So, &lt;code class="language-plaintext highlighter-rouge"&gt;Shape&amp;lt;TriangleImpl&amp;gt;&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;Shape&amp;lt;CircleImpl&amp;gt;&lt;/code&gt; are entirely different types with no common ancestor or anything.&lt;/p&gt;

&lt;p&gt;When designing with compile time polymorphism you need to keep in mind that your generic type should be a leaf node or a final class in the entire type system. You should not have to subclass your generic type, rather plug-in a delegate class that provides the implementation that you would rather provide by sub-classing.&lt;/p&gt;

&lt;p&gt;To summarize, here’s a quick list of good and bad of generic type system:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Robust: No run time exceptions.&lt;/li&gt;
  &lt;li&gt;Efficient: No run time lookups&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Not a good candidate for base class&lt;/li&gt;
  &lt;li&gt;Hard to read and debug.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, moving on to using generics with Swift. Swift provides the same good old C++ way of writing generic code with some extra type constraint system. Where in C++ the compiler would do the type constraint checking when you actually compile the code, Swift actually makes the constraint system more explicit, such that you have to provide the constraint information with a &lt;code class="language-plaintext highlighter-rouge"&gt;protocol&lt;/code&gt;.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;protocol&lt;/span&gt; &lt;span class="kt"&gt;ShapeImplementable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;area&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Double&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;Shape&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Impl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ShapeImplementable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ShapeImplementable&lt;/span&gt;

    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;impl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ShapeImplementable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;impl&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;printArea&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"area = &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And then you can implement your delegate class as&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;RectangleImpl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ShapeImplementable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;area&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Double&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;w&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Double&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Double&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;
        &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Double&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Double&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And finally use them the same way you would with C++.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;rect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Shape&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;RectangleImpl&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;impl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;RectangleImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;w&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The entire code for this article is also available at &lt;a href="https://github.com/chunkyguy/GenericsDemo"&gt;github.com/chunkyguy/GenericsDemo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Goodbye and have a nice day!&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Sat, 20 Jun 2015 09:02:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/programming/generic/2015/06/20/changing-the-gears-to-generic-programming/</guid></item><item><title>Optimization with Timeit</title><link>https://denvaar.dev/posts/optimization_with_timeit.html</link><description>Code optimization analysis using Python's timeit module.</description><author>denvaar's website</author><pubDate>Sat, 20 Jun 2015 08:40:09 GMT</pubDate><guid isPermaLink="true">https://denvaar.dev/posts/optimization_with_timeit.html</guid></item><item><title>2015-06-20</title><link>https://ho.dges.online/pictures/2015-06-20/</link><description/><author>ho.dges.online</author><pubDate>Sat, 20 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-06-20/</guid></item><item><title>The Girl on the Train</title><link>https://apurva-shukla.me/bookshelf/the-girl-on-the-train/</link><description>⭐ ⭐ ⭐ 3.5/5

Fast-paced, thrilling, and creepy.

What else could you want?

Well, for one - likeable characters would be a move in the right…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Fri, 19 Jun 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-girl-on-the-train/</guid></item><item><title>Old ventures and new adventures</title><link>https://tanelpoder.com/2015/06/19/old-ventures-and-new-adventures/</link><description>&lt;p&gt;I have some news, two items actually.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, today (it’s still 18th June in California) is my blog’s 8th anniversary!&lt;/p&gt;
&lt;p&gt;I wrote my first blog post, about &lt;a href="https://tanelpoder.com/2007/06/18/advanced-oracle-troubleshooting-guide-when-the-wait-interface-is-not-enough-part-1/" target="_blank"&gt;Advanced Oracle Troubleshooting&lt;/a&gt;, exactly 8 years ago, on 18th June 2007 and have written 229 blog posts since. I had started writing and accumulating my &lt;a href="https://tanelpoder.com/files/" target="_blank"&gt;TPT script&lt;/a&gt; collection a couple of years earlier and now it has over 1000 files in it! And no, I don’t remember what all of them do and even why I had written them. Also I haven’t yet created an index/documentation for all of them (maybe on the 10th anniversary? ;)&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Fri, 19 Jun 2015 09:08:33 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2015/06/19/old-ventures-and-new-adventures/</guid></item><item><title>My love-hate relationship with LuaJIT</title><link>https://blog.separateconcerns.com/2015-06-18-love-hate-luajit.html</link><description>&lt;blockquote&gt;
&lt;p&gt;Clarification: The title is exaggerated. I have never hated LuaJIT, I just went back to using PUC Lua primarily.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I started using Lua in early 2007. I had already been programming for years, but I had reached a point where I had decided that I wanted to know exactly what was going on when my computer executed dynamic code. That meant understanding two critical pieces of the software stack: the OS and the interpreter.&lt;/p&gt;
&lt;p&gt;I already had notions of how an interpreter works and I could tell the main functions of a Unix kernel, but really understanding software, for me, implied reading its source code. I quickly realized that I would not succeed if I started with Perl or Python and Linux, which were what I was using at the time, so I set my sights on Lua and Minix3.&lt;/p&gt;
&lt;p&gt;Knowing software also implies using it, so Minix3 and Lua became my main OS and language for several months. To be honest, I was running Minix3 in a VM due to the lack of drivers for my hardware. I started to study their code, with the help of &lt;a href="http://www.minix3.org/doc/#book"&gt;the book&lt;/a&gt; for Minix3 and resources found online for Lua. I learnt a lot during that period.&lt;/p&gt;
&lt;p&gt;Eventually, I went back to Linux for practical reasons, but I had been charmed by the down-to-Earth elegance of Lua. It became my favorite programming language. I was still a student though, so I mostly wrote small utilities, Web pages and game prototypes with it. Coursework was Java, Python and C, and for “serious” stuff at &lt;a href="http://resel.fr/"&gt;ResEl&lt;/a&gt; I used Perl, Python or Bash.&lt;/p&gt;
&lt;p&gt;Then in 2010 I went to &lt;a href="https://moodstocks.com/"&gt;Moodstocks&lt;/a&gt; for my MSc Thesis. We were a very tiny startup then, just the founders and a couple of interns. They were a Ruby and C++ shop, so I learnt Ruby, but I didn’t like it: too much magic, and the object-oriented interface to write bindings was a mess compared to the very clean Lua C API.&lt;/p&gt;
&lt;p&gt;Eventually, Moodstocks hired me and I worked for them for over three years. I ended up writing most of their server-side code, I already gave &lt;a href="https://blog.separateconcerns.com/2013-06-20-three-years-proprietary-projects.html"&gt;details here&lt;/a&gt;. A lot of that code leveraged LuaJIT. It was the perfect tool for the job: as flexible and dynamic as Ruby so it worked well as a scripting language, about as fast as C++ so it could be used to implement Computer Vision algorithms, and the FFI made it very easy to call into our existing C / C++ libraries.&lt;/p&gt;
&lt;p&gt;Those are the features that make LuaJIT so attractive: its blazing speed and the FFI. They are why I could write Lua professionally for several years, and I could never thank Mike Pall enough for this. Moreover, LuaJIT has been playing a huge role in the growing popularity of Lua those last few years.&lt;/p&gt;
&lt;p&gt;However, paradoxically, LuaJIT negates the very reason that made me pick Lua in the first place. And by that I mean: I do not deeply understand how LuaJIT works. I have tried, and I will certainly try again, but it is one or two orders of magnitude more complicated than PUC Lua.&lt;/p&gt;
&lt;p&gt;Beyond the purist ideal of understanding the whole stack, this has practical implications. When you find a bug in LuaJIT, understanding it and fixing it is terribly complicated. The best I can do is usually to try to produce a small test case that reproduces the bug (even that is not always easy) and hope Mike Pall finds a fix. With PUC Lua I could probably fix it myself - but of course PUC Lua is so simple that I have never found a bug in it!&lt;/p&gt;
&lt;p&gt;Another issue is that PUC Lua and LuaJIT are diverging. LuaJIT implements Lua 5.1. Lua 5.2 code can be made to work as long as it does not use &lt;code&gt;_ENV&lt;/code&gt;, but code that leverages the new features in Lua 5.3 is not supported at all (although modules like &lt;a href="https://github.com/keplerproject/lua-compat-5.3"&gt;lua-compat-5.3&lt;/a&gt; can probably help). On the other hand, more and more modules require the FFI, making them incompatible with PUC Lua (of course &lt;a href="https://github.com/catwell/luajit-msgpack-pure"&gt;I am a culprit of that myself&lt;/a&gt;). And to top it all, the interpreters work so differently that efficient code in LuaJIT is not necessarily good in PUC Lua, and vice versa.&lt;/p&gt;
&lt;p&gt;These days, the purist, simplicity-loving part of me tends to win over the pragmatist in my (rare) non-work code, and my current target of choice is PUC Lua. At work, I write almost exclusively C and almost no Lua, and the little I do write runs on &lt;a href="https://blog.separateconcerns.com/2019-02-15-goodbye-lima.html"&gt;a machine&lt;/a&gt; which does not support LuaJIT. The only reasons I still use LuaJIT are maintenance of luajit-msgpack-pure and my use of OpenResty, which for my purposes could as well be built with PUC Lua instead.&lt;/p&gt;
&lt;p&gt;That being said, I like knowing that I could take my Lua code and, with a few tweaks and a change of interpreter, get a serious performance boost. So I still hope someone (if not Mike Pall) will make a version of LuaJIT that supports the Lua 5.3 interface. Otherwise, I guess I can still decide that learning more about JIT compilation is worth it and spend a few months diving into that LuaJIT codebase!&lt;/p&gt;
&lt;p&gt;Oh, and by the way, with this whole systemd thing, I am semi-seriously considering giving Minix3 a second chance :)&lt;/p&gt;</description><author>Separate Concerns</author><pubDate>Thu, 18 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2015-06-18-love-hate-luajit.html</guid></item><item><title>Attenuated Transmission</title><link>https://blog.yiningkarlli.com/2015/06/attenuated-transmission.html</link><description>&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Jun/fluid.2.png"&gt;&lt;img alt="Blue liquid in a glass box, with attenuated transmission. Simulated using PIC/FLIP in Ariel, rendered in Takua a0.5 using VCM." src="https://blog.yiningkarlli.com/content/images/2015/Jun/preview/fluid.2.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few months ago I added attenuation to Takua a0.5’s Fresnel refraction BSDF. Adding attenuation wound up being more complex than originally anticipated because handling attenuation through refractive/transmissive mediums requires volumetric information in addition to the simple surface differential geometry. In &lt;a href="http://blog.yiningkarlli.com/2015/03/bsdf-system.html"&gt;a previous post about my BSDF system&lt;/a&gt;, I mentioned that the BSDF system only considered surface differential geometry information; adding attenuation meant extending my BSDF system to also consider volume properties and track more information about previous ray hits.&lt;/p&gt;

&lt;p&gt;First off, what is attenuation? Within the context of rendering and light transport, attenuation is when light is progressively absorbed within a medium, which results in a decrease in light intensity as one goes further and further into a medium away from a light source. One simple example is in deep water- near the surface, most of the light that has entered the water remains unabsorbed, and so the light intensity is fairly high and the water is fairly clear. Going deeper and deeper into the water though, more and more light is absorbed and the water becomes darker and darker. Clear objects gain color when light is attenuated at different rates according to different wavelengths. Combined with scattering, attenuation is a major contributing property to the look of transmissive/refractive materials in real life.&lt;/p&gt;

&lt;p&gt;Attenuation is described using the &lt;a href="https://en.wikipedia.org/wiki/Beer%E2%80%93Lambert_law"&gt;Beer-Lambert Law&lt;/a&gt;. The part of the Beer-Lambert Law we are concerned with is the definition of transmittance:&lt;/p&gt;

&lt;div&gt;\[ T = \frac{\Phi_{e}^{t}}{\Phi_{e}^{i}} = e^{-\tau}\]&lt;/div&gt;

&lt;p&gt;The above equation states that the transmittance of a material is equal to the transmitted radiant flux over the received radiant flux, which in turn is equal to e raised to the power of the negative of the optical depth. If we assume uniform attenuation within a medium, the Beer-Lambert law can be expressed in terms of an attenuation coefficient μ as:&lt;/p&gt;

&lt;div&gt;\[ T = e^{-\mu\ell} \]&lt;/div&gt;

&lt;p&gt;From these expressions, we can see that light is absorbed exponentially as distance into an absorbing medium increases. Returning back to building a BSDF system, supporting attenuation therefore means having to know not just the current intersection point and differential geometry, but also the distance a ray has traveled since the &lt;em&gt;previous&lt;/em&gt; intersection point. Also, if the medium’s attenuation rate is not constant, then an attenuating BSDF not only needs to know the distance since the previous intersection point, but also has to sample along the incoming ray at some stepping increment and calculate the attenuation at each step. In other words, supporting attenuation required BSDFs to know the previous hit point in addition to the current one and also requires BSDFs to be able to ray march from the previous hit point to the current one.&lt;/p&gt;

&lt;p&gt;Adding previous hit information and ray march support to my BSDF system was a very straightforward task. I also added volumetric data support to Takua, allowing for the following attenuation test with a glass Stanford Dragon filled with a checkerboard red and blue medium. The red and blue medium is ray marched through to calculate the total attenuation. Note how the thinner parts of the dragon allow more light through resulting in a lighter appearance, while thicker parts of the dragon attenuate more light resulting in a darker appearance. Also note the interesting red and blue caustics below the dragon:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Jun/dragon_vcm.png"&gt;&lt;img alt="Glass Stanford Dragon filled with a red and blue volumetric checkerboard attenuating medium. Rendered in Takua a0.5 using VCM." src="https://blog.yiningkarlli.com/content/images/2015/Jun/preview/dragon_vcm.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Things got much more complicated once I added support for what I call “deep attenuation”- that is, attenuation through multiple mediums embedded inside of each other. A simple example is an ice cube floating in a glass of liquid, which one might model in the following way:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Jun/fluid_diagram.png"&gt;
&lt;img alt="Diagram of glass-fluid-ice interfaces. Arrows indicate normal directions." src="https://blog.yiningkarlli.com/content/images/2015/Jun/fluid_diagram.png" /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are two things in the above diagram that make deep attenuation difficult to implement. First, note that the ice cube is modeled without a corresponding void in the liquid- that is, a ray path that travels through the ice cube records a sequence of intersection events that goes something like “enter water, enter ice cube, exit ice cube, exit water”, as opposed to “enter water, exit water, enter ice cube, exit ice cube, enter water, exit water”. Second, note that the liquid boundary is actually slightly &lt;em&gt;inside&lt;/em&gt; of the inner wall of the glass. Intuitively, this may seem like a mistake or an odd property, but this is actually the correct way to model a liquid-glass interface in computer graphics- see &lt;a href="http://adaptivesamples.com/2013/10/19/fluid-in-a-glass/"&gt;this article&lt;/a&gt; and &lt;a href="http://www.aversis.be/tutorials/vray/vray-20-glass-liquid-02.htm"&gt;this other article&lt;/a&gt; for details on why.&lt;/p&gt;

&lt;p&gt;So why do these two cases complicate things? As a ray enters each new medium, we need to know what medium the ray is in so that we can execute the appropriate BSDF and get the correct attenuation for that medium. We can only evaluate the attenuation once the ray &lt;em&gt;exits&lt;/em&gt; the medium, since attenuation is dependent on how far through the medium the ray traveled. The easy solution is to simply remember what the BSDF is when a ray enters a medium, and then use the remembered BSDF to evaluate attenuation upon the next intersection. For example, imagine the following sequence of intersections:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Intersect glass upon entering glass.&lt;/li&gt;
  &lt;li&gt;Intersect glass upon exiting glass.&lt;/li&gt;
  &lt;li&gt;Intersect water upon entering water.&lt;/li&gt;
  &lt;li&gt;Intersect water upon exiting water.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This sequence of intersections is easy to evaluate. The evaluation would go something like:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Enter glass. Store glass BSDF.&lt;/li&gt;
  &lt;li&gt;Exit glass. Evaluate attenuation from stored glass BSDF.&lt;/li&gt;
  &lt;li&gt;Enter water. Store water BSDF.&lt;/li&gt;
  &lt;li&gt;Exit water. Evaluate attenuation from stored water BSDF.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So far so good. However, remember that in the first case, sometimes we might not have a surface intersection to mark that we’ve exited one medium before entering another. The following scenario demonstrates how this first case results in missed attenuation evaluations:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Intersect water upon entering water.&lt;/li&gt;
  &lt;li&gt;Exit water, but no intersection!&lt;/li&gt;
  &lt;li&gt;Intersect ice upon entering ice.&lt;/li&gt;
  &lt;li&gt;Intersect ice upon exiting ice.&lt;/li&gt;
  &lt;li&gt;Enter water again, but no intersection either!&lt;/li&gt;
  &lt;li&gt;Intersect water upon exiting water.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The evaluation sequence ends up playing out okay:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Enter water. Store water BSDF.&lt;/li&gt;
  &lt;li&gt;Exit water, but no intersection. No BSDF evaluated.&lt;/li&gt;
  &lt;li&gt;Enter ice. Intersection occurs, so evaluate attenuation from stored water BSDF. Store ice BSDF.&lt;/li&gt;
  &lt;li&gt;Exit ice. Evaluate attenuation from stored ice BSDF.&lt;/li&gt;
  &lt;li&gt;Enter water again, but no intersection, so no BSDF stored.&lt;/li&gt;
  &lt;li&gt;Exit water…. but there is no previous BSDF stored! No attenuation is evaluated!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Alternatively, in step 6, instead of no previous BSDF, we might still have the ice BSDF stored and evaluate attenuation based on the ice. However, this result is still wrong, since we’re now using the ice BSDF for the water.&lt;/p&gt;

&lt;p&gt;One simple solution to this problem is to keep a stack of previously seen BSDFs with each ray instead of just storing the previously seen BSDF. When the ray enters a medium through an intersection, we push a BSDF onto the stack. When the ray exits a medium through an intersection, we evaluate whatever BSDF is on the top of the stack and pop the stack. Keeping a stack works well for the previous example case:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Enter water. Push water BSDF on stack.&lt;/li&gt;
  &lt;li&gt;Exit water, but no intersection. No BSDF evaluated.&lt;/li&gt;
  &lt;li&gt;Enter ice. Intersection occurs, so evaluate water BSDF from top of stack. Push ice BSDF on stack.&lt;/li&gt;
  &lt;li&gt;Exit ice. Evaluate ice BSDF from top of stack. Pop ice BSDF off stack.&lt;/li&gt;
  &lt;li&gt;Enter water again, but no intersection, so no BSDF stored.&lt;/li&gt;
  &lt;li&gt;Exit water. Intersection occurs, so evaluate water BSDF from top of stack. Pop ice BSDF off stack.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Excellent, we now have evaluated different medium attenuations in the correct order, haven’t missed any evaluations or used the wrong BSDF for a medium, and as we exit the water and ice our stack is now empty as it should be. The first case from above is now solved… what happens with the second case though? Imagine the following sequence of intersections where the liquid boundary is inside of the two glass boundaries:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Intersect glass upon entering glass.&lt;/li&gt;
  &lt;li&gt;Intersect water upon entering water.&lt;/li&gt;
  &lt;li&gt;Intersect glass upon exiting glass.&lt;/li&gt;
  &lt;li&gt;Intersect water upon exiting water.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The evaluation sequence using a stack is:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Enter glass. Push glass BSDF on stack.&lt;/li&gt;
  &lt;li&gt;Enter water. Evaluate glass attenuation from top of stack. Push water BSDF.&lt;/li&gt;
  &lt;li&gt;Exit glass. Evaluate water attenuation from top of stack, pop water BSDF.&lt;/li&gt;
  &lt;li&gt;Exit water. Evaluate glass attenuation from top of stack, pop glass BSDF.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The evaluation sequence is once again in the wrong order- we just used the glass attenuation when we were traveling through water at the end! Solving this second case requires a modification to our stack based scheme. Instead of popping the top of the stack every time we exit a medium, we should scan the stack from the top down and pop the first instance of a BSDF matching the BSDF of the surface we just exited through. This modified stack results in:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Enter glass. Push glass BSDF on stack.&lt;/li&gt;
  &lt;li&gt;Enter water. Evaluate glass attenuation from top of stack. Push water BSDF.&lt;/li&gt;
  &lt;li&gt;Exit glass. Evaluate water attenuation from top of stack. Scan stack and find first glass BSDF matching the current surface’s glass BSDF and pop that BSDF.&lt;/li&gt;
  &lt;li&gt;Exit water. Evaluate water attenuation from top of stack. Scan stack and pop first matching water BSDF.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At this point, I should mention that pushing/popping onto the stack should only occur when a ray travels &lt;em&gt;through&lt;/em&gt; a surface. When the ray simply reflects off of a surface, an intersection has occurred and therefore attenuation from the top of the stack should still be evaluated, but the stack itself should not be modified. This way, we can support diffuse inter-reflections inside of an attenuating medium and get the correct diffuse inter-reflection &lt;em&gt;with&lt;/em&gt; attenuation between diffuse bounces! Using this modified stack scheme for attenuation evaluation, we can now correctly handle all deep attenuation cases and embed as many attenuating mediums in each other as we could possibly want.&lt;/p&gt;

&lt;p&gt;…or at least, I think so. I plan on running more tests before conclusively deciding this all works. So there may be a followup to this post later if I have more findings.&lt;/p&gt;

&lt;p&gt;A while back, I &lt;a href="http://blog.yiningkarlli.com/2014/01/flip-simulator.html"&gt;wrote a PIC/FLIP fluid simulator&lt;/a&gt;. However, at the time, Takua Renderer didn’t have attenuation support, so I wound up &lt;a href="http://blog.yiningkarlli.com/2014/02/flip-meshing-pipeline.html"&gt;rendering my simulations with Vray&lt;/a&gt;. Now that Takua a0.5 has robust deep attenuation support, I went back and used some frames from my fluid simulator as tests. The image at the top of this post is a simulation frame from my fluid simulator, rendered entirely with Takua a0.5. The water is set to attenuate red and green light more than blue light, resulting in the blue appearance of the water. In addition, the glass has a slight amount of hazy green attenuation too, much like real aquarium glass. As a result, the glass looks greenish from the ends of each glass plate, but is clear when looking through each plate, again much like real glass. Here are two more renders:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Jun/fluid.0.png"&gt;&lt;img alt="Simulated using PIC/FLIP in Ariel, rendered in Takua a0.5 using VCM." src="https://blog.yiningkarlli.com/content/images/2015/Jun/preview/fluid.0.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Jun/fluid.1.png"&gt;&lt;img alt="Simulated using PIC/FLIP in Ariel, rendered in Takua a0.5 using VCM." src="https://blog.yiningkarlli.com/content/images/2015/Jun/preview/fluid.1.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Thu, 18 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2015/06/attenuated-transmission.html</guid></item><item><title>WWDC app for OS X</title><link>https://xenodium.com/wwdc-app-for-os-x</link><description>&lt;p&gt;&lt;a href="https://github.com/insidegui"&gt;Guilherme Rambo&lt;/a&gt; created a great OS X &lt;a href="https://github.com/insidegui/WWDC"&gt;OS X app for viewing WWDC content&lt;/a&gt;. Just installed it. Super handy. Thanks. Installing as simple as:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ brew cask install wwdc
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 17 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/wwdc-app-for-os-x</guid></item><item><title>SSD Storage Cluster - Update and Diagram</title><link>https://smcleod.net/2015/06/ssd-storage-cluster-update-and-diagram/</link><description>&lt;p&gt;Due to several recent events beyond my control I&amp;rsquo;m a bit behind on the project - hence the lack of updates which I apologise for.&lt;/p&gt;
&lt;p&gt;The goods news is that I&amp;rsquo;m back working to finish off the clusters and I&amp;rsquo;m happy to report that all is going to plan.&lt;/p&gt;
&lt;p&gt;Here is the final digram of the two-node cluster design:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://smcleod.net//img/san/diagram.png" /&gt;&lt;/p&gt;
&lt;p&gt;Plain text version available &lt;a href="https://gist.github.com/sammcj/0503007ceb5038a0de3c"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://smcleod.net//img/san/lcmcpcmk.png" /&gt;&lt;/p&gt;
&lt;p&gt;This was generated from the &lt;a href="http://github.com/rasto/lcmc"&gt;LCMC&lt;/a&gt; tool (beware - it&amp;rsquo;s java!).&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Wed, 17 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/06/ssd-storage-cluster-update-and-diagram/</guid></item><item><title>Trainwreck</title><link>https://olshansky.info/movie/trainwreck/</link><description>Olshansky's review of Trainwreck</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 16 Jun 2015 09:31:24 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/trainwreck/</guid></item><item><title>Catholics, Free Software and Free Knowledge, again</title><link>https://stop.zona-m.net/2015/06/catholics-free-software-and-free-knowledge-again/</link><description>&lt;p&gt;Almost ten years ago, I wrote about &lt;a href="http://archive09.linux.com/articles/49533"&gt;Free Software&amp;rsquo;s surprising sympathy with Catholic doctrine&lt;/a&gt;, noting that, albeit certain statements sound _&amp;ldquo;as if they could have been written by Richard M. Stallman, founder of the &lt;a href="http://www.fsf.org/"&gt;Free Software Foundation&lt;/a&gt; (FSF), in fact, they come from the Vatican Report &amp;ldquo;&lt;a href="http://www.vatican.va/roman_curia/pontifical_councils/pccs/documents/rc_pc_pccs_doc_20020228_ethics-internet_en.html"&gt;Ethics in Internet&lt;/a&gt;&amp;rdquo; (EiI)&amp;rdquo;.&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Tue, 16 Jun 2015 09:21:37 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/06/catholics-free-software-and-free-knowledge-again/</guid></item><item><title>Give Yourself More Playtime</title><link>https://martinrue.com/give-yourself-more-playtime/</link><description>I remember my first computer fondly. As a kid I was more than addicted to the Commodore 64 – perfectly happy to sit and endure at least 5 minutes of the most colourful, potentially epileptic attack you can imagine, simply to have a few games of Boulder Dash.</description><author>Martin Rue</author><pubDate>Tue, 16 Jun 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://martinrue.com/give-yourself-more-playtime/</guid></item><item><title>Debugging Objective-C reference cycles</title><link>https://xenodium.com/debugging-objective-c-reference-cycles</link><description>&lt;p&gt;Overriding retain/release/autorelease may be handy while debugging:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-objc"&gt;- (instancetype)retain {
  NSLog(@&amp;quot;%p, retain\n&amp;quot;, self);
  return [super retain];
}

- (oneway void)release {
  NSLog(@&amp;quot;%p, release\n&amp;quot;, self);
  [super release];
}

- (instancetype)autorelease {
  NSLog(@&amp;quot;%p, autorelease\n&amp;quot;, self);
  return [super autorelease];
}
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 15 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/debugging-objective-c-reference-cycles</guid></item><item><title>Leather Sunglasses Case</title><link>https://june.kim/sunglasses-case/</link><author>june.kim</author><pubDate>Mon, 15 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/sunglasses-case/</guid></item><item><title>FinTech Startups Tug the Industry Forward</title><link>https://www.danstroot.com/posts/2015-06-15-fintech-startups-tug-the-industry-forward</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/fintech2.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Financial services companies are among the most highly regulated industries in the world.  They also suffer from a trust issue.  Trust is a key ingredient in making a financial services business viable. Why would I ever buy insurance, banking services or invest my savings via a company that I didn’t trust?&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2015-06-15-fintech-startups-tug-the-industry-forward"&gt;FinTech Startups Tug the Industry Forward&lt;/a&gt; first appeared on &lt;a href="https://www.danstroot.com"&gt;Dan Stroot's Blog&lt;/a&gt;</description><author>Dan Stroot</author><pubDate>Mon, 15 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2015-06-15-fintech-startups-tug-the-industry-forward</guid></item><item><title>Hot Tub Time Machine 2</title><link>https://olshansky.info/movie/hot_tub_time_machine_2/</link><description>Olshansky's review of Hot Tub Time Machine 2</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 14 Jun 2015 06:42:43 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/hot_tub_time_machine_2/</guid></item><item><title>Kingsman: The Secret Service</title><link>https://olshansky.info/movie/kingsman_the_secret_service/</link><description>Olshansky's review of Kingsman: The Secret Service</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 14 Jun 2015 06:33:45 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/kingsman_the_secret_service/</guid></item><item><title>American History X</title><link>https://olshansky.info/movie/american_history_x/</link><description>Olshansky's review of American History X</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 14 Jun 2015 06:23:39 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/american_history_x/</guid></item><item><title>log - a drop-in replacement for android Log class</title><link>https://zserge.com/posts/log/</link><description>Once upon a time I was making a pretty large app for Android. When everything was almost finished I wondered how shall I remove all my logs before publishing the app? Looks like many other developers are interested in the same question as well.
Surprisingly, the recommented way out is to strip off the Log class from the production builds using ProGuard. Maybe Proguard is nice, but to me it&amp;rsquo;s really weird why instead of having a nice out-of-box API for logging I need to modify my byte code with some 3rd party tool?</description><author>zserge's blog</author><pubDate>Sun, 14 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/log/</guid></item><item><title>Truss Resume Creator</title><link>https://solomon.io/truss/</link><description>Truss is a beautiful, simple tool for creating resumes.</description><author>Sam Solomon</author><pubDate>Sun, 14 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/truss/</guid></item><item><title>Mad Max: Fury Road Review</title><link>https://honestmusings.wordpress.com/2015/06/13/mad-max-fury-road-review/</link><description>Dirt. Metal. Water. War&amp;#8230;thump&amp;#8230;thump&amp;#8230;thump. Blood. Grime&amp;#8230;Guitar. Drums&amp;#8230;dum..dum&amp;#8230;dum. Human.Inhuman.God.Monster. Hope&amp;#8230;survive&amp;#8230;survive&amp;#8230;survive! It&amp;#8217;s a metal rock show in an apocalyptic wasteland masquerading as a movie. And I am not saying that only because of the humongous guitar mounted on an armored truck. It starts with a far off beat when the protagonist is suddenly made aware of being &amp;#8230; &lt;a class="more-link" href="https://honestmusings.wordpress.com/2015/06/13/mad-max-fury-road-review/"&gt;Continue reading &lt;span class="screen-reader-text"&gt;Mad Max: Fury Road&amp;#160;Review&lt;/span&gt;&lt;/a&gt;</description><author>Honest Musings</author><pubDate>Sat, 13 Jun 2015 18:23:50 GMT</pubDate><guid isPermaLink="true">https://honestmusings.wordpress.com/2015/06/13/mad-max-fury-road-review/</guid></item><item><title>London grub</title><link>https://xenodium.com/london-grub</link><description>&lt;p&gt;Beyond the hype, buzz, and pricey gimmicks… Places to eat in London:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Antipode.&lt;/li&gt;
&lt;li&gt;Arang.&lt;/li&gt;
&lt;li&gt;Bone Daddies.&lt;/li&gt;
&lt;li&gt;Gelupo.&lt;/li&gt;
&lt;li&gt;Grind.&lt;/li&gt;
&lt;li&gt;Holy Cow.&lt;/li&gt;
&lt;li&gt;Kerbisher and Malt.&lt;/li&gt;
&lt;li&gt;Kulu Kulu (South Ken).&lt;/li&gt;
&lt;li&gt;Le Relais de Venise.&lt;/li&gt;
&lt;li&gt;Lucky 7's.&lt;/li&gt;
&lt;li&gt;Royal China.&lt;/li&gt;
&lt;li&gt;Shree Krishna Vada Pav.&lt;/li&gt;
&lt;li&gt;Sri Suwoon.&lt;/li&gt;
&lt;li&gt;Tayyabs.&lt;/li&gt;
&lt;li&gt;The Cow.&lt;/li&gt;
&lt;li&gt;Tonkotsu.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 13 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/london-grub</guid></item><item><title>A super privileged Puppet container</title><link>https://purpleidea.com/blog/2015/06/12/a-super-privileged-puppet-container/</link><description>&lt;p&gt;In this new crazy world of &lt;a href="https://en.wikipedia.org/wiki/Docker_%28software%29"&gt;containers&lt;/a&gt; and immutable hosts, one might still want to run previous generation software such as &lt;a href="https://duckduckgo.com/l/?kh=-1&amp;amp;uddg=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FPuppet_(software)"&gt;Puppet&lt;/a&gt; on a current generation &lt;a href="https://www.projectatomic.io/"&gt;Atomic host&lt;/a&gt;. This article will explain how you can do that, and offer some &lt;a href="https://github.com/purpleidea/spc-puppet-apply"&gt;proof of concept code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The atomic host doesn&amp;rsquo;t provide a &lt;a href="https://en.wikipedia.org/wiki/Yellowdog_Updater,_Modified"&gt;yum&lt;/a&gt; or &lt;a href="https://fedoraproject.org/wiki/Dnf"&gt;dnf&lt;/a&gt; command, because the software is pre-baked into a read-only &lt;code&gt;/usr/&lt;/code&gt; partition. To &amp;ldquo;&lt;em&gt;install&lt;/em&gt;&amp;rdquo; (to use) additional software, it usually needs to be distributed and run as a container.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Fri, 12 Jun 2015 21:06:55 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/06/12/a-super-privileged-puppet-container/</guid></item><item><title>The Magic of Reality</title><link>https://apurva-shukla.me/bookshelf/the-magic-of-reality/</link><description>⭐ ⭐ ⭐ ⭐ Reality is often mundane to us, so much so that we tend to forget the true beauty of life and our world.

This short read really got…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Fri, 12 Jun 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-magic-of-reality/</guid></item><item><title>The Essential Neruda</title><link>https://june.kim/neruda/</link><author>june.kim</author><pubDate>Wed, 10 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/neruda/</guid></item><item><title>Zen and the Art of Motorcycle Maintenance</title><link>https://june.kim/zamm/</link><author>june.kim</author><pubDate>Wed, 10 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/zamm/</guid></item><item><title>My working playlist</title><link>https://xenodium.com/my-working-playlist</link><description>&lt;p&gt;It's been a while since I spotted &lt;a href="http://www.asianefficiency.com/motivation/music-working/"&gt;The Ultimate Music Collection for Getting Work Done&lt;/a&gt;. Since then, I've been on the lookout for music to work to. Some favorites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/B_Fleischmann_I_m_Not_Ready_For_The_Grave_Yet?id%3DBvu3fq5u5nbqcouo55bqi5qukjq"&gt;B. Fleischmann - I'm Not Ready For The Grave Yet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/B_Fleischmann_Pop_Loops_For_Breakfast?id%3DB55lzvhp5xn2mkrzggq2uymiwm4"&gt;B. Fleischmann - Pop Loops For Breakfast&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/B_Fleischmann_Sidonie?id%3DBu5v5pc4ixxzapcoehnpllfvm5u"&gt;B. Fleischmann - Sidonie&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/B_Fleischmann_The_Humbucking_Coil?id%3DBok7yvyylg7ddkofaaecjdsduky"&gt;B. Fleischmann - The Humbucking Coil&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Stars_of_the_Lid_The_Tired_Sounds_of_Stars_of_the?id%3DBasr7yt6jlsut3v2tpua7kfcckm"&gt;B. Fleischmann - The Tired Sounds of Stars of the Lid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/B_Fleischmann_Welcome_Tourist?id%3DByefc55y7psyxg4okrq63mn4nne"&gt;B. Fleischmann - Welcome Tourist&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Bexar_Bexar_Haralambos?id%3DBpyhpbxh6b4wthiczeokgiuijo4"&gt;Bexar Bexar - Haralambos&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Budhaditya_Mukherjee_Sitar_Recital?id%3DBtawoyja7nxl2arsuimelitwzay"&gt;Budhaditya Mukherjee - Sitar Recital&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Daft_Punk_TRON_Legacy?id%3DBbcjlhafmpp5ueztndxevp4cfuq"&gt;Daft Punk - TRON: Legacy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/General_Fuzz_Soulful_Filling?id%3DB7rb24bzexr2q5bfjzffhvdd5he"&gt;General Fuzz - Soulful Filling&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Hans_Zimmer_Inception_Music_From_The_Motion_Pictur?id%3DBoebgqwhs6bsgytjw2eybh7jiny"&gt;Inception (Music From The Motion Picture)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/ISAN_Lucky_Cat?id%3DBjuvgzm2mocch55nolmbsjenaxy"&gt;ISAN - Lucky Cat&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/ISAN_Plans_Drawn_In_Pencil?id%3DBmp2y6k5bstvqlnzn2ncexcyolq"&gt;ISAN - Plans Drawn In Pencil&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Jayanthi_Kumaresh_Mysterious_Duality?id%3DByrdsgd3b7ixcouemqqouxf45ia"&gt;Jayanthi Kumaresh - Mysterious Duality&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Mogwai_Les_Revenants?id%3DBu2zb5nvoth3ead6v5riw43by7u"&gt;Mogwai - Les Revenants&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Moondog_Big_Cat?id%3DB2hq6dlicqboshlev5eeiy53ybe"&gt;Moondog - Big Cat&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Various_Artists_Moonrise_Kingdom_Original_Soundtra?id%3DB5babupzgcigh6jdprp3ga3owzm"&gt;Moonrise Kingdom (Original Soundtrack)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Nico_Muhly_Drones?id%3DBlj2wetseui4m5gfjjk5lssenui"&gt;Nico Muhly - Drones&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Paul_Leonard_Morgan_Limitless_Original_Motion_Pict?id%3DBev5grya2zxgojikqwkdcxmdijq"&gt;Paul Leonard-Morgan - Limitless (Original Motion Picture Soundtrack)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Robert_Scott_Thompson_Upon_the_Edge_of_Night?id%3DBpkg77vpxsfgu4dj53y5ucxa4qe"&gt;Robert Scott Thompson - Upon the Edge of Night&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Ryan_Miller_The_Kings_of_Summer_Jordan_Vogt_Robert?id%3DBx2mxfujrx5mjkqq6mm23zwzj54"&gt;Ryan Miller - The Kings of Summer (Jordan Vogt-Roberts' Original Motion Picture Soundtrack)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/music/listen#/album//Stars%2Bof%2Bthe%2BLid/And%2BTheir%2BRefinement%2Bof%2Bthe%2BDecline"&gt;Stars of the Lid - And Their Refinement of the Decline&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Stars_of_the_Lid_Gravitational_Pull_vs_The_Desire?id%3DBdnfpvqwopgqufuy2ly6u3lkhvy"&gt;Start of the Lid - Gravitational Pull vs. The Desire for an Aquatic Life&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Terry_Riley_Terry_Riley_A_Rainbow_In_Curved_Air_Po?id%3DBmfe6h2d7heiey4xz74ocg6sx6e"&gt;Terry Riley - A Rainbow In Curved Air; Poppy Nogood and the Phantom Band&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Social-Network-Trent-Reznor-Atticus/dp/B0044430H8/ref%3Dtmm_msc_swatch_0?_encoding%3DUTF8&amp;amp;sr%3D&amp;amp;qid%3D"&gt;Trent Reznor &amp;amp; Atticus Ross - The Social Network (Soundtrack from the Motion Picture)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Trentem%25C3%25B8ller_Into_The_Great_Wide_Yonder?id%3DBf6v47rm3dvgrjaircusjtocbfq"&gt;Trentemøller - Into The Great Wide Yonder&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Tycho_Awake?id%3DBtc34r45fy7qwk4t6irzpkduv4a"&gt;Tycho - Awake&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Various_Artists_Singing_Strings_From_India?id%3DBvkavd7gn62io3lmskjsbgpvtvy"&gt;Various Artists - Singing Strings From India&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.vitling.com/toys/triple_saw/"&gt;vitling: Triple Saw (algorithmic music) #algorave&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Justin_Hurwitz_Whiplash_Original_Motion_Picture_So?id%3DBfdbec3biny47s6rwchdifzgrg4"&gt;Whiplash (Original Motion Picture Soundtrack)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/music/album/Youth_Lagoon_The_Year_Of_Hibernation?id%3DBfw6onp7zxplpmlrheu3rmd3yui"&gt;Youth Lagoon - The Year Of Hibernation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 08 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/my-working-playlist</guid></item><item><title>Moving past averages in SQL (Postgres) – Percentiles</title><link>/2015/06/07/Moving-past-averages-in-SQL-Postgres-Percentiles/</link><description>&lt;p&gt;Often when you&amp;rsquo;re tracking a metric for the first time you take a look at your average. For example what is your ARPU - Average Revenue Per User. In theory this tells you if you can acquire new user how much you&amp;rsquo;ll make off that user. Or maybe what&amp;rsquo;s your average life time value of a customer. Yet, many that are more familiar looking and extracting meaning from data median or a few different looks at &lt;a href="http://apmblog.dynatrace.com/2012/11/14/why-averages-suck-and-percentiles-are-great/"&gt;percentiles can be much more meaningful&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And while you can very easily get the &lt;code&gt;AVG&lt;/code&gt; in Postgres, with a small amount more effort you can report on percentiles as well. Window functions have been around for some time in Postgres. They allow you to order your result set over a certain group. The most basic example is if you want to order by date, but know which one falls at place 10 in order you can use a window function and project out the &lt;code&gt;rank()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Beyond outputting the rank yourself and doing extra manipulation Postgres has some great utilities to make the most common uses even easier. Being able to compute things such as the perc 95 directly on the data, or lay out for every record in the result where it falls within a percentile is hugely useful. Let&amp;rsquo;s take a look:&lt;/p&gt;
&lt;p&gt;Assuming you have a table called purchases, which has a total in it we could try:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT id,
total,
ntile(100) OVER (ORDER BY total) AS perc_rank
FROM purchases
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This would give us something like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; id | total | perc_rank
----------|---------|-----------
264 | 12034 | 100
643 | 11830 | 100
...
...
304 | 751 | 95
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What this would tell us is we have less than 5% of our purchases that have a total over 751. From here you can start to dig in and extract all sorts of different meanings, and by doing directly in SQL you&amp;rsquo;re closer to the data and have one less processing step.&lt;/p&gt;
&lt;p&gt;Percentiles get even more fun with the ordered set functions that came out in &lt;a href="/2014/02/02/Examining-PostgreSQL-9.4/"&gt;Postgres 9.4&lt;/a&gt;. They even allow you to project out hypothetical values in certain cases. For now I&amp;rsquo;d encourage adding ntile to your toolbox anytime you&amp;rsquo;re analyzing average or medians it will make your world a bit better, and then consider exploring further on the &lt;a href="http://www.postgresql.org/docs/9.4/static/functions-aggregate.html#FUNCTIONS-ORDEREDSET-TABLE"&gt;ordered set functions&lt;/a&gt;&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Sun, 07 Jun 2015 23:55:56 GMT</pubDate><guid isPermaLink="true">/2015/06/07/Moving-past-averages-in-SQL-Postgres-Percentiles/</guid></item><item><title>Denim Sling Bag</title><link>https://june.kim/sling-bag/</link><author>june.kim</author><pubDate>Sun, 07 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/sling-bag/</guid></item><item><title>2015-06-07/01</title><link>https://ho.dges.online/pictures/2015-06-07-01/</link><description/><author>ho.dges.online</author><pubDate>Sun, 07 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-06-07-01/</guid></item><item><title>2015-06-07/02</title><link>https://ho.dges.online/pictures/2015-06-07-02/</link><description/><author>ho.dges.online</author><pubDate>Sun, 07 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-06-07-02/</guid></item><item><title>Thoughts on Writing</title><link>https://captnemo.in/blog/2015/06/07/on-writing/</link><description>&lt;p&gt;I have always wanted to be a writer. I think secretly us all reader-folk have that ambition. The joy of getting across your thoughts to another person without ever having met them is enormous.&lt;/p&gt;

&lt;p&gt;Most of my writing time these days is spent over email, chat or my not-so-frequent blog posts. I tend to do a lot of research while writing, and it takes up a lot of time. As such, my writing output tends to be diminutive compared to what I’d like.&lt;/p&gt;

&lt;p&gt;However, if you’ll go through my blog posts and emails, I write a lot about &lt;em&gt;trivial things&lt;/em&gt;. Things that many people have already written about. Things that have probably been discussed to death, and where I have very little chance of actually coming up with something new.&lt;/p&gt;

&lt;p&gt;Should I still go ahead and write about it?&lt;/p&gt;

&lt;p&gt;This question has been bugging me for a while, especially as a blogger. I mostly write on technical topics these days. For instance, I have given talks on [Software Development], [UX Design], and even [Bitcoin]. I am nowhere close to being an authority on any of these things. Even in my specialized field of Web Development, there are so many things that I’m only barely aware about. So many things I am yet to even form my own opinions about. Topics I don’t even know exist.&lt;/p&gt;

&lt;p&gt;When I go and read an article about Software Development from &lt;a href="http://www.joelonsoftware.com/" title="Joel on Software"&gt;Joel Spolsky&lt;/a&gt;, or an article on Security by &lt;a href="https://www.schneier.com/" title="Schneier on Security"&gt;Bruce Schneier&lt;/a&gt;, or something on Startups by &lt;a href="http://paulgraham.com/articles.html" title="Essays by Paul Graham"&gt;Paul Graham&lt;/a&gt;, or &lt;a href="https://news.ycombinator.com/threads?id=tptacek" title="tptacek's comments on HN"&gt;tptacek&lt;/a&gt; on Hacker News; I instantly sit back and take notice: I know their credentials and the fact that they are speaking authoritatively on the topic. However, what can I, a meager undergrad with almost zero experience, write on such topics. Why should I even try, when there are people hundreds of time better who understand these things a thousand times better than me.&lt;/p&gt;

&lt;p&gt;In retrospect, this sounds quite similar to the &lt;a href="https://en.wikipedia.org/wiki/Impostor_syndrome" title="Impostor syndrome"&gt;Imposter Syndrome&lt;/a&gt;; and I’m not sure if this is exactly the same thing. I don’t get a feeling that I’m a fraud. I totally understand my own capabilities and successes, but the mere fact that there are people far better at what I’m doing is enough to dis-hearten me.&lt;/p&gt;

&lt;p&gt;I’ve given this a lot of thought. A really good summary of my response is in the following answer by &lt;a href="http://www.prufrock451.com/" title="Official website for James Erwin"&gt;James Erwin&lt;/a&gt;, author of Rome Sweet Rome in a reddit AMA to a question asking for writer advice:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;And if you’re going to write, write what you want to write. The odds against any creator are insane. If you’re going to devote months of your time, don’t let it be for an idea you think will sell. Odds are it won’t. Write something you want to write, or need to write. Write for yourself before anyone else. I’d rather read someone who is excited and passionate about what they want to say than someone who’s obviously trying to say what they think I want to hear.&lt;/p&gt;

  &lt;p&gt;— &lt;a href="https://www.reddit.com/r/IAmA/comments/2w72o7/so_i_sold_a_reddit_reply_to_warner_brothers_a_few/coo5gys" title="permalink to quote in his reddit ama thread"&gt;James Erwin&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I write, despite all these doubts, for the following reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Self-learning. A blog is an excellent way to keep track of your self-learning. Its amazing to come back a few years later and see the things you were struggling with before. Its equally amazing to do a trivial google search for an issue you face and find your own blog post or stackoverflow answer on the same.&lt;/li&gt;
  &lt;li&gt;Sharing Knowledge. Yes, there are people who might know it better, but that shouldn’t mean I should keep my knowledge to myself. That would go against all the values that I stand for.&lt;/li&gt;
  &lt;li&gt;Network Effect: Not in the strictest sense of the word, but my friend &lt;a href="http://shashankmehta.in" title="Shashank's personal website"&gt;Shashank&lt;/a&gt; recently brought this up. I have a circle of people who know me and would vouch for my credentials. For the same reason, they are more likely to trust me as source, instead of a third person who they have no knowledge of.&lt;/li&gt;
  &lt;li&gt;I love writing. The mere process of putting words down is enchanting for me.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The next question that rises is: “What should I write about?”. Ruling out things I have no clue about, that still leaves a large number of topics I can cover. I am interested in UX Design, Hackers, Computer Security, Software Development, rationalism, skepticism, Free and Open Source movements, Political activism, Technocracy with a passing interest in several other fields such as cosmology and geek culture.&lt;/p&gt;

&lt;p&gt;I am not going to pick one every day and write about something new. I don’t want to write something rubbish just for the sake of writing it. I ultimately want to write because I have something to say. It doesn’t have to be unique or ground-breaking. What matters is that I &lt;em&gt;want to write about it&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A few days back someone contacted me on facebook asking me advice on getting started with web development. I get a lot of these queries, mostly over facebook, email, and quora. Our conversation went back and forth with me suggesting resources, and he getting exceedingly confused over whether he should use codecademy or udacity, or coursera or something else.&lt;/p&gt;

&lt;p&gt;I have devoted a lot of time in my life to teaching people the nuances of these things. I have mentored many people, and acutely know the issues a beginner faces. In turn, I had &lt;a href="https://twitter.com/kumar_ishan" title="Kumar Ishan"&gt;an amazing mentor&lt;/a&gt; who taught me the importance of always learning things.&lt;/p&gt;

&lt;p&gt;All of this lead me to realize one fact: I have been writing a lot about Software Development. Unfortunately, a lot of it is in private emails and chat. And I wanna write more about it, on a public medium.&lt;/p&gt;

&lt;p&gt;So, I’m announcing the next thing I’m working on: a book called &lt;a href=""&gt;The Joy of Software Development&lt;/a&gt;. A few obligatory links:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The source code is available on &lt;a href="https://github.com/captn3m0/the-joy-of-software-development" title="GitHub source for the book"&gt;GitHub&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Its licensed under the &lt;a href="https://creativecommons.org/licenses/by-sa/4.0/"&gt;CC-by-SA 4.0 license&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;The canonical url for the site is &lt;a href="https://josd.captnemo.in/" title="The Joy of Software Development"&gt;https://josd.captnemo.in/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Its hosted on the excellent &lt;a href="http://gitbook.com/" title="GitBook"&gt;GitBook&lt;/a&gt; platform, which automatically publishes each version as epub, mobi, and pdf as well.&lt;/li&gt;
  &lt;li&gt;Who the &lt;a href="https://josd.captnemo.in/content/hn.html" title="A few words to the HN community"&gt;target audience&lt;/a&gt; for the book is.&lt;/li&gt;
  &lt;li&gt;You can &lt;a href="https://github.com/captn3m0/the-joy-of-software-development/issues/new" title="File a new issue for the book"&gt;file an issue&lt;/a&gt; for critique on GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As expected, all the development, writing, and discussion on the book will be in the public, mostly on GitHub. I am writing this book, because I feel it needs to be written. I don’t expect it to be published, but that won’t stop me from writing it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aartur" title="He's made hackerusesthis"&gt;Artur Siekielski&lt;/a&gt; recently came across it, and wrote the following:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The book you’re writing looks very good! It’s filling a niche as I don’t think there are any modern books that focus on “bird’s eye view”, and I see it would be helpful for many programmers to refresh knowledge.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gave me a bit of validation, as the only person who’d read it so far were my close friends.&lt;/p&gt;

&lt;p&gt;If you wanna support its development, you can do one of the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Poke me on &lt;a href="https://twitter.com/captn3m0" title="@captn3m0"&gt;twitter&lt;/a&gt; or &lt;a href="/contact/"&gt;email&lt;/a&gt; and let me know you want to read it&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://josd.captnemo.in/" title="The Joy of Software Development"&gt;Subscribe&lt;/a&gt; to the mailing list (I’ll send out updates there)&lt;/li&gt;
  &lt;li&gt;Watch or Star the repo on &lt;a href="https://github.com/captn3m0/the-joy-of-software-development" title="GitHub source for the book"&gt;GitHub&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;See the &lt;a href="https://github.com/captn3m0/the-joy-of-software-development/blob/master/CONTRIBUTING.md" title="Contributing Guide on GitHub"&gt;CONTRIBUTING&lt;/a&gt; file on github for contributing to the text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Asking for Donations might sound weird to some. I don’t really need the money, but I think I’d get an additional sense of responsibility towards finishing it if people start giving me money. I will be donating the entire proceedings to &lt;a href="https://www.eff.org/" title="Electronic Frontier Foundation"&gt;EFF&lt;/a&gt;.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Sun, 07 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/06/07/on-writing/</guid></item><item><title>Monolith vs Microservices</title><link>https://nicolaiarocci.com/monolith-vs-microservices/</link><description>&lt;p&gt;I spent the last couple days in Paris with a bunch of smart architects and developers who are about to deal with a complex Monolithic-to-Microservices architecture transition.&lt;/p&gt;
&lt;p&gt;On my flight back to Italy I jotted down a few thoughts on the topic and then, this morning, the first thing that comes up on my newsfeed is &lt;a href="http://martinfowler.com/bliki/MonolithFirst.html"&gt;Monolith First&lt;/a&gt; by Martin Fowler. Stunning, because the essay content totally resonates with my own notes, so much that it would perfectly serve as a recap for them.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 04 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/monolith-vs-microservices/</guid></item><item><title>Adventures after Google I/O-1(Snackbar).</title><link>https://prashamhtrivedi.in/adventures-snackbars-1.html</link><description>After trying and playing some new stuffs(except M preview) released in Google I/O, I have found some trivial things to take care of. In the first part of the series I will talk about Snackbars.</description><author>Prasham H Trivedi</author><pubDate>Thu, 04 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/adventures-snackbars-1.html</guid></item><item><title>Building an Object Graph in Rails</title><link>https://blog.tracefunc.com/2015/06/04/building-an-object-graph-in-rails-html/</link><description>&lt;p&gt;I was needing to do some object cleanup in our rails app the other day, and purge some malformed objects, so I put together a quick script using some ActiveRecord reflection to walk the object chain.&lt;/p&gt;

&lt;!-- EXCERPT --&gt;

&lt;div class="language-ruby highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;table class="rouge-table"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="rouge-gutter gl"&gt;&lt;pre class="lineno"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
&lt;/pre&gt;&lt;/td&gt;&lt;td class="rouge-code"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# Squelch SQL logs, if you're running from rails console&lt;/span&gt;
&lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# Output formatters. Trailing ':' on both, plus the staggered indent&lt;/span&gt;
&lt;span class="c1"&gt;# of 4n and 4n+2 makes the output valid YAML, if automated analysis&lt;/span&gt;
&lt;span class="c1"&gt;# is called for.&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;puts_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"    "&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"#"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;":"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;puts_assoc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assoc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"    "&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"  "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;assoc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;":"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;puts_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;puts_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include?&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;
    &lt;span class="c1"&gt;# seen maintains a list of nodes to avoid mutual recursion&lt;/span&gt;
    &lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;
    &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reflections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;assoc&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="c1"&gt;# To see all locations an object is referenced, get rid of the&lt;/span&gt;
      &lt;span class="c1"&gt;# "- seen" here. I only cared about which objects were present&lt;/span&gt;
      &lt;span class="c1"&gt;# anywhere in the tree, so this was fine.&lt;/span&gt;
      &lt;span class="n"&gt;associated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assoc&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;
      &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;associated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;empty?&lt;/span&gt;

      &lt;span class="c1"&gt;# Print an entry for the association, then recurse&lt;/span&gt;
      &lt;span class="n"&gt;puts_assoc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assoc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;associated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;puts_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# Also outputs a footer listing all seen objects once, take it or leave it&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zero?&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt;
    &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;puts_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="kp"&gt;nil&lt;/span&gt; &lt;span class="c1"&gt;# return nil to avoid flooding terminal in rails console&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Usage: call with the root node for the object graph&lt;/span&gt;
&lt;span class="n"&gt;puts_tree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Worked like a charm, and made it easy to compare my bad object with other good ones. Just be careful of any global objects (a common shared subscription package, for instance, that &lt;code class="highlighter-rouge"&gt;has_many :users&lt;/code&gt;) that could lead to traversing your entire database, or logging associations that could overwhelm your output on older or heavily used objects. Subtracting a blacklist from reflection keys on line 18 would do the trick there.&lt;/p&gt;</description><author>set_trace_func</author><pubDate>Thu, 04 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tracefunc.com/2015/06/04/building-an-object-graph-in-rails-html/</guid></item><item><title>When is migrating to cloud not the best choice?</title><link>https://danielsada.tech/blog/milk-as-a-service/</link><description>With all the new technologies emerging for cloud migration, there is a wide acceptance that cloud services are the cheapest, and best way to manage some kinds of infrastructures. Nevertheless, on the decision on wether we should migrate into cloud must still be analysed in other ways.
That&amp;rsquo;s why the current Milk-as-a-Service analogy is great, as it illustrates the downfalls of moving to cloud, and the exact situation on wether you need a migration or not.</description><author>Daniel Sada Caraveo | Developer Productivity &amp;amp; Culture</author><pubDate>Thu, 04 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://danielsada.tech/blog/milk-as-a-service/</guid></item><item><title>Abraham Lincoln: Vampire Hunter</title><link>https://apurva-shukla.me/bookshelf/abraham-lincoln-vampire-hunter/</link><description>⭐ ⭐ ⭐ ⭐ It was a great read I must say!

Packed with conspiracy and alternate history while remaining true to the facts of Lincoln’s life…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Wed, 03 Jun 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/abraham-lincoln-vampire-hunter/</guid></item><item><title>Coding Pet Peeves</title><link>https://cmdev.com/blog/2015-06-03-codingpetpeeves/</link><description>Eight little things I like to nitpick about in code. Mostly applicable to Java, but some are language-neutral.</description><author>The Cranky Developer on Crater Moon Development</author><pubDate>Wed, 03 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://cmdev.com/blog/2015-06-03-codingpetpeeves/</guid></item><item><title>Come In By Robert Frost</title><link>https://ho.dges.online/words/commonplace/come-in-by-robert-frost/</link><description>&lt;p&gt;As I came to the edge of the woods,&lt;br /&gt;
Thrush music &amp;ndash; hark!&lt;br /&gt;
Now if it was dusk outside,&lt;br /&gt;
Inside it was dark.&lt;/p&gt;
&lt;p&gt;Too dark in the woods for a bird&lt;br /&gt;
By sleight of wing&lt;br /&gt;
To better its perch for the night,&lt;br /&gt;
Though it still could sing.&lt;/p&gt;
&lt;p&gt;The last of the light of the sun&lt;br /&gt;
That had died in the west&lt;br /&gt;
Still lived for one song more&lt;br /&gt;
In a thrush&amp;rsquo;s breast.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Wed, 03 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/come-in-by-robert-frost/</guid></item><item><title>Numberphilia</title><link>https://donatstudios.com/Numberphilia</link><description>&lt;p&gt;There's been a fair deal of hubbub in the community about version numbers, including what is and isn't &lt;a href="https://semver.org/"&gt;Semantic Versioning&lt;/a&gt;, what qualifies as a breaking change and how to use version numbers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Underscore.js&lt;/strong&gt; released a second digit &amp;quot;minor update&amp;quot; that was actually a &lt;a href="https://github.com/jashkenas/underscore/issues/1805"&gt;breaking update&lt;/a&gt; for some people. They argue it was &lt;em&gt;minor&lt;/em&gt; because not very many people would be affected. The community however was angry.&lt;/p&gt;
&lt;p&gt;On the opposite side of things, &lt;strong&gt;PHP&lt;/strong&gt; Internals announced they will be &lt;a href="https://wiki.php.net/rfc/php6"&gt;skipping version 6&lt;/a&gt; and numbering the next version of &lt;strong&gt;PHP 7&lt;/strong&gt; to avoid confusion with the never released UTF-16 native version. Again the community was angry.&lt;/p&gt;
&lt;h2&gt;Using Version Numbers Well&lt;/h2&gt;
&lt;p&gt;If you are &lt;em&gt;semantically&lt;/em&gt; versioning your library, the version represents a &lt;strong&gt;contract of trust&lt;/strong&gt; between you and your developers regarding the public API. The contract declares that nothing you change in a 'less than major' release should break their code. Ever.&lt;/p&gt;
&lt;p&gt;Break the contract, you can end up breaking their trust. Break their trust and they'll look elsewhere.&lt;/p&gt;
&lt;h3&gt;Version Numbers &lt;strong&gt;SHOULD NEVER&lt;/strong&gt; Be Branding&lt;/h3&gt;
&lt;p&gt;If you're using your version numbers as &lt;strong&gt;branding&lt;/strong&gt;, you are &lt;em&gt;doing it wrong&lt;/em&gt;. Version numbers should show a clear history of the public facing interface, not what you sell or advertise it as.&lt;/p&gt;
&lt;p&gt;Microsoft of all people &lt;a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832.aspx"&gt;understands this&lt;/a&gt;.  While their version numbers aren't truly semantic, they are aimed at developers - and &lt;strong&gt;highly&lt;/strong&gt; out of sync with the marketing designation because the version numbers denote a true relationship.&lt;/p&gt;
&lt;p&gt;You can have both a release number and a sales version. This is the way to go if sales demands control of the version number, such as where I work.&lt;/p&gt;
&lt;h3&gt;Increment Early, Increment Often&lt;/h3&gt;
&lt;p&gt;Breaking changes &lt;strong&gt;always&lt;/strong&gt; need to be a first digit release. &lt;strong&gt;Always&lt;/strong&gt;.  It doesn't matter if it's not a common use case. It shouldn't matter if you're saving the number for a &lt;em&gt;&amp;quot;woo big new release&amp;quot;&lt;/em&gt; version. A breaking change in a minor release violates trust and brings the quality of your software into question.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WHENEVER&lt;/strong&gt; a behavior or signature of &lt;strong&gt;ANY&lt;/strong&gt; &lt;em&gt;explicitly public member&lt;/em&gt; of your API has changed whereas the previous behavior was &lt;strong&gt;anything&lt;/strong&gt; other than bold face wrong it is a first digit release. &lt;/p&gt;
&lt;h2&gt;Numbers are Cheap&lt;/h2&gt;
&lt;p&gt;Numbers are cheap. Numbers are infinite. &lt;strong&gt;Never&lt;/strong&gt; reuse numbers, ever.  There is no reason.&lt;/p&gt;
&lt;p&gt;PHP in my strong opinion did the &lt;strong&gt;right thing&lt;/strong&gt; by skipping 6. They sidestepped ANY potential confusion, minor as it may have been. The argument that they caused confusion about &amp;quot;Where did 6 go&amp;quot; is childish. People will be investing time in the largest digit release, regardless of gaps. No one (save some overly cautious IT people) is going to be using PHP 5.6 and on seeing 7 released think &amp;quot;I'll upgrade to 6&amp;quot;.&lt;/p&gt;
&lt;p&gt;Trying to not have gaps in your version numbers makes as much sense as if Git were to use ordered numbers instead of hashes. &lt;/p&gt;
&lt;p&gt;Version numbers should be a &lt;strong&gt;universally unique identifier&lt;/strong&gt; for a specific set of code. If there is ever any form of contention over what a version number represents, increment. Don't think about it - just do it.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Always avoid confusion; don't ever be afraid to increment your major release number. Only good things can come from it.&lt;/p&gt;
&lt;p&gt;Trust is maintained.&lt;/p&gt;</description><author>Donat Studios</author><pubDate>Tue, 02 Jun 2015 06:13:00 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/Numberphilia</guid></item><item><title>Using msmtp to handle mail delivery</title><link>https://blog.erethon.com/blog/2015/06/02/using-msmtp-to-handle-mail-delivery/</link><description>&lt;p&gt;
Following the example of &lt;a href="http://greg.kh.usesthis.com/"&gt;GKH&lt;/a&gt; and others, I've added one more piece of
software on &lt;a href="http://blog.erethon.com/blog/2015/02/27/my-mail-setup-using-mutt-slash-offlineimap-slash-imapfilters/"&gt;my email setup and workflow&lt;/a&gt;. That piece is &lt;a href="http://msmtp.sourceforge.net/"&gt;msmtp&lt;/a&gt;, a very
simple and lightweight SMTP client, that integrates really well with
the rest of my setup.&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Tue, 02 Jun 2015 03:53:22 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2015/06/02/using-msmtp-to-handle-mail-delivery/</guid></item><item><title>Xcode bookmarks</title><link>https://xenodium.com/xcode-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/ios-os-x-development/a-better-way-to-automatically-merge-changes-in-your-xcode-project-files-3d83b3583fe4#.hz33egjv1"&gt;A Better Way to Automatically Merge Changes in Your XCode Project Files&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&amp;amp;qid=1444472656&amp;amp;sr=8-1&amp;amp;keywords=Clean+Code%3A+A+Handbook+of+Agile+Software+Craftsmanship"&gt;Clean Code: A Handbook of Agile Software Craftsmanship (Book)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/passei-direto-product-and-technology/from-xcode-to-testflight-using-command-line-288c3a85bd93"&gt;From Xcode to TestFlight using command line&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/FuzzyAutocomplete/FuzzyAutocompletePlugin/blob/master/README.md"&gt;Fuzzy autocomplete for Xcode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kolinkrewinkel/Multiplex"&gt;Multiplex (like Emacs multiple cursor but for Xcode)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://chen.do/blog/2013/10/22/reverse-engineering-xcode-with-dtrace/"&gt;Reverse-engineering Xcode with dtrace&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/xcode-bookmarks</guid></item><item><title>Costa Rica travel bookmarks</title><link>https://xenodium.com/costa-rica-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/planetepics/status/603851463509540864/photo/1"&gt;Catarata del Toro&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-are-the-best-travel-hacks-when-traveling-to-Costa-Rica"&gt;What are the best travel hacks when traveling to Costa Rica? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/costa-rica-travel-bookmarks</guid></item><item><title>Australia travel bookmarks</title><link>https://xenodium.com/australia-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/australia/sydney/travel-tips-and-articles/australias-best-food-experiences-state-by-state"&gt;Australia's best food experiences: state by state&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/travel-tips-and-articles/best-queensland-island-escapes-for-small-budgets"&gt;Best Queensland island escapes for small budgets&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://myproducetrail.com.au/directory/215"&gt;Des and Debi O’Tooles Honey&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fish and chips at Bondi beach.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/australia/tasmania/travel-tips-and-articles/tasmania-the-formidable-isle-thats-wild-at-heart"&gt;Tasmania: the isle that's wild at heart&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The Butler Potts Point (bar &amp;amp; restaurant).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tripadvisor.com/Attraction_Review-g488368-d2415480-Reviews-Tree_Top_Walk-Walpole_Western_Australia.html"&gt;Tree Top Walk (Walpole, Australia): Top Tips Before You Go - TripAdvisor&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/australia-travel-bookmarks</guid></item><item><title>Samoa travel bookmarks</title><link>https://xenodium.com/samoa-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.samoa.travel/activity/to-sua-ocean-trench"&gt;To Sua ocean trench&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/samoa-travel-bookmarks</guid></item><item><title>Norway travel bookmarks</title><link>https://xenodium.com/norway-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/archpics/status/613586879645155328/photo/1"&gt;Atlantic Road&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Bergen (check out colorful wooden houses).&lt;/li&gt;
&lt;li&gt;Bergen railway (Bergen-Oslo): 300 miles of beautiful Norwegian scenery.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lofoten-info.no/"&gt;Lofoten Islands&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Norwegian Air (cheap flights between all the&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=olden+norway&amp;amp;t=ffab&amp;amp;iax=1&amp;amp;ia=images"&gt;Olden&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Reine"&gt;Reine&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pinterest.com/pin/377950593706704729/?utm_campaign%3Drecs_150817&amp;amp;utm_term%3D1&amp;amp;utm_content%3D377950593706704729&amp;amp;e_t%3Dbce987c654c54dfa8733bc2f9df20080&amp;amp;utm_source%3D31&amp;amp;e_t_s%3Dpins&amp;amp;utm_medium%3D2004"&gt;Sakrisøy, Lofoten Islands&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=Spitsbergen&amp;amp;t=ffsb&amp;amp;iax=1&amp;amp;ia=images"&gt;Spitsbergen&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.theatlanticroad.com/"&gt;The Atlantic Road - Atlanterhavsveien / Atlanterhavsvegen&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/norway-travel-bookmarks</guid></item><item><title>Los Angeles travel bookmarks</title><link>https://xenodium.com/los-angeles-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.beerbellyla.com/"&gt;Beer Belly (Craft Beer + Crafty Food)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bluestardonuts.com/"&gt;Blue Star Donuts (SF + LA)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 02 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/los-angeles-travel-bookmarks</guid></item><item><title>Rails: Writing Engine Tests That Depend on Main Application Models</title><link>https://kyrofa.com/posts/rails-writing-engine-tests-that-depend-on-main-application-models/</link><description>When developing a new Ruby on Rails project, one doesn&amp;rsquo;t always start from scratch. Often one first searches for an open-source project that will at least get one part of the way there. For example, one might want to do something as simple a create a website with a blog as well as image galleries. The first step in this journey might be to find some open-source blog software for Rails, e.</description><author>kyrofa's blog</author><pubDate>Tue, 02 Jun 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/rails-writing-engine-tests-that-depend-on-main-application-models/</guid></item><item><title>The right tool for the job: Choosing where to use RSVP-TE or SR.</title><link>https://rob.sh/post/212/</link><description>&lt;p&gt;I noted that at &lt;a href="http://nanog.org/meetings/nanog64/agenda"&gt;NANOG64&lt;/a&gt; this week in San Francisco, there are talks (both from Juniper) about both SPRING/Segment Routing and RSVP-TE. These are both protocols/technology approaches (since one can&amp;rsquo;t really call SR a protocol) that I&amp;rsquo;ve been involved in the evolution of over the last few years. A question that I&amp;rsquo;ve been asked more times than I&amp;rsquo;d like is why we chose to look at a new approach (SR) rather than go with a technology that exists RSVP-TE.&lt;/p&gt;</description><author>rob.sh</author><pubDate>Tue, 02 Jun 2015 01:45:00 GMT</pubDate><guid isPermaLink="true">https://rob.sh/post/212/</guid></item><item><title>Some Thoughts on Giving a Good Talk About Your Research</title><link>https://bastian.rieck.me/blog/2015/giving_a_talk/</link><description>&lt;p&gt;I just had the privilege of watching lots of great talks at &lt;a href="http://www.eurovis2015.it"&gt;the EuroVis
2015&lt;/a&gt; conference. Since giving a talk about
your research is a common occurrence, even for undergraduate students, I
thought it worthwhile to think a little bit about what makes a talk
truly great.&lt;/p&gt;
&lt;p&gt;It goes without saying these are my personal opinions. They reflect the
ways in which I perceive a talk. Still, here are some rules that good
talks tend to adhere to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Preparing a good talk takes time&lt;/em&gt;. You should figure that into your
calculations. To prepare a good talk, several iterations are probably
required. Test it on your friends, your colleagues, your family, and so
on.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Avoid last-minute changes&lt;/em&gt;. Been there, done that. Try to avoid it
unless your colleagues or supervisor have some specific criticisms about
your slides that can be fixed. Do not do it on your own.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Know your audience&lt;/em&gt;. Your audience determines the level of
specificity your talk should have. An all-expert audience can take more
technical details than a more general audience. If in doubt, follow the
&lt;em&gt;rule of thirds&lt;/em&gt;: Prepare one third of your talk for the experts, one
third for your peers, and one third for the general listener.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Avoid death-by-detail&lt;/em&gt;. This is somewhat interlinked with the
previous rule. A good research talk should show the interesting
challenges in your research. It should make people want to read your
thesis, your paper, or discuss stuff with you. The quickest way to lose
an audience is to bog them down with too many details. When in doubt,
always opt for the &lt;em&gt;bird&amp;rsquo;s eye view&lt;/em&gt;. Technical details can always be
read in the paper or discussed face-to-face. Of course, you should
outline the challenges you had to face and the obstacles your research
overcame. If this involves some details, so be it. Just make sure that
people who have &lt;em&gt;not&lt;/em&gt; (yet) read your paper will follow you.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Know the format of your talk and know what it should accomplish&lt;/em&gt;. Lest you think that I advocate a
marketing presentation in the previous rule, rest assured. If you have one hour of
speaking time to convince a funding committee that your work is great or
your advisers to give you the coveted degree, it is probably a good idea
to include as many details as possible. At a conference, however, you
have to convince people to read your paper. These two goals have a very
different nature and need to be tackled differently.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Whenever possible, give the audience time to breathe again&lt;/em&gt;. So you
just waltzed through a very difficult mathematical technique? Add a
slide in which you explain &lt;em&gt;why&lt;/em&gt; this was done. Give the audience a
chance to catch their breath. Remind them of the overall goal you want
to accomplish, for example showing that a certain algorithm scales to
larger data sets. This gives the audience the possibility to nod their
heads in agreement and see your motivation, even if they did not
understand everything perfectly.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Consistency&lt;/em&gt;. Try to be as consistent as possible, with respect to
colours, names, and even the layout of your slides. Is it possible to
refer to your method as either &lt;em&gt;foo&lt;/em&gt; or &lt;em&gt;bar&lt;/em&gt;? Pick only one. Are there
two possibilities A and B for solving something? Show things pertaining
to A always in the same colour. Use a different colour for B.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Add visual metaphors&lt;/em&gt;. Does your method work like a cheese grater?
Or like a meat grinder? Use these metaphors to get members of the
audience to understand what you are talking about. However, do not
attempt to force a metaphor if there is none. I would rather have you
talk about the differential structure of non-Euclidean manifolds than
try to convince me that they &amp;ldquo;work exactly like a trash can&amp;hellip;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Make a test-run of your presentation&lt;/em&gt;. Bring all your adapters. Make
yourself familiar with how to connect your notebook to the projector.
Check that your operating system is using the proper resolution, and so
on. There is nothing worse than being nervous and having to fiddle for
what feels like an eternity with different cables, settings, and so on.
If your talk is virtual, familiarise yourself with the conferencing
software.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Speak freely&lt;/em&gt;. If you are very inexperienced with giving a talk,
reading off a fully-formulated talk might put you at ease. It is however
also possible that you stumble over one sentence and are completely
thrown off course. I saw this happen multiple times and it is very hard
to recover from this. I&amp;rsquo;d rather have a presenter speaking freely and
sounding &lt;em&gt;authentic&lt;/em&gt; than a completely-polished talk that is only
read-off.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These are some of the rules I would like to impart on people who have to
give a talk. Finally, the most important rule of all: &lt;strong&gt;Have fun and do
not forget that other people are nervous as well&lt;/strong&gt;. The final rule does
not get a number because 10 rules are much better than 11.&lt;/p&gt;
&lt;p&gt;Enjoy your talks, be it as a speaker or an audien
ce member.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 31 May 2015 18:42:17 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/giving_a_talk/</guid></item><item><title>Simple fractals with Qt 5 shaders</title><link>https://bastian.rieck.me/blog/2015/simple_fractals_shader/</link><description>&lt;p&gt;I wanted to play around with some shaders recently so I was looking for
simple things to implement. One of the nicest ways to get started in a
new graphics framework is to get some fractals going—so this is
what I did.&lt;/p&gt;
&lt;h1 id="the-mandelbrot-shader"&gt;The Mandelbrot shader&lt;/h1&gt;
&lt;p&gt;We first require some GLSL magic to make the Mandelbrot fractal happen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;uniform&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;uniform&lt;/span&gt; &lt;span class="n"&gt;highp&lt;/span&gt; &lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;centre&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;uniform&lt;/span&gt; &lt;span class="n"&gt;highp&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;varying&lt;/span&gt; &lt;span class="n"&gt;highp&lt;/span&gt; &lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;texture_out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;texture_out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;centre&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;texture_out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;centre&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;vec4&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vec4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;6.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;12.0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;3.141&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;gl_FragColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Basically, I am filling the texture coordinates with colours, based on
the number of iterations it took for the series to reach the desired
norm of 4.0. The &lt;code&gt;scale&lt;/code&gt; and &lt;code&gt;centre&lt;/code&gt; parameter exist only for the
purpose of modifying the view within the controlling application.&lt;/p&gt;
&lt;h1 id="the-julia-set-shader"&gt;The Julia set shader&lt;/h1&gt;
&lt;p&gt;Now let&amp;rsquo;s add another shader for the Julia set:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;uniform&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;uniform&lt;/span&gt; &lt;span class="n"&gt;highp&lt;/span&gt; &lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;uniform&lt;/span&gt; &lt;span class="n"&gt;highp&lt;/span&gt; &lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;centre&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;uniform&lt;/span&gt; &lt;span class="n"&gt;highp&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;varying&lt;/span&gt; &lt;span class="n"&gt;highp&lt;/span&gt; &lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;texture_out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;texture_out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;centre&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;texture_out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;centre&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;vec4&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vec4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;iterations&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;6.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;12.0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;3.141&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;gl_FragColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note that the differences between the shaders are minuscule at best.&lt;/p&gt;
&lt;h1 id="using-qt-5-to-put-it-together"&gt;Using Qt 5 to put it together&lt;/h1&gt;
&lt;p&gt;Putting the fractals on the screen then turned out to be a rather easy
exercise with Qt 5. Using a &lt;code&gt;QGLShaderProgram&lt;/code&gt;, I only need to render a
quad onto the screen, bind the appropriate shader, and we are done.
Check out the &lt;a href="https://github.com/Pseudomanifold/QtFractals"&gt;code on
GitHub&lt;/a&gt; for more details.&lt;/p&gt;
&lt;h1 id="screenshots"&gt;Screenshots&lt;/h1&gt;
&lt;p&gt;Click to see the screenshots in their original resolution.&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://bastian.rieck.me/images/qtfractals_mandelbrot_1.png"&gt;&lt;img alt="Mandelbrot fractal" src="https://bastian.rieck.me/images/qtfractals_mandelbrot_1.png" width="400" /&gt;&lt;/a&gt;&lt;figcaption&gt;
			&lt;p&gt;The Mandelbrot fractal in all its glory. Such colours, such self-similarity. Wow!&lt;/p&gt;
		&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://bastian.rieck.me/images/qtfractals_mandelbrot_2.png"&gt;&lt;img alt="Mandelbrot fractal, zoomed in" src="https://bastian.rieck.me/images/qtfractals_mandelbrot_2.png" width="400" /&gt;&lt;/a&gt;&lt;figcaption&gt;
			&lt;p&gt;A zoomed-in portion of the Mandelbrot fractal. Still nice, I guess.&lt;/p&gt;
		&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;a href="https://bastian.rieck.me/images/qtfractals_julia.png"&gt;&lt;img alt="Julia set" src="https://bastian.rieck.me/images/qtfractals_julia.png" width="400" /&gt;&lt;/a&gt;&lt;figcaption&gt;
			&lt;p&gt;A particular view on the Julia set.&lt;/p&gt;
		&lt;/figcaption&gt;
&lt;/figure&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 31 May 2015 18:04:52 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/simple_fractals_shader/</guid></item><item><title>Why Other Mapping Platforms Don't Cut It Anymore</title><link>https://www.unsungnovelty.org/posts/05/2015/why-other-mapping-platforms-dont-cut-it-anymore/</link><description>&lt;p&gt;&lt;em&gt;Note: This post was written in 2015. The writing quality is not that great and I won&amp;rsquo;t try to improve it as well. This was republished from another platform for pure historic value of being my first blog post ever. My opinions and thoughts on the topics shared in this post might have changed.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="a-recap-on-the-discovery-of-openstreetmap-and-the-two-days-in-mapbox"&gt;A Recap on the discovery of Openstreetmap and the two days in Mapbox.&lt;/h2&gt;
&lt;p&gt;Maps were something that I was really good at! Or something I didn’t know much about until I bumped into Openstreetmap (OSM). I thought I was an expert in maps as I was using Google maps application. Keep it updated to the latest version, and i was doing only that. Come on.. I was working in Bangalore - A place I knew nothing about initially. I traveled less but when I did, I was using Google maps to tell me how to go to places. I didn’t know from where these guys where getting the data about everything. I mean, who cares right? I just wanted to go to those places. I let Google do all the work for me, And I was fine with it too! That’s when I got to know about Openstreetmap - which is an open source project.&lt;/p&gt;
&lt;figure&gt;&lt;img alt="Logo of OpenStreetMap" src="https://www.unsungnovelty.org/images/post-images/why-other-mapping-platforms-dont-cut-it-anymore/osm.jpg" /&gt;
&lt;/figure&gt;

&lt;p&gt;Openstreetmap - It was nothing like the other open source projects. You contribute map data instead of the codes (Most of the part I guess). Wait&amp;hellip; what? Map data? How do I get it? From where do I get it? Should I be copying from Google Maps&amp;hellip;? I had no idea! My mind was full of questions. As days passed, I was learning a lot about maps. Got to know a lot on what kind of data will be uploaded to openstreetmap, and the details that completes a map. I didn&amp;rsquo;t do much after that though. It was just another awesome project that I bumped into like many other.&lt;/p&gt;
&lt;figure&gt;&lt;img alt="Logo of Mapbox" src="https://www.unsungnovelty.org/images/post-images/why-other-mapping-platforms-dont-cut-it-anymore/mapbox.png" /&gt;
&lt;/figure&gt;

&lt;p&gt;I applied for the job, got acknowledged by Sajjad. We talked a lot about what they were working on in Mapbox. That’s when i got to know about the connection of Mapbox and Openstreetmap. I wanted to know more about Openstreetmap!&lt;/p&gt;
&lt;p&gt;Luckily my friend who had a good knowledge on OSM helped me out with it. And in the process I got to know about JOSM (A cross-platform editor for openstreetmap written in Java), the most used tool by OSM contributors!&lt;/p&gt;
&lt;p&gt;As planned earlier, I had the call with Sajjad where we talked about what my goals and passions were and reason for applying this job. I liked where the discussion was heading and how the company and I shared the same interests (Open source!!). After that I started mapping in a pretty small way&amp;hellip;. Started using OSM tracker for Android - which is an app on Google play store to track the GPS co-ordinates of your journey using your smartphone GPS. Went to some of the places in my village and got the raw data as .gpx files. Started adding the data and uploaded the same to the Openstreetmap.org. My first meaningful contribution to an open source project!&lt;/p&gt;
&lt;p&gt;Discussions were going on in mails and I was contacted by Arun from Mapbox and he gave me a much needed idea on what my role will be if i were to work full time on Mapbox. I learned a lot through the discussions and Arun was always there to help me with the answers for my queries. That was when Earthquake happened in Nepal and later in some parts of India. That is also the time when I knew the value of crowd sourcing and power of the Openstreetmap community. They updated the areas affected by earthquakes in two weeks or so. I was amazed by the sheer power Openstreetmap community. The changes made by them was significant compared to before and after the disastrous earthquake. This was amazing according to me because I have never seen anything like that till then. I was busy with my work that I have in Tech Mahindra (TechM) at this time. And because of this, I couldn’t be a contributor among the thousands who helped update the maps in Nepal post earthquake. Later I started working on Agra road network and completed a task and uploaded the same to OSM. It was a wonderful feeling and experience.&lt;/p&gt;
&lt;p&gt;Conversations were happening with me and Arun through mails quite often and I was getting closer and closer to OSM and Mapbox. It was at this time a call was arranged with Alex Barth who leads the data team in Mapbox. We had a discussion about what I did in TechM (the company that I work in currently), and how the clients of Mapbox uses the maps. Everything was interesting and I got to know much more about the company. After some days, I was called to Mapbox office for two days sprint.&lt;/p&gt;
&lt;h2 id="the-meetup"&gt;The meetup&lt;/h2&gt;
&lt;h3 id="day-1"&gt;Day-1&lt;/h3&gt;
&lt;p&gt;It was only 30mins travel from my room in Bangalore, so that was not a big issue for me. Reached Mapbox office at 8.35am or so. Nobody except Shravan was in the office. Met him and was on to work right away. We started tracing out buildings in Gangtok and after a while came Arun. Finally got to meet him. After everyone was in the office, we started to plan to go out for surveying parts of Indiranagar. For this we used Fieldpapers which is a website that helps us with Hand-drawn graphic to represent making a Field Papers atlas. It&amp;rsquo;s like, we will be taking the print out of an area, taking the survey and mark the changes in the paper. After the changes are marked, we can scan the sheet and upload the picture file to &lt;a href="https://www.fieldpapers.org"&gt;https://www.fieldpapers.org&lt;/a&gt; and get it aligned properly with OSM maps in JOSM. The area to be covered was split into two namely A1 and A2. A1 containing 4 people and A2 containing the other 4 people. That was further split into two. Two for covering the Point of Interests (POI&amp;rsquo;s) and two people covering the trees and levels of the buildings. This is easier said than done. We had to go to each streets and crosses in the area to get all of this data and Me and Ruth from Mapbox was one team. Our job was to get the Point of Interests (POI&amp;rsquo;s) of the areas in A2.&lt;/p&gt;
&lt;figure&gt;&lt;img alt="Image of the field paper survey which collected all the data from around Indiranagar." src="https://www.unsungnovelty.org/images/post-images/why-other-mapping-platforms-dont-cut-it-anymore/field-paper.jpg" /&gt;
&lt;/figure&gt;

&lt;p&gt;After the data was collected, which was a tiresome walk in the sun but fun at the same time we came back to the office so that we can start uploading the changes to OSM. As the fieldpapers.org aligning mechanism was not working as it&amp;rsquo;s suppose to be, we had this fun time learning to do the same in JOSM manually. Once the page was aligned exactly on top the OSM maps, we started uploading the changes to OSM. After a long period of continuous effort we all were able to upload the changes to OSM which had the names of all the shops and levels of the buildings and the trees that was there in the area. Yes.. trees!!! We had an awesome time after the work with the team talking and playing Jenga. Sajjad was playing this awesome song through his phone which i got to know was || Kygo – Firestone || which became one of my favorite song soon after.&lt;/p&gt;
&lt;h3 id="day-2"&gt;Day-2&lt;/h3&gt;
&lt;p&gt;The second day started with Arun teaching what all is that we do in Mapbox as a Data analyst (which is the designation that I applied for). Learned a lot about how to manage the different kind of issues that come in daily. After that, Arun was showing the map that he have created about the Lakes in the south Bangalore with the help of OSM data. I was surprised and amazed to know that all the lakes were inter-connected! All the data that was in the maps was showing how the Bellandur lake was the meeting point where all the polluted and dirty water was flowing in. This partially explained why the lake is so polluted and how the fire emerged from the lake and the reason for the foam that was seen above the lake water like a layer. Everything proving the real power of crowd sourcing and opens source once again. After learning how to handle various types of issue that we may face on a daily basis, I knew it was time to call it a day. The two days went just like that with lots of fun and lots of new things learned. Thanks to Mapbox, I learned a lot on how you can trust to use an open source project as a base layer upon which a business can be made with the help of crowd sourcing and open source community it will offer.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Have thoughts or feedback regarding my post/writing? DM me on Twitter &lt;a href="https://twitter.com/unsungNovelty"&gt;@unsungNovelty&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description><author>unsungNovelty</author><pubDate>Sun, 31 May 2015 09:34:34 GMT</pubDate><guid isPermaLink="true">https://www.unsungnovelty.org/posts/05/2015/why-other-mapping-platforms-dont-cut-it-anymore/</guid></item><item><title>How to find a commit that introduced a specific change with Git Bisect</title><link>https://stribny.name/posts/how-to-find-a-commit-that-introduced-a-specific-change-with-git-bisect/</link><author>Posts by Petr Stribny</author><pubDate>Sat, 30 May 2015 15:27:16 GMT</pubDate><guid isPermaLink="true">https://stribny.name/posts/how-to-find-a-commit-that-introduced-a-specific-change-with-git-bisect/</guid></item><item><title>Complex Room Renders</title><link>https://blog.yiningkarlli.com/2015/05/complex-room-renders.html</link><description>&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/May/room_angle1.png"&gt;&lt;img alt="Rendered in Takua a0.5 using VCM. Model credits in the post below." src="https://blog.yiningkarlli.com/content/images/2015/May/preview/room_angle1.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I realize I have not posted in some weeks now, which means I still haven’t gotten around to writing up Takua a0.5’s architecture and VCM integrator. I’m hoping to get to that once I’m finished with my thesis work. In the meantime, here are some more pretty pictures rendered using Takua a0.5.&lt;/p&gt;

&lt;p&gt;A few months back, I made a high-complexity scene designed to test Takua a0.5’s capability for handling “real-world” workloads. The scene was also designed to have an extremely difficult illumination setup. The scene is an indoor room that is lit primarily from outside through glass windows. Yes, the windows are actually modeled as geometry with a glass BSDF! This means everything seen in these renders is being lit primarily through caustics! Of course, no real production scene would be set up in this manner, but I chose this difficult setup specifically to test the VCM integrator. There is a secondary source of light from a metal cylindrical lamp, but this light source is also difficult since the actual light is emitted from a sphere light inside of a reflective metal cylinder that blocks primary visibility from most angles.&lt;/p&gt;

&lt;p&gt;The flowers and glass vase are the same ones from my earlier &lt;a href="http://blog.yiningkarlli.com/2015/02/flower-vase-render.html"&gt;Flower Vase Renders post&lt;/a&gt;. The original flowers and vase are by &lt;a href="https://www.behance.net/andi_mix"&gt;Andrei Mikhalenko&lt;/a&gt;, with custom textures of my own. The amazing, colorful Takua poster on the back wall is by my good friend &lt;a href="http://alice-yang.tumblr.com/"&gt;Alice Yang&lt;/a&gt;. The two main furniture pieces are by &lt;a href="http://odesd2.com.ua/ru"&gt;ODESD2&lt;/a&gt;, and the Braun SK4 record player model is by one of my favorite archviz artists, &lt;a href="http://bertrand-benoit.com/"&gt;Bertrand Benoit&lt;/a&gt;. The teapot is, of course, the famous Utah teapot. All textures, shading, and other models are my own.&lt;/p&gt;

&lt;p&gt;As usual, all depth of field is completely in-camera and in-renderer. Also, all BSDFs in this scene are fairly complex; there is not a single simple diffuse surface anywhere in the scene! Instancing is used very heavily; the wicker baskets, notebooks, textbooks, chess pieces, teacups, and tea dishes are all instanced from single pieces of geometry. The floorboards are individually modeled but not instanced, since they all vary in length and slightly in width.&lt;/p&gt;

&lt;p&gt;A few more pretty renders, all rendered in Takua a0.5 using VCM:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/May/room_angle4.png"&gt;&lt;img alt="Closeup of Braun SK4 record player with DOF. Rendered using VCM." src="https://blog.yiningkarlli.com/content/images/2015/May/preview/room_angle4.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/May/room_angle6.png"&gt;&lt;img alt="Flower vase and tea set. Rendered using VCM" src="https://blog.yiningkarlli.com/content/images/2015/May/preview/room_angle6.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/May/room_angle7.png"&gt;&lt;img alt="Floorboards, textbooks, and rough metal bin with DOF. The book covers are entirely made up. Rendered using VCM." src="https://blog.yiningkarlli.com/content/images/2015/May/preview/room_angle7.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Sat, 30 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2015/05/complex-room-renders.html</guid></item><item><title>"Leaving out the best bit" project management anti-pattern</title><link>https://www.databasesandlife.com/leaving-out-the-best-bit-anti-pattern/</link><description>&lt;p&gt;When I was at university in the 90s, studying computer science, my final-year bachelor project was a &amp;ldquo;fractal raytracer&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;My idea was to write a program which could produce pictures of those wonderful artificial worlds one saw on posters of the time, hung in every university dorm room. Raytracers render highly realistic images, and fractals produce interesting shapes to render.&lt;/p&gt;
&lt;p&gt;I set about designing the program, with all the features I wanted. In the object-oriented language of the day (Objective-C) I envisaged a Shape class with various subclasses to represent the various objects the program should be able to render: spheres, fractal landscapes, etc. The fractal landscapes would be further subdivided into those more random mountainous landscapes and, the crowning glory, a 3-dimensional landscape based on those particularly recognizable fractal shapes such as &lt;a href="http://upload.wikimedia.org/wikipedia/commons/2/21/Mandel_zoom_00_mandelbrot_set.jpg" rel="noopener noreferrer" target="_blank"&gt;the Mandelbrot&lt;/a&gt;.&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Sat, 30 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/leaving-out-the-best-bit-anti-pattern/</guid></item><item><title>Blade Runner</title><link>https://olshansky.info/movie/blade_runner/</link><description>Olshansky's review of Blade Runner</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 29 May 2015 06:00:22 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/blade_runner/</guid></item><item><title>You Don't Need jQuery!</title><link>http://blog.garstasio.com/you-dont-need-jquery</link><description>A seven-part series that will help free you from the chains of jQuery by showing you how to embrace and understand the modern web API and JavaScript.</description><author>Train of Thought</author><pubDate>Fri, 29 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">http://blog.garstasio.com/you-dont-need-jquery</guid></item><item><title>Mastering Emacs is out</title><link>https://xenodium.com/mastering-emacs-is-out</link><description>&lt;p&gt;Emacs is amazingly alive. New packages are regularly listed on &lt;a href="http://melpa.org"&gt;melpa&lt;/a&gt; and a new book just came out: &lt;a href="https://www.masteringemacs.org/book"&gt;Mastering Emacs&lt;/a&gt; by &lt;a href="https://twitter.com/mickeynp"&gt;Mickey Petersen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.masteringemacs.org/book"&gt;&lt;img alt="" src="https://xenodium.github.io/images/mastering-emacs-is-out/cover.png" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 28 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/mastering-emacs-is-out</guid></item><item><title>Important Factors To Evolution</title><link>https://venam.net/blog/psychology/2015/05/28/evolution-factors.html</link><description>Hello fellow readers,  The last two months I've been extremely interested in evolutionary programming and group dynamics. In this post I'll try to gather some important factors I've noticed repeating themselves across the multiple opinions and examples, and the ones that just seemed noticeably important.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Thu, 28 May 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/psychology/2015/05/28/evolution-factors.html</guid></item><item><title>12-Factor Apps in node</title><link>https://peterlyons.com/problog/2015/05/12-factor-apps-in-node/</link><description>&lt;p&gt;Here's my talk for the &lt;a href="http://www.meetup.com/Node-js-Denver-Boulder/"&gt;node.js Boulder meetup group&lt;/a&gt; about 12-Factor apps in node.js. &lt;a href="https://peterlyons.com/twelve_factor_nodejs"&gt;Slides are here&lt;/a&gt;&lt;/p&gt;
&lt;div class="youtube-video-container"&gt;

&lt;/div&gt;</description><author>Pete's Points</author><pubDate>Wed, 27 May 2015 17:33:52 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2015/05/12-factor-apps-in-node/</guid></item><item><title>Items</title><link>https://liza.io/items/</link><description>&lt;p&gt;After finishing yesterday&amp;rsquo;s post about generating images for user-combined substrate items I realized that I never really provided an explanation about how items work in general (or how they work for now, anyway).&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Wed, 27 May 2015 14:58:05 GMT</pubDate><guid isPermaLink="true">https://liza.io/items/</guid></item><item><title>Escaping Daddy</title><link>https://apurva-shukla.me/bookshelf/escaping-daddy/</link><description>⭐ ⭐ ⭐ 3.5/5

As a reader I scoffed at moments that Maria made decisions that were obviously for the detriment of herself, but having realised…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Wed, 27 May 2015 11:06:22 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/escaping-daddy/</guid></item><item><title>Buck - life is too short to spend a minute for each build</title><link>https://zserge.com/posts/buck-build-system/</link><description>Gradle is too slow, Ant is too basic. Buck is fast and super-configurable and I&amp;rsquo;d like to tell you how I use it for Android development.
I own a pretty old thinkpad laptop so I don&amp;rsquo;t expect the builds to be too fast. Ant used to spend 10..40 seconds for each build on my laptop depending on how large the project is. Gradle takes about a minute in average and that&amp;rsquo;s too long for me - I just lose focus when I just sit and wait for the build results.</description><author>zserge's blog</author><pubDate>Wed, 27 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/buck-build-system/</guid></item><item><title>Images for combined substrate</title><link>https://liza.io/images-for-combined-substrate/</link><description>&lt;p&gt;The Laravel 5 migration is complete and I&amp;rsquo;m back to substrate mixing and brain bug fixing!&lt;/p&gt;
&lt;p&gt;Actually, I think now that basic mixing is done I&amp;rsquo;m going to do a few weeks of just bug fixing. The substrate has no effect on snails&amp;rsquo; attributes or behaviour yet, but it will. For now you can just mix different substrate items together into new substrate items.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Tue, 26 May 2015 23:31:57 GMT</pubDate><guid isPermaLink="true">https://liza.io/images-for-combined-substrate/</guid></item><item><title>Putting Test Case Specification directly in code</title><link>https://stribny.name/posts/putting-all-test-case-specification-directly-in-code/</link><author>Posts by Petr Stribny</author><pubDate>Tue, 26 May 2015 18:16:21 GMT</pubDate><guid isPermaLink="true">https://stribny.name/posts/putting-all-test-case-specification-directly-in-code/</guid></item><item><title>Canadian Real Estate or American Stock?</title><link>https://olshansky.info/posts/2015-05-26-canadian-real-estate-or-american-stock/</link><description>tl;dr Investing in the S&amp;amp;P 500 is more profitable than buying a condo in Toronto with a 25% downpayment and renting it out while still…</description><author>🦉 olshansky 🦁</author><pubDate>Tue, 26 May 2015 11:49:03 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/posts/2015-05-26-canadian-real-estate-or-american-stock/</guid></item><item><title>Composition vs. Inheritance: How to Choose?</title><link>https://nicolaiarocci.com/composition-vs-inheritance-how-to-choose/</link><description>&lt;p&gt;Steven Lowe piece on &lt;a href="http://www.thoughtworks.com/insights/blog/composition-vs-inheritance-how-choose"&gt;Composition vs. Inheritance&lt;/a&gt; is a must read. Just to wet your appetite, let me quote the opening paragraph:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the beginning, there was no inheritance and no composition, only code. And the code was unwieldy, repetitive, blocky, unhappy, verbose, and tired. Copy and Paste were the primary mechanisms of code reuse. Procedures and functions were rare, newfangled gadgets viewed with suspicion. Calling a procedure was expensive! Separating pieces of code from the main logic caused confusion! It was a Dark Time.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 26 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/composition-vs-inheritance-how-to-choose/</guid></item><item><title>Mathematics The Law Of the World</title><link>https://venam.net/blog/programming/2015/05/26/mathematics-are-cool.html</link><description>Hello fellow readers,  This post is about a little adventure I had with maths.  I'm currently reading a book called `clever algorithms`, I go along at my own pace doing researches on hard subjects or things I forgot from high school.  Digging through the cross entropy algorithm I had to take a break and learn more about distribution.  Namely, I wanted to refresh my mind about the normal/Gauss law.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Tue, 26 May 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/programming/2015/05/26/mathematics-are-cool.html</guid></item><item><title>South Carolina travel bookmarks</title><link>https://xenodium.com/south-carolina-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Angel_Oak"&gt;Angel Oak tree&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 25 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/south-carolina-travel-bookmarks</guid></item><item><title>Colorado travel bookmarks</title><link>https://xenodium.com/colorado-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://horseshoebend.com/"&gt;Horseshoe Bend&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 25 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/colorado-travel-bookmarks</guid></item><item><title>Cuzco travel bookmarks</title><link>https://xenodium.com/cuzco-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;Gelatina de patita (mercado)&lt;/li&gt;
&lt;li&gt;Yolanda. Adobo/chicarron. Chicarroneria Yoli.&lt;/li&gt;
&lt;li&gt;Pan de chocolate Oropeza.&lt;/li&gt;
&lt;li&gt;La esquina de los lechones y tamales dulces de Sra Elsa.&lt;/li&gt;
&lt;li&gt;Cafe el Ayllu (lengua de suegra)&lt;/li&gt;
&lt;li&gt;La Chomba (picanteria). Costillar frito. Frutillada. Chicharron. Ubre. Tripa.&lt;/li&gt;
&lt;li&gt;La quinta Eulaia. Asado y chicarron. Rocoto. Humita.&lt;/li&gt;
&lt;li&gt;Chicheria la loba.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 25 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/cuzco-travel-bookmarks</guid></item><item><title>Bash bookmarks</title><link>https://xenodium.com/bash-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/bash_conditional_statement/"&gt;Bash conditional statement (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/bash_echo/"&gt;Bash Echo Examples (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/bash_error_handling/"&gt;Bash Error Handling (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/bash_for_loop/"&gt;Bash for loop examples (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gnu.org/software/bash/manual/bashref.html"&gt;Bash Reference Manual&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11832941"&gt;Common shell script mistakes (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kfirlavi.com/blog/2012/11/14/defensive-bash-programming"&gt;Defensive bash programming&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cyberciti.biz/faq/linux-unix-bash-for-loop-one-line-command/"&gt;HowTo: Use bash For Loop In One Line - nixCraft&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.etalabs.net/sh_tricks.html"&gt;Rich’s sh (POSIX shell) tricks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anordal/shellharden/blob/master/how_to_do_things_safely_in_bash.md"&gt;Safe ways to do things in bash&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/koalaman/shellcheck"&gt;shellcheck: ShellCheck, a static analysis tool for shell scripts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linuxhint.com/string_concatenation_bash/"&gt;String concatenation in bash (Linux Hint)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bash.academy"&gt;The Bash Academy&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 25 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/bash-bookmarks</guid></item><item><title>restclient.el</title><link>https://xenodium.com/restclient.el</link><description>&lt;p&gt;Installed &lt;a href="https://github.com/pashky/restclient.el"&gt;Pashky's&lt;/a&gt; &lt;a href="https://github.com/pashky/restclient.el"&gt;restclient.el&lt;/a&gt; Emacs package. Super helpful when trying out REST APIs.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/restclient.el/restclient.png" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 25 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/restclient.el</guid></item><item><title>Seatle travel bookmarks</title><link>https://xenodium.com/seatle-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/usa/seattle/travel-tips-and-articles/14-free-things-to-do-in-seattle"&gt;14 free things to do in Seattle&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://indichocolate.com/"&gt;Indi chocolate&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lepanier.com/"&gt;Le Panier&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 25 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/seatle-travel-bookmarks</guid></item><item><title>Berlin travel bookmarks</title><link>https://xenodium.com/berlin-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.topinspired.com/top-10-things-to-do-in-berlin/"&gt;10 things to do in Berlin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.angloitalianfollowus.com/berlin-on-a-budget"&gt;Berlin On A Budget: Our Slow Travel Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/travel-tips-and-articles/69756"&gt;Perfect day in Berlin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/germany/berlin/travel-tips-and-articles/75972"&gt;The best of hidden Berlin&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 25 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/berlin-travel-bookmarks</guid></item><item><title>Skeuomorph</title><link>https://xenodium.com/skeuomorph</link><description>&lt;p&gt;From &lt;a href="https://en.wikipedia.org/wiki/Skeuomorph"&gt;Wikipedia&lt;/a&gt;, skeuomorph &lt;em&gt;ˈskjuːəmɔrf&lt;/em&gt; is a derivative object that retains ornamental design cues from structures that were necessary in the original. Examples include pottery embellished with imitation rivets reminiscent of similar pots made of metal and a software calendar that imitates the appearance of binding on a paper desk calendar.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 25 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/skeuomorph</guid></item><item><title>define-word</title><link>https://xenodium.com/define-word</link><description>&lt;p&gt;Installed &lt;a href="https://github.com/abo-abo"&gt;Abo Abo's&lt;/a&gt; &lt;a href="https://github.com/abo-abo/define-word"&gt;define-word&lt;/a&gt; Emacs package. A handy package to define words at point.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/define-word/define-word.png" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 25 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/define-word</guid></item><item><title>The "New" New Microsoft</title><link>https://www.danstroot.com/posts/2015-05-25-the-new-new-microsoft</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/satya-nadella-microsoft-ceo.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;I've been a fan of Microsoft during my whole technical career.  However I don't recommend Microsoft any longer for server workloads, and haven't for years due to the fact that the Linux ecosystem is far less expensive and has more innovative people working on it and sharing what they do openly. However, I am very impressed with the direction and leadership of Satya Nadella.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2015-05-25-the-new-new-microsoft"&gt;The "New" New Microsoft&lt;/a&gt; first appeared on &lt;a href="https://www.danstroot.com"&gt;Dan Stroot's Blog&lt;/a&gt;</description><author>Dan Stroot</author><pubDate>Mon, 25 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2015-05-25-the-new-new-microsoft</guid></item><item><title>HtmlToWord is now WordInserter</title><link>https://tomforb.es/blog/htmltoword-is-now-wordinserter/</link><description>I’ve released a redesign of my HtmlToWord library, specifically it now supports Markdown and multiple different ways to interact with Word. It’s now also been renamed to WordInserter to reflect this. Originally HtmlToWord was designed to take HTML input, process it and then insert a representation o...</description><author>Tom Forbes</author><pubDate>Sun, 24 May 2015 23:57:06 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/htmltoword-is-now-wordinserter/</guid></item><item><title>Unity 8's Snappy Scope</title><link>https://kyrofa.com/posts/unity-8-s-snappy-scope/</link><description>I recently began a new position at Canonical. I joined this company in particular to give myself more opportunities for growth. Now, when I say that, people tend to assume I&amp;rsquo;m talking about a managerial track. I&amp;rsquo;m not sure why they tend to jump there, but it&amp;rsquo;s not what I&amp;rsquo;m referring to here. I&amp;rsquo;m talking about technical growth. I feel at the top of my game when I&amp;rsquo;m learning something brand new, and I needed a company that facilitated that.</description><author>kyrofa's blog</author><pubDate>Sun, 24 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/unity-8-s-snappy-scope/</guid></item><item><title>Note On Images</title><link>https://blog.yiningkarlli.com/2015/05/note-on-images.html</link><description>&lt;p&gt;Just a quick note on images on this blog. So far, I’ve generally been embedding full resolution, losslessly compressed PNG format images in the blog. I prefer having the full resolution, lossless images available on the blog since they are the exact output from my renderer. However, full resolution lossless PNGs can get fairly large (several MB for a single 1920x1080 frame), which is dragging down the load times for the blog.&lt;/p&gt;

&lt;p&gt;Going forward, I’ll be embedding lossy compressed JPG images in blog posts, but the JPGs will link through to the full resolution, lossless PNG originals. Fortunately, high quality JPG compression is quite good these days at fitting an image with nearly imperceptible compression differences into a much smaller footprint. I’ll also be going back and applying this scheme to old posts too at some point.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id="addendum-2016-04-08"&gt;Addendum 2016-04-08&lt;/h2&gt;

&lt;p&gt;Now that I am doing some renders in 4K resolution (3840x2160), it’s time for an addendum to this policy.
I won’t be uploading full resolution lossless PNGs for 4K images, due to the overwhelming file size (&amp;gt;30MB for a single image, which means a post with just a handful of 4K images can easily add up to hundreds of MB).
Instead, for 4K renders, I will embed a downsampled 1080P JPG image in the post, and link through to a 4K JPG compressed to balance image quality and file size.&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Sat, 23 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2015/05/note-on-images.html</guid></item><item><title>2015-05-23</title><link>https://ho.dges.online/pictures/2015-05-23/</link><description/><author>ho.dges.online</author><pubDate>Sat, 23 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-05-23/</guid></item><item><title>Flushing empty lines in Emacs</title><link>https://xenodium.com/flushing-empty-lines-in-emacs</link><description>&lt;p&gt;Via &lt;a href="https://www.masteringemacs.org"&gt;masteringemacs.org&lt;/a&gt;, &lt;a href="https://www.masteringemacs.org/article/removing-blank-lines-buffer"&gt;removing blank lines in a buffer&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-example"&gt;M-x flush-lines RET ^$ RET
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 22 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/flushing-empty-lines-in-emacs</guid></item><item><title>Regex bookmarks</title><link>https://xenodium.com/regex-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ergoemacs.org/emacs/emacs_regex.html"&gt;Emacs: Text Pattern Matching (regex) tutorial&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/emmawedekind/regex-cheat-sheet-2j2a"&gt;Regex Cheat Sheet (DEV Community)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://regexrenamer.sourceforge.net/help/regex_quickref.html"&gt;Regex quick reference&lt;/a&gt;: From regexrenamer.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item"&gt;RegExr, see hacker news comments for other suggestions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://regexr.com/"&gt;RegExr: A website for interactive regex prototyping with syntax highlighting&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 22 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/regex-bookmarks</guid></item><item><title>Spring Cleaning</title><link>https://solomon.io/spring-cleaning/</link><description>I recently left my job in Advertising to move back to Atlanta and build a fantasy sports company. The guy I was going to room with had a month left on his lease.</description><author>Sam Solomon</author><pubDate>Fri, 22 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/spring-cleaning/</guid></item><item><title>Blindness by Iain Banks</title><link>https://ho.dges.online/words/commonplace/blindness-by-iain-banks/</link><description/><author>ho.dges.online</author><pubDate>Fri, 22 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/blindness-by-iain-banks/</guid></item><item><title>Fattura Elettronica Open Source: Web Service PA</title><link>https://nicolaiarocci.com/fattura-elettronica-open-source-web-service-pa/</link><description>&lt;p&gt;&lt;em&gt;this post is about an all-Italian open source release, so it’s going to be in Italian&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il progetto &lt;a href="http://nicolaiarocci.com/fattura-elettronica-open-source/"&gt;Fattura Elettronica Open Source&lt;/a&gt; si è arricchito di un nuovo strumento: &lt;a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA.WebServices"&gt;Web Services&lt;/a&gt;. Il namespace &lt;code&gt;FatturaElettronicaPA.WebServices&lt;/code&gt; raccoglie una serie di client C# che consentono di consultare i Web Service per la Fattura Elettronica messi a disposizione dalla Pubblica Amministrazione.&lt;/p&gt;
&lt;p&gt;Sono disegnati in maniera da esporre tutti la stessa interfaccia ed essere al tempo stesso semplici e leggeri. Al momento lavorano in modalità sincrona ma l’obiettivo è di renderli tutti asincroni.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 21 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/fattura-elettronica-open-source-web-service-pa/</guid></item><item><title>The Five Rules for Successful Stock Investing: Morningstar's Guide to Building Wealth and Winning in the Market</title><link>https://olshansky.info/book/the_five_rules_for_successful_stock_investing/</link><description>Olshansky's review of The Five Rules for Successful Stock Investing: Morningstar's Guide to Building Wealth and Winning in the Market by Pat Dorsey</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 21 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/the_five_rules_for_successful_stock_investing/</guid></item><item><title>Be Careful When The Offer You The Moon</title><link>https://ho.dges.online/words/commonplace/be-careful-when-the-offer-you-the-moon-by-clive-james/</link><description>&lt;p&gt;Be careful when they offer you the moon&lt;br /&gt;
It gives a cold light&lt;br /&gt;
It was only ever made to light the night&lt;br /&gt;
You can freeze your fingers handling the moon&lt;/p&gt;
&lt;p&gt;Be careful when they offer you the moon&lt;br /&gt;
It’s built for dead souls&lt;br /&gt;
It’s a colourless and dusty ball of holes&lt;br /&gt;
You can break and ankle dancing on the moon&lt;/p&gt;
&lt;p&gt;When you take the moon you kiss the world goodbye&lt;br /&gt;
For a chance to lord it over loneliness&lt;br /&gt;
And a quarter-million miles down the sky&lt;br /&gt;
They watch you shining more but weighing less&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Mon, 18 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/be-careful-when-the-offer-you-the-moon-by-clive-james/</guid></item><item><title>Subclassing UILabel in 2015</title><link>https://whackylabs.com/uikit/ios/2015/05/16/subclassing-uilabel-in-2015/</link><description>&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt; is one the most smart view in &lt;code class="language-plaintext highlighter-rouge"&gt;UIKit&lt;/code&gt; family. It knows a lot
about itself. If you constraint it to a certain width, the UILabel can
calculate the height for itself. Another smart thing about &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt; is
that is saves you machine cycles by not redrawing its content unless
something is actually modified. And if you use &lt;code class="language-plaintext highlighter-rouge"&gt;NSAttributedString&lt;/code&gt;, you
can in fact draw a more sophisticated text content.&lt;/p&gt;

&lt;p&gt;Given so many good things with a &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt;, it is very tempting to
subclass a &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt; to render our custom text content. Say if you’re
working on a game or app, say a chat messenger, you may like to have a
view where you render you text and have some decorations around it, like
a speech bubble with an optional image. And, &lt;a href="https://twitter.com/madgarden/status/578189016031363072"&gt;if you’ve ever worked on
such a task, you know how painful it actually
is!&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt; is the perfect fit whenever you’ve a need to render some
text on screen. Recently had to undergo such a job of subclassing
&lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt;, and it surprisingly hard to find a good source of information
that shows how to properly subclass &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt;. It might work for the
text data you have right now, but there are so many screen sizes and
edge cases possible. If you’re one of those person, I don’t want you to
discover this knowledge the hard way like I did, I’ll share the
knowledge I’ve acquired from my adventure.&lt;/p&gt;

&lt;p&gt;Even if you’re not directly using &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt; but rendering your content
on an OpenGL canvas using Freetype library or something, the knowledge
of how &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt; works should be really helpful in designing your own
view. But, you can take my word for it, that rendering text is one of
the most challenging things in the UI problem domains. You have to
render all sort of glyphs, in all sort of writing directions with a lot
of kerning, ligatures and other text attributes. If you’re one of those
adventure seeker, you should definitely try building your own text
rendering system. Just for the inspiration, these are from the days when
I was building one:&lt;/p&gt;

&lt;blockquote class="twitter-tweet"&gt;&lt;p dir="ltr" lang="en"&gt;Fixing font rendering the long way &lt;a href="http://t.co/hJtCBKLqBN"&gt;pic.twitter.com/hJtCBKLqBN&lt;/a&gt;&lt;/p&gt;&amp;mdash; Sidharth Juyal (@chunkyguy) &lt;a href="https://twitter.com/chunkyguy/status/349802071815487488?ref_src=twsrc%5Etfw"&gt;June 26, 2013&lt;/a&gt;&lt;/blockquote&gt;


&lt;blockquote class="twitter-tweet"&gt;&lt;p dir="ltr" lang="en"&gt;One day work = FreeType font rendering &lt;a href="http://t.co/FJMrcPPu"&gt;pic.twitter.com/FJMrcPPu&lt;/a&gt;&lt;/p&gt;&amp;mdash; Sidharth Juyal (@chunkyguy) &lt;a href="https://twitter.com/chunkyguy/status/299153486690541568?ref_src=twsrc%5Etfw"&gt;February 6, 2013&lt;/a&gt;&lt;/blockquote&gt;


&lt;p&gt;Someday, I should probably also share my experiences with building a
UILabel-like view from scratch, I mean on top of freetype. But, today we
just extend over the work &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt; already does for us. Let’s begin
with creating a new project.&lt;/p&gt;

&lt;p&gt;We simply create a new project with a single view and add a
&lt;code class="language-plaintext highlighter-rouge"&gt;RoundedRectLabel&lt;/code&gt; class. Next, we write our basic code to render the
label on screen.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;RoundedRectLabel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UILabel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;ViewController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIViewController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;viewDidLoad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;viewDidLoad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backgroundColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lightGrayColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;chatBubbleLabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;RoundedRectLabel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"No one expects the Spanish Inquisition! Our chief weapon is surprise. Fear and surprise. Two chief weapons, fear, surprise, and ruthless efficiency! Er, among our chief weapons are: fear, surprise, ruthless efficiency, and near fanatical devotion to the Pope! Um, I'll come in again."&lt;/span&gt;
        &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;textColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blackColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backgroundColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cyanColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numberOfLines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;textAlignment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Justified&lt;/span&gt;
        &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addSubview&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTranslatesAutoresizingMaskIntoConstraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addConstraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;NSLayoutConstraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;CenterY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;relatedBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;toItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;CenterY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;multiplier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addConstraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;NSLayoutConstraint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constraintsWithVisualFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"H:|-[chatBubbleLabel]-|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;NSLayoutFormatOptions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;views&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"chatBubbleLabel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;prefersStatusBarHidden&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="screenshot01" src="http://i.imgur.com/8ejJI06.png" /&gt;&lt;/p&gt;

&lt;p&gt;Now the two important methods to subclass within a &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt; are:&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;textRectForBounds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGRect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limitedToNumberOfLines&lt;/span&gt; &lt;span class="nv"&gt;numberOfLines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;CGRect&lt;/span&gt;
&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;drawTextInRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGRect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class="language-plaintext highlighter-rouge"&gt;textRectForBounds(_:limitedToNumberOfLines:)&lt;/code&gt; provides us an
opportunity to update the drawing area of the text within the &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt;.
And the &lt;code class="language-plaintext highlighter-rouge"&gt;drawTextInRect()&lt;/code&gt; is for you to do you custom drawing within
the view.&lt;/p&gt;

&lt;p&gt;If you notice, this is a little different than your usual UIView
subclassing, where you typically draw you content in &lt;code class="language-plaintext highlighter-rouge"&gt;drawRect()&lt;/code&gt;.
Another thing to keep in mind is that you typically also don’t want to
modify the &lt;code class="language-plaintext highlighter-rouge"&gt;intrinsicContentSize()&lt;/code&gt;. Overriding these two methods will
do whatever you want to do with you custom &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For sake of getting a deeper understanding, let’s print out the order of
execution.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;RoundedRectLabel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UILabel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;textRectForBounds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGRect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limitedToNumberOfLines&lt;/span&gt; &lt;span class="nv"&gt;numberOfLines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;CGRect&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;textRect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;textRectForBounds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;limitedToNumberOfLines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;numberOfLines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="k"&gt;__FUNCTION__&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;textRect&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;textRect&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;drawTextInRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGRect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawTextInRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="k"&gt;__FUNCTION__&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;intrinsicContentSize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;CGSize&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;intrinsicContentSize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="k"&gt;__FUNCTION__&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here’s the output:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;textRectForBounds(_:limitedToNumberOfLines:): (0.0, 0.0, 2122.5, 20.5)
intrinsicContentSize(): (2122.5, 20.5)
textRectForBounds(_:limitedToNumberOfLines:): (0.0, 0.0, 342.5, 142.0)
intrinsicContentSize(): (342.5, 142.0)
drawTextInRect: (0.0, 0.0, 343.0, 142.0)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The interesting thing to notice here is that whatever is calculated from
the &lt;code class="language-plaintext highlighter-rouge"&gt;super.textRectForBounds(_:limitedToNumberOfLines:)&lt;/code&gt; is also passed
on to the &lt;code class="language-plaintext highlighter-rouge"&gt;intrinsicContentSize()&lt;/code&gt;. Another interesting thing is that,
the methods are called multiple times. First time with some estimated
values by &lt;code class="language-plaintext highlighter-rouge"&gt;UIKit&lt;/code&gt; and second time after the values have been evaluated
accurately enough.&lt;/p&gt;

&lt;p&gt;Not implementing the &lt;code class="language-plaintext highlighter-rouge"&gt;intrinsicContentSize()&lt;/code&gt; also means that, you don’t
need to &lt;code class="language-plaintext highlighter-rouge"&gt;invalidateIntrinsicContentSize()&lt;/code&gt; yourself. Since, the default
drawing mode of &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt; is &lt;code class="language-plaintext highlighter-rouge"&gt;UIViewContentMode.Redraw&lt;/code&gt;, the content is
redrawn automatically whenever the content updates. To confirm, if you
update the text after a while, you can see the drawing methods being
invoked again.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;ViewController&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UIViewController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;viewDidLoad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;viewDidLoad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backgroundColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lightGrayColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;chatBubbleLabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;RoundedRectLabel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"No one expects the Spanish Inquisition! Our chief weapon is surprise. Fear and surprise. Two chief weapons, fear, surprise, and ruthless efficiency! Er, among our chief weapons are: fear, surprise, ruthless efficiency, and near fanatical devotion to the Pope! Um, I'll come in again."&lt;/span&gt;
        &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;textColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blackColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backgroundColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cyanColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numberOfLines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;textAlignment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Justified&lt;/span&gt;
        &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addSubview&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTranslatesAutoresizingMaskIntoConstraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addConstraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;NSLayoutConstraint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;CenterY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;relatedBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;toItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;CenterY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;multiplier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addConstraints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;NSLayoutConstraint&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constraintsWithVisualFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"H:|-[chatBubbleLabel]-|"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;NSLayoutFormatOptions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;views&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"chatBubbleLabel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

        &lt;span class="nf"&gt;dispatch_after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;dispatch_time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;DISPATCH_TIME_NOW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Int64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;NSEC_PER_SEC&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="nf"&gt;dispatch_get_main_queue&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Void&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
            &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"---------"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;chatBubbleLabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"All right, but apart from the sanitation, the medicine, education, wine, public order, irrigation, roads, the fresh-water system, and public health, what have the Romans ever done for us?"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;prefersStatusBarHidden&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Output:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;textRectForBounds(_:limitedToNumberOfLines:): (0.0, 0.0, 2122.5, 20.5)
intrinsicContentSize(): (2122.5, 20.5)
textRectForBounds(_:limitedToNumberOfLines:): (0.0, 0.0, 342.5, 142.0)
intrinsicContentSize(): (342.5, 142.0)
drawTextInRect: (0.0, 0.0, 343.0, 142.0)
---------
textRectForBounds(_:limitedToNumberOfLines:): (0.0, 0.0, 1403.0, 20.5)
intrinsicContentSize(): (1403.0, 20.5)
textRectForBounds(_:limitedToNumberOfLines:): (0.0, 0.0, 323.5, 101.5)
intrinsicContentSize(): (323.5, 101.5)
drawTextInRect: (0.0, 0.0, 343.0, 101.5)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is good, because it means if you’re subclassing a UILabel, you need
to focus on just these two methods and the &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt; will take care of
the rest. So, lets focus first on the &lt;code class="language-plaintext highlighter-rouge"&gt;drawTextInRect()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The first thing is to calculate the edge insets or padding you wish to
give your label.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;edgeInsets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIEdgeInsets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;drawTextInRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGRect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;textRect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIEdgeInsetsInsetRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawTextInRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;textRect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="screenshot03" src="http://i.imgur.com/s1QfIyp.png" /&gt;&lt;/p&gt;

&lt;p&gt;As you can see, we’ve the required padding from all edges as we wanted,
but the text is truncated at the end. This is because the &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt;
currently is trying to draw the text within the original frame it had
calculated. So the next task is to provide the new drawing frame to
&lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt;. This is done within
&lt;code class="language-plaintext highlighter-rouge"&gt;textRectForBounds(_:limitedToNumberOfLines:)&lt;/code&gt;. The important question
is how do we calculate what frame size do we need to draw the entire
text content?&lt;/p&gt;

&lt;p&gt;The &lt;code class="language-plaintext highlighter-rouge"&gt;NSString&lt;/code&gt; has a handy extension that does this calculations. The
method we’re particularly interested in is&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;boundingRectWithSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGSize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;NSStringDrawingOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;NSObject&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;AnyObject&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;NSStringDrawingContext&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;CGRect&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We just need to provide this method our estimated size of drawing area
and other rendering attributes, and it will return the actual frame we
need to render this text. This brings us to the part II of the problem:
How do we calculate the estimated size of the drawing area?&lt;/p&gt;

&lt;p&gt;Let’s see, we know the width that we wish to draw in.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;estimatedWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGRectGetWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;textRect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But, &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt; passes the same original width to
&lt;code class="language-plaintext highlighter-rouge"&gt;textRectForBounds(_:limitedToNumberOfLines:)&lt;/code&gt; and &lt;code class="language-plaintext highlighter-rouge"&gt;drawTextInRect()&lt;/code&gt;.
So, this means if the original width of the &lt;code class="language-plaintext highlighter-rouge"&gt;UILabel&lt;/code&gt; is 100 pts and we
wish to have a padding of 10 pts from all edges. If &lt;code class="language-plaintext highlighter-rouge"&gt;NSString&lt;/code&gt; API
calculates the required height for width = 80, is lets say it’s 200. The
size passed down to &lt;code class="language-plaintext highlighter-rouge"&gt;drawTextInRect()&lt;/code&gt; is 100×200, where we again shrink
the size down to 80×180. In order to compensate for this second
clipping, we must calculate the height for an 2 times smaller width.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;estimatedWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGRectGetWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But what about the height? Don’t worry, this is just an estimated
height, we can provide a very high value, and hope for the best.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;estimatedWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGRectGetWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;estimatedHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;calculatedFrame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;NSString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;boundingRectWithSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;CGSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;estimatedWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;estimatedHeight&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;UsesLineFragmentOrigin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;NSFontAttributeName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Next, remember, the &lt;code class="language-plaintext highlighter-rouge"&gt;boundingRectWithSize(...)&lt;/code&gt; will try to wrap our
text in as less space as possible, because that is the default behavior.
So, we need to explicitly provide the extra top and bottom padding to
the size calculated.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;calculatedWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;CGRectGetWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculatedFrame&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;calculatedHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;CGRectGetHeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculatedFrame&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;finalHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculatedHeight&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calculatedWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;finalHeight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class="language-plaintext highlighter-rouge"&gt;ceil()&lt;/code&gt; should raise fractional mathematical value to a renderable
screen value. The entire code is below.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;RoundedRectLabel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UILabel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;edgeInsets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIEdgeInsets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;textRectForBounds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGRect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limitedToNumberOfLines&lt;/span&gt; &lt;span class="nv"&gt;numberOfLines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;CGRect&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;rect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;textRectForBounds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bounds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;limitedToNumberOfLines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;numberOfLines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;estimatedWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGRectGetWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;estimatedHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;calculatedFrame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;NSString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;boundingRectWithSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;CGSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;estimatedWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;estimatedHeight&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;UsesLineFragmentOrigin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;NSFontAttributeName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;calculatedWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;CGRectGetWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculatedFrame&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;calculatedHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;CGRectGetHeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculatedFrame&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;finalHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculatedHeight&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calculatedWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;finalHeight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;rect&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;drawTextInRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGRect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;textRect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIEdgeInsetsInsetRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawTextInRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;textRect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="screenshot05" src="http://i.imgur.com/JEY3NfN.png" /&gt;&lt;/p&gt;

&lt;p&gt;To finish it off, we just need some custom drawing code. Feel free to
draw whatever you like.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;drawTextInRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGRect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;UIColor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cyanColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setFill&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="kt"&gt;UIColor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blackColor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setStroke&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;edgePath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIBezierPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;roundedRect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;cornerRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;edgePath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lineWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;5.0&lt;/span&gt;
    &lt;span class="n"&gt;edgePath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lineJoinStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kCGLineJoinRound&lt;/span&gt;
    &lt;span class="n"&gt;edgePath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;edgePath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stroke&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;textRect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;UIEdgeInsetsInsetRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edgeInsets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawTextInRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;textRect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="screenshot06" src="http://i.imgur.com/3aPDAxf.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt="screenshot07" src="http://i.imgur.com/XlIJB5y.png" /&gt;&lt;/p&gt;

&lt;p&gt;The entire code is also available at &lt;a href="https://github.com/chunkyguy/RoundedRectLabel"&gt;github&lt;/a&gt;.&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Sat, 16 May 2015 09:23:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/uikit/ios/2015/05/16/subclassing-uilabel-in-2015/</guid></item><item><title>View everything as optional</title><link>https://macleodsawyer.com/blog/view-everything-as-optional/</link><description>&lt;p&gt;Every week I throw up a quote or a saying that comes to mind on this whiteboard that sits on my desk.&lt;/p&gt;
&lt;p&gt;This week it happens to be “View everything as optional”. I have no clue where I came up with it (if I did) or if I saw it online or in a book sometime in the past.&lt;/p&gt;
&lt;p&gt;Now, what do I mean when I say “view everything as optional”? I am talking about your decisions, your life, everything around you. Did you have to get that coffee? Buy that shirt? Go out with friends? Tell your friends you weren’t going out because of other pressing matters (like watching Daredevil all night as I did)?&lt;/p&gt;
&lt;p&gt;Everyone says that saying “No” is the best option. Truth be told that advice is horrible. You shouldn’t always say no to every question thrown at you, you won’t go anywhere with that, you just can’t be successful that way, you’ll have to say yes eventually.&lt;/p&gt;
&lt;p&gt;Instead, think of everything as optional. Think of everything in your life, think of what could’ve been done better if you had just thought about it a little bit more. Don’t just immediately say no because that’s what everyone is pressuring you into saying and especially don’t just immediately say yes because that’s what everyone is pressuring you into saying. Instead, think beyond that, maybe it doesn’t deserve an answer, maybe you honestly just don’t care enough, maybe you’ll realize it isn’t vital to your life.
Think of everything as optional.&lt;/p&gt;
&lt;p&gt;Think of every time you have ever had to answer something, every time someone has told you something is final, that it can’t be fixed, that it just “isn’t possible”, or that you’re “getting ahead of yourself”. Take what they say under consideration, but realize nothing is final when making decisions, realize that everything around you is completely optional.&lt;/p&gt;
&lt;p&gt;Explore your options. Don’t let the world tell you that you only have one option, don’t let them tell you what to think, don’t let them think for you.
Be yourself, and make your own decisions. I realize sometimes it doesn’t work out that way, that some situations just “can’t” be optional, that what has happened, has happened. But, 99.9% of the time it’s “final” and you “can’t do anything about it” is just wrong in the scale of things.&lt;/p&gt;
&lt;p&gt;If you set your mind to it, there is always an option. There is always something you can do. There is always another option that you’re just not thinking about. Even if everything seems empty as if you have no other choices as if you have been cornered as if you can’t go any farther. There is always an option.&lt;/p&gt;
&lt;p&gt;Just look further beyond the questions, the answer is there. I promise. If you just think about it a little bit longer than that split second before giving the “final” answer, you will come to an option that is better and fits more with want you to want than what the other side that is pressuring you wants more. When I say look beyond, I mean it. Take the question apart word by word, take the situation apart and throw away everything you know and look at the events that caused it.&lt;/p&gt;
&lt;p&gt;Life is not an exam.&lt;/p&gt;
&lt;p&gt;There are no multiple choice forms in life, there are no exams. There are options beyond the normal “A” and “B”, and well beyond “C”, “D”, “E”, and “F”. Those options on tests from high school were thrown at you because those could be an answer. Within one of those questions could be the answer that you need to get that perfect score.&lt;/p&gt;
&lt;p&gt;But what happens if the teacher made an error? What happens if that specific question didn’t have the correct answer to it, and you just knew, you just had this gut feeling that you were right and that the test was wrong? Would you speak up? That’s up to you because everything is optional.&lt;/p&gt;
&lt;p&gt;You could just leave it be, you could just fill in the standard back up answer of “C” or you could think harder and ask the people around you, consult the teacher, consult your parents, the internet, textbooks, videos, professors, doesn’t matter as long as you just look beyond.&lt;/p&gt;
&lt;p&gt;If you went for the “C” option you wouldn’t enjoy finding out that later that your gut feeling was right, and that you could’ve said something about it.&lt;/p&gt;
&lt;p&gt;You fell into what society has told you – that there are only predetermined answers – to stop looking farther down the rabbit hole and find the answer that you need to fulfill yourself. Think of all those chances you could’ve had if you had just looked into the question more. It will fuel your doubt, it certainly fuels mine.&lt;/p&gt;
&lt;p&gt;But, the chance at being more right instead of wrong because you looked into it because you went beyond the question and found a new option that wasn’t on the board, will certainly make yourself feel better and that’s because it is better.&lt;/p&gt;
&lt;p&gt;Thinking for yourself, making your own choices, risking everything on a choice you feel is right, from all the research you have done is far more exciting and wonderful than letting the world tell you what your options are.&lt;/p&gt;
&lt;p&gt;Sometimes the world is better at answering questions, sometimes they can make the better calls. But, sometimes they just can’t. I’m not telling you to always overlook what the world is telling you. Take them into consideration, look into them, but also look into the options that can’t be seen, the options that sit beyond the horizon of the black hole that we just can’t, that we just shouldn’t look into.&lt;/p&gt;
&lt;p&gt;Find your own answer, don’t let yourself let the world find your answer. Be your own person. Have your own personality. Have your own choices.&lt;/p&gt;
&lt;p&gt;View everything as optional.&lt;/p&gt;</description><author>Macleod Sawyer | Web Portal Feed</author><pubDate>Sat, 16 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://macleodsawyer.com/blog/view-everything-as-optional/</guid></item><item><title>Video - Storage Cluster Failover Demo</title><link>https://smcleod.net/2015/05/video-storage-cluster-failover-demo/</link><description>&lt;p&gt;A brief demonstration of the failover and recovery process on the storage clusters I&amp;rsquo;ve been building.&lt;/p&gt;
&lt;div style="padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
      
    &lt;/div&gt;</description><author>smcleod.net</author><pubDate>Thu, 14 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/05/video-storage-cluster-failover-demo/</guid></item><item><title>How to install Percona MySQL 5.6 on Ubuntu 14.04 LTS from a script (i.e. without an interactive prompt for the mysql root password)</title><link>https://www.databasesandlife.com/how-to-install-percona-mysql-5-6-on-ubuntu-14-04-lts-from-a-script-i-e-without-an-interactive-prompt-for-the-mysql-root-password/</link><description>&lt;p&gt;Ubuntu 14.04 (and various versions of Debian) come with MySQL 5.5. If you need MySQL 5.6 features (such as better join algorithms) you can install the Percona software, as described &lt;a href="http://www.percona.com/doc/percona-server/5.6/installation/apt_repo.html" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, the installation process prompts you for the database&amp;rsquo;s root password. This isn&amp;rsquo;t convenient if you&amp;rsquo;re running the installation process from a script e.g. a Vagrant or Docker initialization script. Here&amp;rsquo;s the whole script to install Percona 5.6 and to set the root password to &amp;ldquo;root&amp;rdquo; without a prompt:&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Thu, 14 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/how-to-install-percona-mysql-5-6-on-ubuntu-14-04-lts-from-a-script-i-e-without-an-interactive-prompt-for-the-mysql-root-password/</guid></item><item><title>Futility by Wilfred Owen</title><link>https://ho.dges.online/words/commonplace/futility-by-wilfred-owen/</link><description>&lt;p&gt;&lt;em&gt;I remember reading this at school. It was the first WWI poem I think I read and I remember being very moved by it.&lt;/em&gt;&lt;br /&gt;
Move him into the sun—&lt;br /&gt;
Gently its touch awoke him once,&lt;br /&gt;
At home, whispering of fields half-sown.&lt;br /&gt;
Always it woke him, even in France,&lt;br /&gt;
Until this morning and this snow.&lt;br /&gt;
If anything might rouse him now&lt;br /&gt;
The kind old sun will know.&lt;/p&gt;
&lt;p&gt;Think how it wakes the seeds—&lt;br /&gt;
Woke once the clays of a cold star.&lt;br /&gt;
Are limbs, so dear-achieved, are sides&lt;br /&gt;
Full-nerved, still warm, too hard to stir?&lt;br /&gt;
Was it for this the clay grew tall?&lt;br /&gt;
—O what made fatuous sunbeams toil&lt;br /&gt;
To break earth&amp;rsquo;s sleep at all?&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Wed, 13 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/futility-by-wilfred-owen/</guid></item><item><title>LG Vertretungsplan App for Android</title><link>https://korz.dev/2015/05/lg-vertretungsplan-app-for-android/</link><description>&lt;p&gt;The last few weeks, I&amp;rsquo;ve been developing an app for the substitution plan of my school (hence the name: &amp;ldquo;Vertretungsplan&amp;rdquo; is German for substitution plan).&lt;/p&gt;</description><author>Niklas Korz</author><pubDate>Tue, 12 May 2015 01:00:00 GMT</pubDate><guid isPermaLink="true">https://korz.dev/2015/05/lg-vertretungsplan-app-for-android/</guid></item><item><title>Redirecting Requests with NGinx: Using NGinx configuration to quickly redirect traffic</title><link>https://joshuarogers.net/articles/2015-05/redirecting-requests-with-nginx/</link><description>A while back, I announced that I had moved my blog over to HTTPS. What about HTTP though? Do I serve content over HTTP still, or did I doom existing links to be forever broken?
As you could guess by the title of this post, neither of those was satisfactory. Instead, I added four lines to our NGinx configuration telling it to listen on port 80 and respond to every request with a permanent redirect pointing to the same path under https://joshuarogers.</description><author>Joshua Rogers</author><pubDate>Sun, 10 May 2015 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2015-05/redirecting-requests-with-nginx/</guid></item><item><title>Marvel's Daredevil: Season 1</title><link>https://olshansky.info/tv/marvels_daredevil_season_1/</link><description>Olshansky's review of Marvel's Daredevil: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 09 May 2015 08:29:46 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/marvels_daredevil_season_1/</guid></item><item><title>About TextUtils.</title><link>https://prashamhtrivedi.in/textutils.html</link><description>Android SDK has an awesome class called TextUtils. It has many great methods that I use daily, and some magical methods as well.</description><author>Prasham H Trivedi</author><pubDate>Sat, 09 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/textutils.html</guid></item><item><title>Upsert lands in PostgreSQL 9.5 – A first look</title><link>/2015/05/08/Upsert-lands-in-PostgreSQL-9.5-A-first-look/</link><description>&lt;p&gt;If you’ve followed anything I’ve &lt;a href="/2012/04/30/why-postgres/"&gt;written about Postgres&lt;/a&gt;, you know that I’m a fan. At the same time you know that there’s been one feature that so many other databases have, which Postgres lacks and it &lt;a href="/2014/08/15/my-postgres-wishlist-for-9.5/"&gt;causes a huge amount of angst for not being in Postgres&lt;/a&gt;… Upsert. Well the day has come, it’s finally committed and will be available &lt;a href="http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=168d5805e4c08bed7b95d351bf097cff7c07dd65"&gt;in Postgres 9.5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sure we’re still several months away from Postgres 9.5 being released, anywhere from 3-6 months as a best guess. That doesn’t mean we can’t take a first look at this feature. Though before we get into it a few special call outs of thanks to Peter Geoghegan of the &lt;a href="http://www.heroku.com/postgres"&gt;Heroku Postgres&lt;/a&gt; team for being the primary author on it, Andres Freund who recently just joined &lt;a href="https://www.citusdata.com"&gt;Citus Data&lt;/a&gt; for his heavy contributions, and Heikki Linnakangas as well for his contributions.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;And now onto the exploration. Upsert is the common name, but if you’re unfamiliar upsert is essentially create or update – Create this new record, but if a conflict exists update it. Let’s take a practical example.&lt;/p&gt;
&lt;p&gt;Assume you have a web scraper that imports product information into a table. Each product has a UPC code, title, description, and link. There’s a unique constraint on the UPC code. Now, if your web scraper tries to insert a new product, and a product with the same UPC already exists, you’d usually get an error. But you don’t want the query to fail, you’d want to update the existing product instead. Maybe with a new image, maybe a new description, whatever have you, but I don’t want it to blow up… I simply want to capture the new data and save it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So before&lt;/strong&gt;: Insert a record… Exception this violates a unique constraint… Let your app figure out what to do. &lt;em&gt;protip: often applications would try to work around this, but you can run a chance of a race condition and duplicate records if there’s a conflict. TLDR; it’s not a perfect solution.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now&lt;/strong&gt;: Insert a record… There’s a unique constraint violation… Okay, let’s just update all the new record’s fields &lt;strong&gt;inside a single transaction&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So enough explanation, here’s how it actually looks in the syntax:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INSERT INTO products (
upc,
title,
description,
link)
VALUES (
123456789,
‘Figment #1 of 5’,
‘THE NEXT DISNEY ADVENTURE IS HERE - STARRING ONE OF DISNEY'S MOST POPULAR CHARACTERS! ’,
‘http://www.amazon.com/dp/B00KGJVRNE?tag=mypred-20’
)
ON CONFLICT DO UPDATE SET description=excluded.description;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It’s been a long time coming for this, and it makes building applications that need this kind of behavior even easier. While it would have been great for this to be available years ago, kudos to Postgres and its community for taking the approach that is safe for your data. The result we have now both provides the desired behavior of create or update, &lt;strong&gt;and&lt;/strong&gt; is performant without the risk of race conditions for your data.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Fri, 08 May 2015 23:55:56 GMT</pubDate><guid isPermaLink="true">/2015/05/08/Upsert-lands-in-PostgreSQL-9.5-A-first-look/</guid></item><item><title>On my trip to Microsoft Build 2015</title><link>https://nicolaiarocci.com/on-my-trip-to-microsoft-build-2015/</link><description>&lt;p&gt;Last week I was in San Francisco for Build 2015, the annual conference event held by Microsoft and aimed toward software and web developers. Overall it has been a great experience. I especially enjoyed the opportunity to speak with Microsoft executives, Program Managers and developers about the new stuff they are cooking up and, in general, about that New Microsoft we all have been experiencing as of late (I have a &lt;a href="http://nicolaiarocci.com/i-wrote-a-thing-about-new-microsoft/"&gt;guest post&lt;/a&gt; on MSDN Italy on that topic).&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Fri, 08 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/on-my-trip-to-microsoft-build-2015/</guid></item><item><title>Tomorrowland</title><link>https://olshansky.info/movie/tomorrowland/</link><description>Olshansky's review of Tomorrowland</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 06 May 2015 17:56:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/tomorrowland/</guid></item><item><title>The 7 Ways to Earn a Living</title><link>https://one.mikro2nd.net/pages/7-ways-to-earn-a-living/</link><description>“Work is love made visible” wrote Khalil Gibran. “If you cannot work with love but only with distaste, it is better that you should leave your work and sit at the gate of the temple, taking alms of those who work with joy.”
In general there are 7 (maybe 8) ways of earning money:
Traders A trader makes their living buying stuff and selling it for a higher price. Generally some value has to be added to the stuff for this to work, and especially in this highly connected, information-rich age when anybody can just fire up their web browser to find the manufacturer of the stuff you’re selling and buy it directly.</description><author>one mikro2nd</author><pubDate>Wed, 06 May 2015 13:40:05 GMT</pubDate><guid isPermaLink="true">https://one.mikro2nd.net/pages/7-ways-to-earn-a-living/</guid></item><item><title>Write to temp iOS snippet</title><link>https://xenodium.com/write-to-temp-ios-snippet</link><description>&lt;pre&gt;&lt;code class="language-objc"&gt;NSString *tempDir = NSTemporaryDirectory();
NSLog(@&amp;quot;%@\n&amp;quot;, tempDir);
NSString *dataFilePath = [tempDir stringByAppendingPathComponent:@&amp;quot;my.file&amp;quot;];
[data writeToFile:dataFilePath atomically:YES];
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 06 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/write-to-temp-ios-snippet</guid></item><item><title>Finding duplicate JavaScript code</title><link>https://stribny.name/posts/finding-duplicate-javascript-code/</link><author>Posts by Petr Stribny</author><pubDate>Wed, 06 May 2015 00:53:44 GMT</pubDate><guid isPermaLink="true">https://stribny.name/posts/finding-duplicate-javascript-code/</guid></item><item><title>View On Social Changes In 2015</title><link>https://venam.net/blog/psychology/2015/05/06/view-on-social-changes.html</link><description>Hello fellow readers, This post is about an analysis of social changes in 2015.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Wed, 06 May 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/psychology/2015/05/06/view-on-social-changes.html</guid></item><item><title>Migrating to Laravel 5</title><link>https://liza.io/migrating-to-laravel-5/</link><description>&lt;p&gt;A few days ago I decided that there&amp;rsquo;s no use putting it off any longer - it&amp;rsquo;s time to upgrade to Laravel 5. I&amp;rsquo;ve been sitting on 4.2 for months and 5 is a major revision to&amp;hellip;well&amp;hellip;everything.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Tue, 05 May 2015 23:32:12 GMT</pubDate><guid isPermaLink="true">https://liza.io/migrating-to-laravel-5/</guid></item><item><title>Starving</title><link>http://evantravers.com/articles/2015/05/05/starving/</link><description>&lt;p&gt;&lt;img alt="golden path" src="https://images.evantravers.com/articles/2015/05/goldenpath.jpg" /&gt;&lt;/p&gt;&lt;p&gt;Heavenly Father, thank you for your graciousness in creating our bodies and our
souls to mirror each other in some ways... your patterns in creation are like
your fingerprint, allowing us foolish men and women to discover your hand in
the physical world, and to better understand our spiritual selves. As people we
are born, we drink milk, are weaned, mature, eat meat, reproduce... and the same
words and concepts you have used for our spiritual lives as well.&lt;/p&gt;
&lt;p&gt;When a sailor falls into the icy cold Atlantic, miles from rescue, the water
slowly lowers his body temperature to deadly levels. His experience will slide
from simple cold, intense shivering, incredible pain, the ironic sensation of
burning, numbness...  But the moment that he is most in peril of death is a
slowly spreading feeling of bliss, that all is well, and he has nothing to
fear. The cold floats away, and soon, so will his mind. A similar shutdown
occurs to those dying of thirst. The most horrifying moment is when the
sufferer no longer feels thirsty. The end is very near.&lt;/p&gt;
&lt;p&gt;In my brief life, I have never been at the precipice of death by cold or
thirst, but I have found that this is has certainly been true of my foolish
soul. The times that I have found that I feel like I don't need to drink of the
Word are the moments I am most in peril of spiritual dehydration... and I
confess that these moments are far too common.&lt;/p&gt;
&lt;p&gt;Heavenly Father... please bring me to your Word. I want to partake daily,
hourly, constantly. I know I'm promised that the more I drink, the more I'll
feel the thirst for your Truth in a Holy addiction. Keep me from the pride of
thinking that I'm doing well and can skip this morning, I know that this is a
dangerous time, near to exhaustion. Please draw me near to Yourself, and grant
me a sweet time of communion and encouragement. In your Son's precious name I
pray, amen.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Tue, 05 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2015/05/05/starving/</guid></item><item><title>Greece travel bookmarks</title><link>https://xenodium.com/greece-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://island-ikaria.com/villages/Armenistis"&gt;Armenistis - Ikaria&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Hydra_%2528island%2529"&gt;Hydra (island). No cars or motorcycles allowed&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/planetepics/status/584886491534471168/photo/1"&gt;Kathisma Beach - Lefkada&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Cephalonia"&gt;Kefalonia Island&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Melissani_Cave"&gt;Melissani Cave&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=monemvasia+greece&amp;amp;iac=1"&gt;Momnevasia&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Navagio"&gt;Navagio bay&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.milos-island.gr/beaches/papafragas-beach.html"&gt;Papafragas beach&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=preveza&amp;amp;t=ffab&amp;amp;iax=images&amp;amp;ia=images"&gt;Preveza at DuckDuckGo&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 04 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/greece-travel-bookmarks</guid></item><item><title>Sri Lanka travel bookmarks</title><link>https://xenodium.com/sri-lanka-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://exploreslk.com/ambuluwawa-temple/"&gt;Ambuluwawa Temple&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nomadicmatt.com/travel-blogs/sri-lanka-trip-planning-guide/"&gt;Sri Lanka Travel Guide | Best Tips For Your Trip (Nomadic Matt)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/amp/articles/best-train-rides-sri-lanka"&gt;The best train journeys in Sri Lanka&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.agoda.com/the-safari-hotel/hotel/yala-lk.html%20"&gt;The Safari Hotel (great area to go on safari, see leopards)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 04 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/sri-lanka-travel-bookmarks</guid></item><item><title>Switzerland travel bookmarks</title><link>https://xenodium.com/switzerland-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Bernina_railway"&gt;Bernina railway&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Lauterbrunnen"&gt;Lauterbrunnen village&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Lion_Monument"&gt;Lion Monument (Lucerne)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.luzern.com/en/index.cfm"&gt;Lucerne lake/city&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Oeschinen_Lake"&gt;Oeschinen Lake&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 04 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/switzerland-travel-bookmarks</guid></item><item><title>Thailand travel bookmarks</title><link>https://xenodium.com/thailand-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.traveller.com.au/bangkok-street-food-restaurant-raan-jay-fai-awarded-with-michelin-star-h03h7v"&gt;Best Thai street food: Bangkok stall Raan Jay Fai awarded with Michelin star&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thebuddhism.net/2012/07/11/buddha-statue-in-forest-pak-chong-thailand/"&gt;Buddha Statue in Forest Pak Chong&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Phanom_Rung_Historical_Park"&gt;Phanom Rung Historical Park&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/archpics/status/607334981971623936/photo/1"&gt;Rama IX park, Bangkok&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=Sanctuary+of+truth%2C+Thailand+&amp;amp;t=ffsb&amp;amp;iax=1&amp;amp;ia=images"&gt;Sanctuary of Truth&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-makes-Bangkok-so-popular"&gt;What makes Bangkok so popular? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 04 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/thailand-travel-bookmarks</guid></item><item><title>Madagascar travel bookmarks</title><link>https://xenodium.com/madagascar-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Avenue_of_the_Baobabs"&gt;Avenue of the Baobabs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 04 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/madagascar-travel-bookmarks</guid></item><item><title>Hong Kong travel bookmarks</title><link>https://xenodium.com/hong-kong-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://hongkongthrumyeyes.com/2013/07/13/crowd-of-pedestrians-crossing-at-sogo-in-causeway-bay/"&gt;Causeway Bay pedestrian crossing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/china/travel-tips-and-articles/75797"&gt;Hong Kong's most breathtaking views: where to glimpse the city from above&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hotel-icon.com/"&gt;Hotel Icon (allegedly amazing service/extras)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Lin_Heung_Tea_House"&gt;Lin Heung Tea House (bakery/tea/dim sum)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tripadvisor.co.uk/Restaurant_Review-g294217-d8028365-Reviews-Mak_s_Noodle_Jordan-Hong_Kong.html"&gt;Mak's Noodle (Jordan)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Siu_yuk"&gt;Siu yuk (Roasted Pig)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Tsang_Tsou_Choi"&gt;Tsang Tsou Choi (King of Hong Kong)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://danielfooddiary.com/2014/12/13/tsimchaikee/"&gt;Tsim Chai Kee&lt;/a&gt; (recommended over Mak's wonton/soup).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 04 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/hong-kong-travel-bookmarks</guid></item><item><title>Barcelona travel bookmarks</title><link>https://xenodium.com/barcelona-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/spain/barcelona/travel-tips-and-articles/77782"&gt;18 free things to do in Barcelona&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/merowing_/status/884349497685549056"&gt;Dessert place you can recommend in Barcelona? (Twitter)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lapedrera.com/en/home"&gt;La Pedrera&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 04 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/barcelona-travel-bookmarks</guid></item><item><title>Iceland travel bookmarks</title><link>https://xenodium.com/iceland-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.gertenbach.info/e_reisen_2010.htm"&gt;An Iceland travel log&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.apartmenthouse.is/"&gt;Apartmenthouse.is&lt;/a&gt; for local flats.&lt;/li&gt;
&lt;li&gt;Blue lagoon spa.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://citywalk.is/"&gt;citywalk.is&lt;/a&gt;: Free walking tour.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://designmarch.is/"&gt;Design March&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.iheartreykjavik.net/2015/04/drive-it-yourself-the-snaefellsnes-peninsula/"&gt;Drive it yourself: The Snæfellsnes peninsula&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.co.uk/maps/place/Efstidalur/@64.2428231,-20.5525875,17z/data%3D!3m1!4b1!4m2!3m1!1s0x48d699ea8baff6ab:0x9c26aa93153abbec?hl%3Den"&gt;Efstidalur&lt;/a&gt;: farm to table restaurant.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/travel-tips-and-articles/eight-must-see-spots-in-icelands-wild-west"&gt;Eight must-see spots in Iceland's wild west&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fridrikv.is/en/"&gt;Fridrikv restaurant&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://outfitters.is/en/"&gt;Gangleri outfitters&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Golden circle's waterfalls and geysers.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.grillmarkadurinn.is/"&gt;grillmarkadurinn.is&lt;/a&gt; restaurant.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.smaratun.is/"&gt;Horse farm hotel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hotelbudir.is/"&gt;Hotel Budir&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/iceland/travel-tips-and-articles/how-to-have-a-budget-break-in-iceland"&gt;How to have a budget break in iceland&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://drive.google.com/a/google.com/file/d/0B_7OFb4eNjNWeEFzM29maE9EUkU/view"&gt;Iceland itinerary&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lebowskibar.is/"&gt;Lebowski Bar&lt;/a&gt; seriously?&lt;/li&gt;
&lt;li&gt;Noodle Station.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pinkiceland.is/#!tours/cbo8"&gt;Pink Iceland tours&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swanhouse.is/"&gt;Reykjavik Apartment Hotel – Accommodation in City Centre (swanhouse.is)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.britishairways.com/en-gb/destinations/reykjavik/reykjavik-holidays"&gt;Reykjavik City Breaks (Book now with British Airways)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sandholt.is/"&gt;Sandholt&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;South coast's waterfalls and caves.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 04 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/iceland-travel-bookmarks</guid></item><item><title>The Little MongoDB Book 2nd Italian Edition</title><link>https://nicolaiarocci.com/the-little-mongodb-book-2nd-italian-edition/</link><description>&lt;p&gt;The second edition of the &lt;a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/"&gt;Little MongoDB Book Italian Edition&lt;/a&gt; is finally up. It is aligned to MongoDB 2.6 and includes a much needed introduction to the Aggregation Frameworks. Enjoy.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 04 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/the-little-mongodb-book-2nd-italian-edition/</guid></item><item><title>Contributing to open source projects.</title><link>https://prashamhtrivedi.in/contributing_opensource_projects.html</link><description>With open source nature of android and it&amp;rsquo;s vast open source ecosystem, we often (want to) contribute to an open source library. Here I have tried to cover some points to be kept in mind for library developers and contributers.</description><author>Prasham H Trivedi</author><pubDate>Sun, 03 May 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/contributing_opensource_projects.html</guid></item><item><title>How to Learn Vim: Vim Refcard</title><link>https://www.mikekasberg.com/blog/2015/05/02/vim-refcard.html</link><description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/mkasberg/vim-refcard"&gt;Vim Refcard on Github&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’m a huge fan of reference cards like the one &lt;a href="https://www.gnu.org/software/emacs/refcards"&gt;Emacs
provides&lt;/a&gt;. In fact, I think that a
good reference card is probably the best way to learn a new software program.
Whether it’s Vim or anything else.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;&lt;strong&gt;Do you want to learn Vim?&lt;/strong&gt; Print out this PDF, put it next to your monitor,
and start using Vim whenever you need a text editor. Seriously. Just do it. It
will be slow at first.  In fact, it might be a little painful. But after an hour
or two, you’ll be cruising along like a seasoned vet. You’ll be amazed how well
you can remember the shortcuts - your brain can remember them because you were
&lt;em&gt;using&lt;/em&gt; them.&lt;/p&gt;

&lt;p&gt;The Emacs refcard is really well done, but I couldn’t find a similar one for
Vim. This was disappointing because I know how useful a good reference card is.
So I busted out my LaTeX editor and made one. It’s open source, and available on
Github. Feel free to open a pull request if you think it’s missing anything
important.&lt;/p&gt;</description><author>Mike Kasberg's Blog</author><pubDate>Sat, 02 May 2015 22:00:00 GMT</pubDate><guid isPermaLink="true">https://www.mikekasberg.com/blog/2015/05/02/vim-refcard.html</guid></item><item><title>The Boy Next Door</title><link>https://olshansky.info/movie/the_boy_next_door/</link><description>Olshansky's review of The Boy Next Door</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 02 May 2015 13:02:54 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_boy_next_door/</guid></item><item><title>Kubernetes clusters with Oh-My-Vagrant</title><link>https://purpleidea.com/blog/2015/05/02/kubernetes-clusters-with-oh-my-vagrant/</link><description>&lt;p&gt;I&amp;rsquo;ve added the ability to deploy a &lt;a href="https://github.com/GoogleCloudPlatform/kubernetes"&gt;Kubernetes&lt;/a&gt; cluster with &lt;a href="https://github.com/purpleidea/oh-my-vagrant"&gt;Oh-My-Vagrant&lt;/a&gt; (&lt;em&gt;omv&lt;/em&gt;). I&amp;rsquo;ve also built an automated developer experience so that you can test your Kubernetes powered app in minutes. If you want to redeploy a new version, or see how your app behaves during a &lt;a href="https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/kubectl_rolling-update.md"&gt;rolling update&lt;/a&gt;, you can use &lt;em&gt;omv&lt;/em&gt; to test this out in minutes! I&amp;rsquo;ve recorded a &lt;a href="https://dl.fedoraproject.org/pub/alt/purpleidea/screencasts/oh-my-vagrant-kubernetes-screencast.ogv"&gt;screencast&lt;/a&gt; (~15 min), if you&amp;rsquo;d like to see some of this in action.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Sat, 02 May 2015 03:07:11 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/05/02/kubernetes-clusters-with-oh-my-vagrant/</guid></item><item><title>9 Truths Computer Programmers Know That Most People Don't.</title><link>https://macleodsawyer.com/blog/nine-truths-computer-programmers-know-that-most-people-dont/</link><description>&lt;p&gt;I wrote this when I was sixteen. While I do believe that &lt;strong&gt;most&lt;/strong&gt; of what is written is still accurate, be warned that it’s intended audiences were those most susceptable to clickbait. &lt;strong&gt;It worked.&lt;/strong&gt; This article was archived from my past blogs, comments have disapeared sadly but you can find quite a few of them here on &lt;a href="https://news.ycombinator.com/item?id=9164665"&gt;HackerNews&lt;/a&gt; where it remained on the front page for several days. Simpler times.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Computer programmers know far more about computers and code than the average person does, and honestly some of it’s scary.&lt;/p&gt;
&lt;h2 id="fact-%231" tabindex="-1"&gt;&lt;a class="header-anchor" href="#fact-%231"&gt;
          &lt;span&gt;#&lt;/span&gt;
        &lt;/a&gt; Fact #1&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;“Under the hood, most critical software you use every day (like Mac OS X, or Facebook) contains a terrifying number of hacks and shortcuts that happen to barely fit together into a working whole. It would be like taking apart a brand-new 747 and discovering that the fuel line is held in place by a coat-hanger and the landing gear is attached with duct tape.” — Ben Cherry&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That’s the funny thing about code, the website or program may work beautifully, it may run smoothly, and it may be absolutely beautiful on the front-end side (what the user sees). But, behind everything that makes it work it will have so many errors, and work arounds that barely work and that shouldn’t work, but do for some strange reason.&lt;/p&gt;
&lt;h2 id="fact-%232" tabindex="-1"&gt;&lt;a class="header-anchor" href="#fact-%232"&gt;
          &lt;span&gt;#&lt;/span&gt;
        &lt;/a&gt; Fact #2&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;That about 25% of the hours spent writing an application are spent figuring out ways the end user will do something wrong.” — Brian Humes&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Everytime we build something, we have to sit back and think of how the end-user will end up fucking it up. What they will click on, what they will write, the phrasing of questions, the language used, and how what we write could be interpreted differently. If we wrote the code like how we would use the project, well then there will be so many issues because we know how the program works, and the end user doesn’t.&lt;/p&gt;
&lt;h2 id="fact-%233" tabindex="-1"&gt;&lt;a class="header-anchor" href="#fact-%233"&gt;
          &lt;span&gt;#&lt;/span&gt;
        &lt;/a&gt; Fact #3&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;“A programmer is not a PC repair man.” — Ritesh Kumar Gupta&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A programmer is one who deals with algorithms and design principles, not the one who repairs a computer. We may know how the internal workings of a computer work, how code fits together (or rather hacked together as I explained in Fact #1). But, that does not mean we know how to fix hardware. That does not mean we know how to fix that issue you’re having with chrome that makes it crash everytime you open it, or why you’re computer is always overheating and the battery dying. Computers programmers, at the least know how to program computers, not fix them.&lt;/p&gt;
&lt;h2 id="fact-%234" tabindex="-1"&gt;&lt;a class="header-anchor" href="#fact-%234"&gt;
          &lt;span&gt;#&lt;/span&gt;
        &lt;/a&gt; Fact #4&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;“Programming is thinking, not typing.” — Casey Patton&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most of programming is spent sleeping, walking around, staring out the window, or doing anything else that helps you relax and think. Relaxing is a major key to programming, its not just sitting down and writing a thousand or more lines or code, and pushing out a program or app. We have to sit down, walk around, and just think. We need to think about how to come up with the concept, fix the issues with it, find a way to make it work, how it’s going to work. Relaxation is the only way we can fix the issues the best way we can.&lt;/p&gt;
&lt;h2 id="fact-%235" tabindex="-1"&gt;&lt;a class="header-anchor" href="#fact-%235"&gt;
          &lt;span&gt;#&lt;/span&gt;
        &lt;/a&gt; Fact #5&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Counting starts from zero, not one.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is important in every programmers life. Counting starts at 0, your “1&amp;quot; is my “0&amp;quot;, your “10&amp;quot; is my “9&amp;quot;. The reason why this is because computer programming is all about efficiency, and even small improvements in efficiency can make big differences at scale.&lt;/p&gt;
&lt;p&gt;And yes, counting from zero is slightly more efficient than starting at 1. Computers are built on a 0 and 1 numbering system that makes up everything (hello binary!). Counting from 0, is just easier and creates efficiency. (you can read more here)&lt;/p&gt;
&lt;h2 id="fact-%236" tabindex="-1"&gt;&lt;a class="header-anchor" href="#fact-%236"&gt;
          &lt;span&gt;#&lt;/span&gt;
        &lt;/a&gt; Fact #6&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;“Programming is best done “in the zone” — a (pleasant) state of mind where your focus on the task is absolute and everything seems easy. This is probably much like “the zone” for musicians and athletes.” — Morgan Johansson&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ever wondered why programmers are known as night birds? Why we stay up all night? Because it allows us to get into the zone, it allows us to focus on one thing and not have to worry about being interrupted by someone — because they are all asleep. It’s a long stretch of the day where no one is up and no one is calling or trying to talk to us. It’s a great time to program, and think.&lt;/p&gt;
&lt;h2 id="fact-%237" tabindex="-1"&gt;&lt;a class="header-anchor" href="#fact-%237"&gt;
          &lt;span&gt;#&lt;/span&gt;
        &lt;/a&gt; Fact #7&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Sleeping with a problem, can actually solve it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you have a problem you are told to sleep on it, forget it, put your mind at rest. But, with programmers its the go to way to solve the problem not because it gets us away from it, but because it for whatever reason helps us solve the problem with our code. Many times I have come across an issue, spent hours and hours of work on it, just trying to fix what should should be a simple problem with a simple fix. But, by going to sleep for 20 minutes, an hour, six hours, twelve hours, we can wake up and immediately know the answer to the problem.&lt;/p&gt;
&lt;h2 id="fact-%238" tabindex="-1"&gt;&lt;a class="header-anchor" href="#fact-%238"&gt;
          &lt;span&gt;#&lt;/span&gt;
        &lt;/a&gt; Fact #8&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;A parent may kill its children if the task assigned to them is no longer needed&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not something you would like to hear someone say while out, now is it? (and if it is, you should seriously check into a mental health facility, or turn yourself into your local police department).&lt;/p&gt;
&lt;p&gt;It’s not as gory as one would think, programs are written like a hierarchy. With the parent managing the processes below them.&lt;/p&gt;
&lt;p&gt;An example of the parent-child relationship.&lt;/p&gt;
&lt;p&gt;When a parent no longer needs a child they kill it, meaning when a program no longer needs to do something (say send an email), they kill the connections to the server as its not needed, basically killing the child.&lt;/p&gt;
&lt;h2 id="and-finally%2C-fact-%239" tabindex="-1"&gt;&lt;a class="header-anchor" href="#and-finally%2C-fact-%239"&gt;
          &lt;span&gt;#&lt;/span&gt;
        &lt;/a&gt; And finally, fact #9&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Just as you’re usually not impressed when we brag about how much we know about computers, we’re not impressed when you brag about how little you know about them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Seriously. Just stop, please it’s annoying. We don’t care. We really really don’t care how proud you are of not wanting to learn new things. Now, its understandable if you are just saying “I don’t know much about computers” or “I’m not really interested in computer programming” but bragging about how much you dont know about computers is just annoying. Stop.&lt;/p&gt;
&lt;p&gt;This article was archived from my past blogs, comments have disapeared sadly but you can find quite a few of them here on HackerNews: &lt;a href="https://news.ycombinator.com/item?id=9164665"&gt;https://news.ycombinator.com/item?id=9164665 3&lt;/a&gt;&lt;/p&gt;</description><author>Macleod Sawyer | Web Portal Feed</author><pubDate>Fri, 01 May 2015 17:51:21 GMT</pubDate><guid isPermaLink="true">https://macleodsawyer.com/blog/nine-truths-computer-programmers-know-that-most-people-dont/</guid></item><item><title>Git with GitHub the Simple Way</title><link>https://www.jimwestergren.com/git-with-github-the-simple-way</link><description>This is what is working for me and may not be the best for you. This is very beginner level. I am using the Git Bash from here. Starting a new repo Create the repo in GitHub, include readme. Create a team in Github and make sure you have access to the repo. Create a &amp;#91;...&amp;#93;</description><author>Jim Westergren</author><pubDate>Thu, 30 Apr 2015 19:03:00 GMT</pubDate><guid isPermaLink="true">https://www.jimwestergren.com/git-with-github-the-simple-way</guid></item><item><title>Building clang-format</title><link>https://xenodium.com/building-clang-format</link><description>&lt;p&gt;Based on instructions from &lt;a href="http://blog.hardcodes.de/articles/63/building-clang-format-and-friends-on-osx-mountain-lion"&gt;Building clang-format and friends on OSX Mountain Lion&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;#!/bin/bash
  set -o nounset
  set -o errexit

  # Based on instructions from:
  # http://blog.hardcodes.de/articles/63/building-clang-format-and-friends-on-osx-mountain-lion

  readonly LLVM_DIR_PATH='/tmp/llvm'

  update_repo() {
    if [[ ! -d $1 ]]; then
      git clone $2
    else
      cd $1
      git pull
      cd ..
    fi
    cd ..
  }

  update_all_repos() {
    update_repo &amp;quot;llvm&amp;quot; &amp;quot;http://llvm.org/git/llvm.git&amp;quot;
    pushd &amp;quot;${LLVM_DIR_PATH}/llvm/tools&amp;quot;
    update_repo &amp;quot;clang&amp;quot; &amp;quot;http://llvm.org/git/clang.git&amp;quot;
    popd
    cd &amp;quot;../../${LLVM_DIR_PATH}/llvm/tools/clang/tools&amp;quot;
    update_repo &amp;quot;clang-tools-extra&amp;quot; &amp;quot;http://llvm.org/git/clang-tools-extra.git&amp;quot;
    cd &amp;quot;../../..&amp;quot;
  }

  build_clang() {
    mkdir -p clang
    mkdir -p build
    cd clang
    ../llvm/configure --enable-libcpp --enable-cxx11 --enable-debug-symbols=no --enable-optimized --prefix=&amp;quot;${LLVM_DIR_PATH}/build&amp;quot;
    make install
  }

  mkdir -p $LLVM_DIR_PATH
  cd ${LLVM_DIR_PATH}
  update_all_repos
  build_clang
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bonus: use &lt;a href="http://zed0.co.uk/clang-format-configurator/"&gt;clang-format-configurator&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 30 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/building-clang-format</guid></item><item><title>Programmatic iOS Auto Layout</title><link>https://xenodium.com/programmatic-ios-auto-layout</link><description>&lt;p&gt;Basic iOS auto layout usage. See &lt;a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AdoptingAutoLayout/AdoptingAutoLayout.html"&gt;Adopting Auto Layout&lt;/a&gt; and &lt;a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/VisualFormatLanguage.html"&gt;Visual Format language&lt;/a&gt; for reference.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-objc"&gt;- (instancetype)initWithFrame:(CGRect)frame {
  self = [super initWithFrame:frame];
  if (self) {
    // Disable autoresizing mask translation for parent.
    self.translatesAutoresizingMaskIntoConstraints = NO;

    _subview1 = [[UIView alloc] init];
    // Disable autoresizing mask translation for subview.
    _subview1.translatesAutoresizingMaskIntoConstraints = NO;

    _subview1.backgroundColor = [UIColor redColor];
    [self addSubview:_subview1];

    // Creates a dictionary of bindings to be used in visual format.
    NSDictionary *viewBindings = NSDictionaryOfVariableBindings(_subview1);

    // H: horizontal layout
    // |-50- spacing in relation to superview
    // [_subview1(==50)] subview1's width
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@&amp;quot;H:|-50-[_subview1(==50)]&amp;quot;
                                                                 options:0
                                                                 metrics:nil
                                                                   views:viewBindings]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@&amp;quot;V:[_subview1(==50)]&amp;quot;
                                                                 options:0
                                                                 metrics:nil
                                                                   views:viewBindings]];
  }
  return self;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Also consider:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A UIView Subclass should implement intrinsicContentSize.&lt;/li&gt;
&lt;li&gt;A UIView Subclass should never add constraints on neither itself (ie. self) nor superview.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@NSomar/auto-layout-best-practices-for-minimum-pain-c130b2b1a0f6#.uu0xxmqbr"&gt;Auto layout best practices for minimum pain&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 30 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/programmatic-ios-auto-layout</guid></item><item><title>Avoid adding "drive-by formatting changes" to commits</title><link>https://www.databasesandlife.com/drive-by-formatting-changes/</link><description>&lt;p&gt;Recently, when reviewing code, I saw a commit resembling the following:&lt;/p&gt;
&lt;pre&gt;- if (x) foo();
- if (y) bar();
+ if (y) {
+    bar();
+ }
&lt;/pre&gt;
&lt;p&gt;It&amp;rsquo;s not easy to see that of the two &amp;ldquo;if&amp;rdquo; statements, only one was actually deleted. The other had its formatting changed, but was otherwise not altered.&lt;/p&gt;
&lt;p&gt;To prevent this, go through the &amp;ldquo;diff&amp;rdquo; before doing the commit. Revert any changes which have happened which haven&amp;rsquo;t changed the functionality of the code.&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Thu, 30 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/drive-by-formatting-changes/</guid></item><item><title>Google Summer of Code 2015!</title><link>https://spindas.dreamwidth.org/1247.html</link><description>&lt;p&gt;My proposal for the Haskell's Google Summer of Code 2015 has been accepted!&amp;nbsp;I'm super excited for this. There's a list of the other accepted proposals &lt;a href="https://www.reddit.com/r/haskell/comments/342rvp/google_summer_of_code_18_projects_accepted/cqqt8mw"&gt;on reddit&lt;/a&gt;, and I've posted my full proposal as a &lt;a href="https://gist.github.com/spinda/b261167303515cc8a1d9"&gt;Gist&lt;/a&gt;. I'll be working on embedding &lt;a href="https://github.com/ucsd-progsys/liquidhaskell"&gt;LiquidHaskell&lt;/a&gt; signatures in Haskell's native type system. Woo!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="comment count unavailable" height="12" src="https://www.dreamwidth.org/tools/commentcount?user=spindas&amp;amp;ditemid=1247" style="vertical-align: middle;" width="30" /&gt; comments</description><author>spinda's dreamwidth</author><pubDate>Wed, 29 Apr 2015 06:57:27 GMT</pubDate><guid isPermaLink="true">https://spindas.dreamwidth.org/1247.html</guid></item><item><title>More AUR Packages!</title><link>https://spindas.dreamwidth.org/986.html</link><description>&lt;strong&gt;New&amp;nbsp;Packages&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/nemo-owncloud-git/"&gt;nemo-owncloud-git&lt;/a&gt;, for my &lt;a href="https://github.com/spinda/nemo-owncloud"&gt;port&lt;/a&gt; of the Nautilus ownCloud plugin to Nemo&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Adopted Packages&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/gargoyle/"&gt;gargoyle&lt;/a&gt;, an interactive fiction player&lt;/li&gt;&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/nemo-dropbox-git/"&gt;nemo-dropbox-git&lt;/a&gt;, Dropbox plugin for Nemo&lt;/li&gt;&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/nemo-fileroller-git/"&gt;nemo-fileroller-git&lt;/a&gt;, File Roller plugin for Nemo&lt;/li&gt;&lt;li&gt;&lt;a href="https://aur.archlinux.org/packages/jips/"&gt;jips&lt;/a&gt;, an IPS patcher&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="comment count unavailable" height="12" src="https://www.dreamwidth.org/tools/commentcount?user=spindas&amp;amp;ditemid=986" style="vertical-align: middle;" width="30" /&gt; comments</description><author>spinda's dreamwidth</author><pubDate>Wed, 29 Apr 2015 04:02:02 GMT</pubDate><guid isPermaLink="true">https://spindas.dreamwidth.org/986.html</guid></item><item><title>MacBook 2015 Revisited</title><link>https://mschaef.com/2015_macbook_first_impressions</link><description>&lt;p&gt;Since my last post, I dropped by an Apple Store to take a look at the 2015 MacBook. It is difficult to overstate how startlingly small the new machine is in person. I may be biased by the internal specifications, but the impression is much more 'big tablet' than 'small laptop'. The other standout feature was the touchpad. It continues Apple's tradition of high-quality touchpad implementations, removes the mechanicical switch and hinge, and adds force sensititivy and haptic feedback. The mechanical simplifications alone are a worthwhile improvement.&lt;/p&gt;&lt;p&gt;I also spent some time typing on the keyboard. It's as shallow as you'd think, but the keys are very direct have a positive feel. There's none of the subtle rattling found on most small keyboards and it registered every keypress. I'm not completely convinced yet, but it at least seems possible that this type of keyboard could become the preferred keyboard for some typists.&lt;/p&gt;&lt;p&gt;The performance of the machine is also a point of interest. Even the lightly loaded demo machine on the showroom floor had a few hiccups paging the display around from one virtual desktop to the next.  Maybe it's nothing, but it does make me wonder if the machine can keep up with daily use, particuarly after a few OSX updates have been released. (For me, I think it'd be fine, but I spend most my time in Terminal, Emacs, and Safari, none of which are exactly heavy-hitters.)&lt;/p&gt;</description><author>Mike Schaeffer</author><pubDate>Wed, 29 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://mschaef.com/2015_macbook_first_impressions</guid></item><item><title>Implementing a simple event system in C++11</title><link>https://bastian.rieck.me/blog/2015/event_system_cxx11/</link><description>&lt;p&gt;I recently started thinking about event handling systems. I have been using &lt;code&gt;Boost.Signals&lt;/code&gt; for some
time now and was pretty happy with it.  Then the number of signals spiralled out of control and
forced me to re-think the design. The venerable design patterns book offers the &lt;a href="https://en.wikipedia.org/wiki/Observer_pattern"&gt;Observer pattern&lt;/a&gt; or its modified form, the &lt;a href="https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern"&gt;Publish–subscribe pattern&lt;/a&gt;. Both design
patterns involve passing information between possibly unrelated objects.&lt;/p&gt;
&lt;p&gt;My goal was to come up with a system that couples objects very loosely. Ideally, the central
instance, which I am going to call &lt;em&gt;dispatcher&lt;/em&gt; because it makes
&lt;a href="http://tamiko.kyomu.43-1.org"&gt;Tamiko&lt;/a&gt; happy, should know barely &lt;em&gt;anything&lt;/em&gt; about an event it
delivers. Using C++11, I came up with a rather simple and straightforward design.&lt;/p&gt;
&lt;p&gt;The following discussion will leave out unsubscriptions by observers because it makes the code
samples harder to follow. &lt;a href="https://github.com/Pseudomanifold/Events"&gt;The code on GitHub, though, has this
functionality&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="a-base-event-class"&gt;A base event class&lt;/h1&gt;
&lt;p&gt;Regardless of how anything else is implemented, we need a base class for describing an event.
Mine looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Event&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;virtual&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;DescriptorType&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="n"&gt;DescriptorType&lt;/span&gt; &lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Not much to see here. The destructor is kept virtual because &lt;code&gt;Event&lt;/code&gt; is a polymorphic base class.
Every derived event needs to implement the &lt;code&gt;type()&lt;/code&gt; function to describe itself. The
&lt;code&gt;DescriptorType&lt;/code&gt; refers to &lt;code&gt;const char*&lt;/code&gt;, meaning that each event uses a &lt;code&gt;const char*&lt;/code&gt; to create a
unique identifier. In practice, this is what it might look like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DemoEvent&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;DemoEvent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;DemoEvent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;constexpr&lt;/span&gt; &lt;span class="n"&gt;DescriptorType&lt;/span&gt; &lt;span class="n"&gt;descriptor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"DemoEvent"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;virtual&lt;/span&gt; &lt;span class="n"&gt;DescriptorType&lt;/span&gt; &lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note that the &lt;code&gt;DemoEvent&lt;/code&gt; class also offers a &lt;code&gt;static constexpr&lt;/code&gt; descriptor. This permits us to
write &lt;code&gt;DemoEvent::descriptor&lt;/code&gt; when referring to the descriptor of this class. In other words, we do
not need to instantiate anything here.&lt;/p&gt;
&lt;h1 id="the-dispatcher"&gt;The dispatcher&lt;/h1&gt;
&lt;p&gt;The role of the dispatcher is to manage multiple observers that are interested in a certain event.
To this end, we need a predefined interface every observer needs to implement. C++11 offers
&lt;code&gt;std::function&lt;/code&gt; for this purpose. We also need to keep track of which observers are interested in
which event. This is where the &lt;code&gt;DescriptorType&lt;/code&gt; of events comes in. Since &lt;code&gt;DescriptorType&lt;/code&gt; is a
&lt;code&gt;const char*&lt;/code&gt;, we can use it as key in a map! Whenever an event occurs, we then look up its
corresponding type, use this to access the map, and call all observers.&lt;/p&gt;
&lt;p&gt;This is the basic interface of the dispatcher:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dispatcher&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;SlotType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DescriptorType&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SlotType&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;slot&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DescriptorType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;SlotType&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_observers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Using &lt;code&gt;post()&lt;/code&gt; any client can send events to all observers that are interested in them. The
dispatcher keeps track of slots to call using the map. The implementation turns out to be
surprisingly simple:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Dispatcher&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DescriptorType&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SlotType&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;slot&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;_observers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;slot&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Dispatcher&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="c1"&gt;// Ignore events for which we do not have an observer (yet).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;_observers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;_observers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;observers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_observers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nl"&gt;observer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;observers&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1 id="defining-observers"&gt;Defining observers&lt;/h1&gt;
&lt;p&gt;So, how do we use the dispatcher then? By invoking the magic of &lt;code&gt;std::bind&lt;/code&gt;. Let us first define a
simple observer class. In this class, we can also check the underlying event type, for example if we
want to react differently to certain events:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ClassObserver&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;DemoEvent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;descriptor&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="c1"&gt;// This demonstrates how to obtain the underlying event type in case a
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="c1"&gt;// slot is set up to handle multiple events of different types.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;DemoEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;demoEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;DemoEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;__PRETTY_FUNCTION__&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;": "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;demoEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Again, we can see that the &lt;code&gt;static constexpr&lt;/code&gt; comes in handy. We do not need an instance of
&lt;code&gt;DemoEvent&lt;/code&gt; here. Now, assuming we have a dispatcher variable called &lt;code&gt;dispatcher&lt;/code&gt;, which is very
creative, we can finally use &lt;code&gt;std::bind()&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;placeholders&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;ClassObserver&lt;/span&gt; &lt;span class="n"&gt;classObserver&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Dispatcher&lt;/span&gt; &lt;span class="n"&gt;dispatcher&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;dispatcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;DemoEvent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ClassObserver&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;classObserver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_1&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;dispatcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;DemoEvent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This also demonstrates the basics of posting an event. It is probably not apparent in this example,
but the dispatcher does not need to know &lt;em&gt;anything&lt;/em&gt; about events excepts that they are inheriting
from the same base class. We can pass arbitrarily complex objects to and fro without changing the
coupling between the dispatcher and the observers.&lt;/p&gt;
&lt;h1 id="limitations"&gt;Limitations&lt;/h1&gt;
&lt;p&gt;A severe limitation of the design in this form is the inability to handle events in different
threads. The &lt;code&gt;post()&lt;/code&gt; interface assumes that it gets passed a &lt;code&gt;const reference&lt;/code&gt; to an event. This
makes sense insofar as we do not know how &amp;quot;heavy&amp;quot; an event is—or whether it makes
sense to be copied. Thus, in case one observer chooses to handle an event in a separate thread, the
event could potentially be destroyed before the observer finished handling it. One solution for this
problem would be to use &lt;code&gt;std::shared_ptr&lt;/code&gt; to pass events around. This at least would solve the
destruction issue—but I am not very firm concerning the thread safety of &lt;code&gt;std::shared_ptr&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Another issue is a systematic problem: I cannot guarantee the uniqueness of the self-described
events. If a client chooses to implement events &lt;code&gt;A&lt;/code&gt; and &lt;code&gt;B&lt;/code&gt; and both return, say &amp;quot;Foo&amp;quot; as
their event type, the dispatcher will &lt;em&gt;not&lt;/em&gt; be able to separate between these events. Currently, I
do not have a solution for this—hence, comments would be highly appreciated!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update (2021-01-31)&lt;/em&gt;: An &lt;a href="https://github.com/Pseudomanifold/Events/issues/1"&gt;issue&lt;/a&gt; in the GitHub
repository belonging to this post discusses a potential extension to
handle different event types by means of class templates in the
dispatcher class. This is a very neat suggestion&amp;mdash;check it out.&lt;/p&gt;
&lt;h1 id="the-code"&gt;The code&lt;/h1&gt;
&lt;p&gt;A slightly more involved implementation is available as the &lt;a href="https://github.com/Pseudomanifold/Events"&gt;&amp;quot;Events&amp;quot; repository in my
GitHub account&lt;/a&gt;. The code is licensed under an MIT license.&lt;/p&gt;
&lt;p&gt;I hope reading this was both insight- and eventful for you.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 26 Apr 2015 01:03:53 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/event_system_cxx11/</guid></item><item><title>House of Cards: Season 3</title><link>https://olshansky.info/tv/house_of_cards_season_3/</link><description>Olshansky's review of House of Cards: Season 3</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 25 Apr 2015 09:17:36 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/house_of_cards_season_3/</guid></item><item><title>Time Limits</title><link>https://johnj.com/posts/time-limits/</link><description>&lt;p&gt;
Picking up the art blogging again after a long hiatus.&lt;/p&gt;
&lt;p&gt;
Recently I’ve been thinking about constraints a lot, and finding out
how helpful they are. I think they are especially helpful for artists.&lt;/p&gt;
&lt;p&gt;
For example, since I started my new job last year, I am in the habit
of taking photos on the way to or from work. I use the following
constraints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use only the iPhone with no extra lenses (digital
filters/manipulation OK, but only on the iPhone itself).&lt;/li&gt;
&lt;li&gt;Picture must be taken on the way to or from work, or near the office.&lt;/li&gt;
&lt;li&gt;Post the ones I like on Facebook, to &lt;a href="http://bit.ly/viewsfromthecommute"&gt;this album&lt;/a&gt; ("Views from the Commute").&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The pictures are not always awesome, but the practice itself is most
satisfying. It’s a way to stay creative and visually-focused despite
the demands of a “real” job. And I find the instant feedback I get
from friends and family on Facebook more satisfying than many a
gallery show has been.&lt;/p&gt;
&lt;figure&gt;





&lt;a href="https://johnj.com/workingwounded.jpg"&gt;&lt;img class="resize" src="https://johnj.com/workingwounded_hu_4fcb0aa3c071c31c.jpg" style="width: 600px; border: 0px solid black;" /&gt;&lt;/a&gt;


&lt;figcaption&gt;
Image from "Views from the Commute"
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;
Another way I’ve been exploring constraints in the last few years is
by &lt;a href="./plein-air.html"&gt;painting outside&lt;/a&gt;. This practice has a number of constraints more or
less built in: you can’t carry too much stuff around; it’s only light
out for so long; and you typically paint the stuff you find in front
of you (rather than stuff you make up).&lt;/p&gt;
&lt;p&gt;
Lately I’ve been redoing my Web sites and thinking about some old art
projects as I sift through blog posts. I really enjoyed working with
SketchUp awhile back and have been itching to return to that. So I’ve
been wondering what sort of constraints might be helpful, similar to
the ones I get “for free” by painting outside.&lt;/p&gt;
&lt;p&gt;
I decided on the following formula:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Four hour limit per painting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hour one: make an image using SketchUp&lt;/li&gt;
&lt;li&gt;Hour two: transfer to panel and work on the drawing&lt;/li&gt;
&lt;li&gt;Third hour: underpainting&lt;/li&gt;
&lt;li&gt;Fourth hour: top layers / final painting.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fifteen minute break in between hours&lt;/li&gt;
&lt;li&gt;Use &lt;a href="https://github.com/eigenhombre/ptg"&gt;a Clojure program&lt;/a&gt; I wrote to help with the gridding of the drawing.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;





&lt;a href="https://johnj.com/holebubble-grid.jpg"&gt;&lt;img class="resize" src="https://johnj.com/holebubble-grid_hu_77be11eeae5da411.jpg" style="width: 600px; border: 0px solid black;" /&gt;&lt;/a&gt;


&lt;figcaption&gt;
First stage, after one hour: exported from SketchUp and gridded
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;





&lt;a href="https://johnj.com/IMG_9543.jpg"&gt;&lt;img class="resize" src="https://johnj.com/IMG_9543_hu_c48b3c1edf3934b8.jpg" style="width: 600px; border: 0px solid black;" /&gt;&lt;/a&gt;


&lt;figcaption&gt;
After second hour: drawing
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;





&lt;a href="https://johnj.com/IMG_9544.jpg"&gt;&lt;img class="resize" src="https://johnj.com/IMG_9544_hu_cc6aa5714c567387.jpg" style="width: 600px; border: 0px solid black;" /&gt;&lt;/a&gt;


&lt;figcaption&gt;
After third hour: underpainting
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;





&lt;a href="https://johnj.com/IMG_9546v2.jpg"&gt;&lt;img class="resize" src="https://johnj.com/IMG_9546v2_hu_6a92297b7e7ffd17.jpg" style="width: 600px; border: 0px solid black;" /&gt;&lt;/a&gt;


&lt;figcaption&gt;
Final image
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;





&lt;a href="https://johnj.com/IMG_9549.jpg"&gt;&lt;img class="resize" src="https://johnj.com/IMG_9549_hu_53d23c36d51e7723.jpg" style="width: 600px; border: 0px solid black;" /&gt;&lt;/a&gt;


&lt;figcaption&gt;
Detail 1
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;





&lt;a href="https://johnj.com/IMG_9551.jpg"&gt;&lt;img class="resize" src="https://johnj.com/IMG_9551_hu_b0768c799b1020e7.jpg" style="width: 600px; border: 0px solid black;" /&gt;&lt;/a&gt;


&lt;figcaption&gt;
Detail 2
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;
Lessons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Constraints help. I ordinarily have trouble finishing
paintings. Though there were a few points when I thought things were
totally off the rails and the work was going to be a disaster,
overall I had a lot more focus (and fun!) than I often do while
painting.&lt;/li&gt;
&lt;li&gt;I originally planned hour three (underpainting) to be in acrylics;
but I found I wanted to just jump in with oils, and it worked fairly
well. Being flexible about the plan in this regard was good.&lt;/li&gt;
&lt;li&gt;Having painting supports ready in advance was helpful; NOT having a
concept or content queued up (for the SketchUp part) was also good,
I think, though I might experiment with brainstorming content as a
(timed) stage in the process.&lt;/li&gt;
&lt;li&gt;SketchUp is a total rabbit hole. I could have burned the entire time
just fooling around in SketchUp alone. Warning: dragons dwell there!&lt;/li&gt;
&lt;/ul&gt;</description><author>John Jacobsen</author><pubDate>Sat, 25 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://johnj.com/posts/time-limits/</guid></item><item><title>Advanced Oracle Troubleshooting Guide – Part 12: control file reads causing enq: SQ – contention waits?</title><link>https://tanelpoder.com/2015/04/24/advanced-oracle-troubleshooting-guide-part-12-control-file-parallel-reads-causing-enq-sq-contention-waits/</link><description>&lt;p&gt;&lt;a href="http://vishaldesai.wordpress.com" target="_blank"&gt;Vishal Desai&lt;/a&gt; systematically troubleshooted an interesting case where the initial symptoms of the problem showed a spike of &lt;strong&gt;enq: SQ – contention&lt;/strong&gt; waits, but he dug deeper – and found the root cause to be quite different. He followed the blockers of waiting sessions manually to reach the root cause – and also used my @ash/&lt;a href="https://tanelpoder.com/2013/09/11/advanced-oracle-troubleshooting-guide-part-11-complex-wait-chain-signature-analysis-with-ash_wait_chains-sql/" target="_blank"&gt;ash_wait_chains.sql&lt;/a&gt; and @ash/&lt;a href="https://github.com/tanelpoder/tpt-oracle/blob/master/ash/event_hist.sql" target="_blank"&gt;event_hist.sql&lt;/a&gt; scripts to extract the same information more conveniently (note that he had modified the scripts to take AWR snap_ids as time range parameters instead of the usual date/timestamp):&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Sat, 25 Apr 2015 02:23:32 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2015/04/24/advanced-oracle-troubleshooting-guide-part-12-control-file-parallel-reads-causing-enq-sq-contention-waits/</guid></item><item><title>Keeping track of your things</title><link>https://venam.net/blog/unix/2015/04/25/keeping-track-of-your-things.html</link><description>Hello fellow nixers, This thread is about having your machine help you remember things throughout your days, to be your companion.</description><author>Venam's Blog — Patrick Louis (Lebanon)</author><pubDate>Sat, 25 Apr 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://venam.net/blog/unix/2015/04/25/keeping-track-of-your-things.html</guid></item><item><title>Working with YANG Models - A brief intro to 'pyangbind'</title><link>https://rob.sh/post/209/</link><description>&lt;p&gt;Both the Hawaii IETF meeting (IETF91) and the subsequent meeting we had a few weeks ago in Dallas were somewhat YANG-heavy. Following work to move towards YANG as a standard modelling language for network configuration, and the subsequent &lt;a href="https://www.ietf.org/iesg/statement/writable-mib-module.html" target="_blank"&gt;IESG statement&lt;/a&gt; effectively deprecating SNMP as the way that we present network configuration - the IETF, and especially the routing area, has dived head-first into YANG.
&lt;br /&gt;
&lt;br /&gt;
Indeed, I&amp;rsquo;ve been occupied somewhat with some really great collaborative work with a number of awesome engineers from Google, Microsoft, AT&amp;amp;T, Level3, Yahoo!, Facebook, Cox, Verizon and others on the &lt;a href="http://www.openconfig.net" target="_blank"&gt;OpenConfig&lt;/a&gt; initiative. We&amp;rsquo;re trying to take an operator and use-case driven approach to developing YANG modules for both configuration and defining the schema for telemetry. This work has turned up a few times in the press, and I should probably write something separate about it in the near future.
&lt;br /&gt;
&lt;br /&gt;
However, one observation that a number of people have made, is that there&amp;rsquo;s really limited tooling available to work with YANG modules. We have (the rather excellent) &lt;a href="https://github.com/mbj4668/pyang" target="_blank"&gt;pyang&lt;/a&gt;, which provides a validation tool for YANG modules and the corresponding &lt;a href="https://github.com/tail-f-systems/JNC" target="_blank"&gt;JNC&lt;/a&gt; plugin that creates Java classes &amp;ndash; but after that, options start to run pretty dry for what one might use, other than commercial products such as tail-f NCS. In some cases, the way that these modules work is also a bit esoteric, requiring quite a lot of care around what the YANG types are in the consuming code.
&lt;br /&gt;
&lt;br /&gt;
To drive adoption of YANG and NETCONF for making the network more programmable &amp;ndash; we need to make it easy to program the network. To this end, I started some work, with the aim of:
&lt;br /&gt;&lt;/p&gt;</description><author>rob.sh</author><pubDate>Sat, 25 Apr 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://rob.sh/post/209/</guid></item><item><title>hexo init blog</title><link>https://tuckersiemens.com/posts/hexo-init-blog/</link><description>&lt;p&gt;I've been wanting to start a blog for a long time now. Today I'm pulling the
trigger on that with a simple &lt;code&gt;hexo init blog&lt;/code&gt;. Well, it wasn't &lt;em&gt;that&lt;/em&gt; simple,
so I feel like it's worth talking about a few of the complications I had.&lt;/p&gt;</description><author>Reilly Tucker Siemens</author><pubDate>Fri, 24 Apr 2015 12:57:13 GMT</pubDate><guid isPermaLink="true">https://tuckersiemens.com/posts/hexo-init-blog/</guid></item><item><title>Hyperion</title><link>https://blog.yiningkarlli.com/2015/04/hyperion.html</link><description>&lt;p&gt;Just a quick update on future plans. Starting in July, I’m going to be working full time for &lt;a href="http://www.disneyanimation.com/"&gt;Walt Disney Animation Studios&lt;/a&gt; as a software engineer on their custom, in-house &lt;a href="http://www.fxguide.com/featured/disneys-new-production-renderer-hyperion-yes-disney/"&gt;Hyperion Renderer&lt;/a&gt;. I couldn’t be more excited about working with everyone on the Hyperion team; ever since the &lt;a href="https://disney-animation.s3.amazonaws.com/uploads/production/publication_asset/70/asset/Sorted_Deferred_Shading_For_Production_Path_Tracing.pdf"&gt;Sorted Deferred Shading paper&lt;/a&gt; was published two years ago, I’ve thought that the Hyperion team is doing some of the most interesting work there is in the rendering field right now.&lt;/p&gt;

&lt;p&gt;I owe an enormous thanks to everyone that’s advised and supported and encouraged me to continue exploring the rendering and graphics world. Thanks, Joe, Don, Peter, Tony, Mark, Christophe, Amy, Fran, Gabriel, Harmony, and everyone else!&lt;/p&gt;

&lt;p&gt;Normally as a rule I only post images to this blog that I made or have a contribution to, but this time I’ll make an exception. Here’s one of my favorite stills from &lt;em&gt;Big Hero 6&lt;/em&gt;, rendered entirely using Hyperion and lit by Angela McBride, a friend from PUPs 2011! Images like this one are an enormous source of inspiration to me, so I absolutely can’t wait to get started at Disney and help generate more gorgeous imagery like this!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Apr/BH6_still_Baymaxhug.jpg"&gt;&lt;img alt="A still from &amp;lt;em&amp;gt;Big Hero 6&amp;lt;/em&amp;gt;, rendered entirely using Hyperion. Property of Walt Disney Animation Studios." src="https://blog.yiningkarlli.com/content/images/2015/Apr/preview/BH6_still_Baymaxhug.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Fri, 24 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2015/04/hyperion.html</guid></item><item><title>Organizing Background Worker Queues</title><link>https://www.brightball.com/articles/organizing-background-worker-queues</link><description>At work earlier today I ran across an issue where one of our application queues got backed up and it got me to thinking about how queues are organized in general. The TLDR answer: use urgency and intensity.</description><author>Brightball Articles</author><pubDate>Thu, 23 Apr 2015 23:58:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/organizing-background-worker-queues</guid></item><item><title>Learning Japanese bookmarks</title><link>https://xenodium.com/learning-japanese-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ihlondon.com/foreign-languages/learn-japanese/beginners-japanese/"&gt;Beginners Japanese - International House London&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://files.tofugu.com/articles/japanese/2016-04-05-hiragana-chart/sasagami-hiragana-chart-sample.jpg"&gt;Hiragana stroke table&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/LearnJapanese/s/sb0he9nYnQ"&gt;I discovered a website that has a list of the most common 6000&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.soas.ac.uk/study/find-course/japanese-beginners-course"&gt;Japanese Beginners Course | SOAS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learnjapanese.moe/guide/"&gt;Japanese Guide - TheMoeWay&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/document/d/1LH82FjsCqCgp6-TFqUcS_EB15V7sx7O1VCjREp6Lexw/edit"&gt;Japanese Resources - Google Docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mangadex.org/title/53c628b3-d1f5-43aa-8df3-080034285cb4/junji-ito-s-cat-diary-yon-mu"&gt;Junji Ito's Cat Diary: Yon &amp;amp; Mu (reading)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kansaiben.com/"&gt;Kansai-ben: Kansai Dialect Self-study Site&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tofugu.com/japanese/learn-hiragana/"&gt;Learn Hiragana: Tofugu's Ultimate Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/LearnJapanese/comments/1gdfrqg/sites_to_practice_japanese_reading"&gt;Sites to practice Japanese reading? &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jpf.org.uk/language/courses.php"&gt;The Japan Foundation, London - Language Centre - Japanese Language Courses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/LearnJapanese/comments/1hhch8s/the_shortest_guide_to_learning_japanese"&gt;The shortest guide to learning Japanese&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kana-quiz.tofugu.com/"&gt;Tofugu’s Learn Kana Quiz&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 23 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/learning-japanese-bookmarks</guid></item><item><title>Japan travel bookmarks</title><link>https://xenodium.com/japan-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nomadasaurus.com/things-to-do-in-yokohama-japan/"&gt;21 Awesome Things to Do in Yokohama, Japan (2020 Guide)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/travel-tips-and-articles/77715"&gt;21 free things to do in Tokyo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tokyoweekender.com/2017/11/6-tokyo-travel-tips-to-help-you-get-around-the-city/"&gt;6 Tokyo Travel Tips to Help You Get Around the City | Tokyo Weekender&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;7 day Japan Rail pass (first class?), possibly only sold outside Japan.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://publishizer.com/8020-japanese/"&gt;80/20 Japanese by Richard Webb - Publishizer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://luckypeach.com/a-guide-to-the-regional-ramen-of-japan/"&gt;A Guide to the regional ramen of Japan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://smallseasons.guide/"&gt;A guide to understanding &amp;quot;Small Seasons&amp;quot;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ignition.co/398"&gt;A Moss Girl’s Guide to Japanese Moss Viewing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/japan/travel-tips-and-articles/77501"&gt;A no-sushi guide to food in Japan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.quora.com/How-does-it-feel-to-travel-alone#__w2_kxAuQyJ_answer_content"&gt;A trip to Japan (Quora answer)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.annees-de-pelerinage.com/tawaraya-ryokan-review-best-hotel-in-the-world/"&gt;An unsponsored review of the Tawaraya Ryokan in Kyoto, Japan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.insidekyoto.com/arashiyama-bamboo-grove"&gt;Arashiyama Bamboo Grove&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jnto.org.au/autumn-leaves-in-hokkaido/"&gt;Autumn Leaves in Hokkaido&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bbc.com/travel/story/20181009-japans-special-take-on-a-packed-lunch"&gt;BBC - Travel - Japan’s special take on a packed lunch&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tofugu.com/japan/bushido/"&gt;Bushido: Way of Total Bullshit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/japanlife/comments/1i2ikgo/cool_japan_what_are_things_about_japan_that_you/"&gt;COOL JAPAN(?)&amp;quot; - What are things about Japan that you think are actually cool?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Drinking-Japan-Alcoholic-Beverages-Establishments/dp/4805310545"&gt;Drinking Japan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://japan.elifessler.com/eki-stamps/"&gt;Eki-stamps / 駅スタンプ | eli's japan blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.independent.co.uk/travel/asia/five-best-japanese-ryokan-406127.html"&gt;Five Best: Japanese Ryokan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fuji Q Highland (rollercoaster theme park). Check out haunted hospital.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.city.furano.hokkaido.jp/"&gt;Furano, Hokaido&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubyronin.com/going-to-kyushu-japan-why-visiting-yakushima-is-worth-it/"&gt;Going to Kyushu, Japan? Why Visiting Yakushima is Worth it - The Ruby Ronin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Guest houses: &lt;a href="http://kazari-ya.com/index-e.html"&gt;Kazariya&lt;/a&gt;, &lt;a href="http://rakuza.gh-project.com/e/home.html"&gt;Rakuza&lt;/a&gt;, &lt;a href="http://ja-jp.facebook.com/musubian.kyoto"&gt;Musubian&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hiiragiya.co.jp/"&gt;Hiiragiya ryokan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Himeji_Castle"&gt;Himeji Castle&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Hiroshima oysters (try the one with cheese).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Historic_Villages_of_Shirakawa-g%C5%8D_and_Gokayama"&gt;Historic Villages of Shirakawa-gō and Gokayama - Wikipedia&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Hokkaido summer flowers.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hyperdia.com/en/"&gt;Hypermedia (internal travel website)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jalan.net/en/japan_hotels_ryokan/?cc%3Deng_banner"&gt;jalan.net (travel booking site)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.japan-guide.com"&gt;Japan guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jpninfo.com/"&gt;Japan Info&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thisisinsider.com/japan-program-free-abandoned-homes-2018-11"&gt;Japan is launching a program that will give away abandoned homes - INSIDER&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.japan-guide.com/e/e2361.html"&gt;Japan Rail Pass&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mext.go.jp/english/highered/1303739.htm"&gt;Japan Study Program&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.co.uk/JAPAN-TRAVEL-15DAYS-3-5GB-SIM/dp/B01J0Q8132"&gt;JAPAN TRAVEL DATA 15DAYS, 3.5GB on 4G/LTE- NANO SIM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.japantimes.co.jp/news/2017/12/26/national/japans-glut-abandoned-homes-hard-sell-bargains-opportunity-knocks/"&gt;Japan's glut of abandoned homes: Hard to sell but bargains when opportunity knocks (The Japan Times)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/travel-tips-and-articles/the-other-japan-okinawas-secret-beaches"&gt;Japanese beaches&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gurunavi.com/"&gt;Japanese Foods Encounter Like No Others (food search)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://japaneseruleof7.com/"&gt;Japanese rule of 7&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nippon.com/en/features/h00124/"&gt;Japan’s 72 Microseasons&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.japanonwheels.com/kawachi_fujien.html"&gt;Kawachi Fujien 河内藤園 (Kawachi Wisteria Garden)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.japanese-incense.com/kodo-censer.htm"&gt;Kodo – Preparing the Censor&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cromwell-intl.com/travel/japan/koyasan/kongo-sanmai-in.html"&gt;Kongō Sanmai-in at Kōya-san&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=13136252"&gt;Koya Bound – Eight Days on the Kumano Kodo | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eng.shukubo.net/"&gt;Koyasan (needs booking)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://landedbook.com/landed-japan/"&gt;Landed Japan Book (local knowledge to buy Japanese real estate)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.japan-guide.com/e/e3912.html"&gt;Lots of goodies. Bamboo forest, oh my&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blackshipcoffee.com/cafe/"&gt;Michael’s Cafe American – Black Ship Coffee&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://visit-miyajima-japan.com/en/"&gt;Miyajima: One of the top three scenic spots in Japan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.flickr.com/photos/26608745@N05/2845439357/"&gt;Monument in front of the Shin-Yatsushiro Station&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=Nagakushiyama+park%2C+Japan+&amp;amp;t=ffsb&amp;amp;iax=1&amp;amp;ia=images"&gt;Nagakushiyama park&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Nagoya"&gt;Nagoya&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Natadera Temple in winter.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.skijapan.com/resorts/niseko/"&gt;Niseko Ski Resort&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/japan/okinawa-and-the-southwest-islands/okinawa-honto/travel-tips-and-articles/the-other-japan-okinawas-secret-beaches"&gt;Okinawa: secrets for a long and happy life&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Okonomimura (all okonomiyaki restaurants).&lt;/li&gt;
&lt;li&gt;Onsen.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.quora.com/What-are-some-of-Japans-best-kept-secrets"&gt;Quora: What are some of Japans best kept secrets&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=geZWL_gE-Ak"&gt;Saitamaya: The Master of Grilled Meat - YouTube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.historynet.com/satsuma-rebellion-satsuma-clan-samurai-against-the-imperial-japanese-army.htm"&gt;Satsuma Rebellion: Satsuma Clan Samurai Against the Imperial Japanese Army&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/tokyo_gov/status/1146931698837291008"&gt;Shitamachi #Museum in Ueno and catch a glimpse into old-fashioned living&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Siege_of_Kumamoto_Castle"&gt;Siege of Kumamoto Castle (Wikipedia)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18442097"&gt;Snapshots of Tokyo’s vivid street life (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://marc.merlins.org/perso/japan2013/links.html"&gt;Table of Content for japan2013&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://marc.merlins.org/perso/japan2014/links.html"&gt;Table of Content for japan2014&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://marc.merlins.org/perso/japan2015/links.html"&gt;Table of Content for japan2015&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.4wd-networks.com/makers/detail/takazawa-candle.html"&gt;TAKAZAWA Candle (or look for ikaragata shape candle)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://visithachinohe.com/en/stories/the-2020-hachinohe-enburi-festival-schedule/"&gt;The 2020 Hachinohe Enburi Festival Schedule (Sakura festival)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jpninfo.com/13012"&gt;The village of living water&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-are-the-most-inconvenient-things-foreign-tourists-who-travel-to-Japan-experience"&gt;Things to look out for in Japan (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.japan-guide.com/list/e1102.html"&gt;Tohoku Travel Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Sukiyaki"&gt;Try out sukiyaki&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/document/d/1wjqJKYEKbHSUTsj8Lxj8OCn0gSOXOpf_SroyBEjLbKY/edit"&gt;Uncharted Tokyo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vitra.com/en-gb/magazine/details/the-hill-of-the-buddha"&gt;Vitra | The Hill of the Buddha&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mymodernmet.com/profiles/blogs/zao-fox-village-miyagi-japan"&gt;Zao Fox Village&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hekiunsou.jp/"&gt;国指定重要文化財「野村別邸　碧雲荘」&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Neighbourhoods
&lt;ul&gt;
&lt;li&gt;Mishuku&lt;/li&gt;
&lt;li&gt;Sancha neighborhood. Lots of places to eat.&lt;/li&gt;
&lt;li&gt;Sangenjaya&lt;/li&gt;
&lt;li&gt;Soba Noodle Kochi&lt;/li&gt;
&lt;li&gt;Seiki (Japanese dishes)&lt;/li&gt;
&lt;li&gt;Sent from my iPhone&lt;/li&gt;
&lt;li&gt;Sakae street&lt;/li&gt;
&lt;li&gt;Tokoshima (wine and yakitori)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 23 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/japan-travel-bookmarks</guid></item><item><title>Emacs key bindings and maps</title><link>https://xenodium.com/emacs-key-bindings-and-maps</link><description>&lt;h2&gt;based on &lt;a href="http://www.masteringemacs.org/article/mastering-key-bindings-emacs"&gt;masteringemacs.org&lt;/a&gt;.&lt;/h2&gt;
&lt;h2&gt;bonus tip&lt;/h2&gt;
&lt;p&gt;prefix key, followed by c-h, lists keys in prefix.&lt;/p&gt;
&lt;h2&gt;keymap&lt;/h2&gt;
&lt;p&gt;maps key to action.&lt;/p&gt;
&lt;h2&gt;keymap found in buffer and most major modes.&lt;/h2&gt;
&lt;h2&gt;keys&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;undefined: self explanatory.&lt;/li&gt;
&lt;li&gt;prefix key: ie. c-x (part of complete key).&lt;/li&gt;
&lt;li&gt;complete key: complete input executes associated command.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;mapping&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;(define-key keymap key def): add to current buffer map.&lt;/li&gt;
&lt;li&gt;(local-set-key key command): add to active buffer (no map option).&lt;/li&gt;
&lt;li&gt;(local-unset-key key)&lt;/li&gt;
&lt;li&gt;(global-set-key key command): add to global keymap (all buffers).&lt;/li&gt;
&lt;li&gt;(global-unset-key key)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;key codes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;kbd: macro transaltes human-readable key to emacs readable.&lt;/li&gt;
&lt;li&gt;function and navigation keys must be surrounded by &amp;lt;&amp;gt;.&lt;/li&gt;
&lt;li&gt;example: (kbd &amp;quot;c-c p&amp;quot;) or (kbd &amp;quot;&amp;lt;f8&amp;gt;&amp;quot;) of (kbd &amp;quot;&amp;lt;down&amp;gt;&amp;quot;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;remapping&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;use remap to replace mapping (ie. kill-line with my/kill-line).&lt;/li&gt;
&lt;li&gt;(define-key keymap [remap original-function] 'my-own-function).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;reserved keys&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;c-c ?&amp;quot; generally reserved for you, but third party packages use it.&lt;/li&gt;
&lt;li&gt;function keys (ie. f1-f12).&lt;/li&gt;
&lt;li&gt;hyper and super (ancient).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;lookup order&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;in a nutshell: minor mode keys, local keys, global keys.&lt;/li&gt;
&lt;li&gt;full order:
&lt;ol&gt;
&lt;li&gt;overriding-terminal-local-map: terminal-specific key binds.&lt;/li&gt;
&lt;li&gt;overriding-local-map: override all other local keymaps (avoid if possible).&lt;/li&gt;
&lt;li&gt;char property at point: useful for yasnippet.&lt;/li&gt;
&lt;li&gt;emulation-mode-map-alists: advanced multi-mode keymap.&lt;/li&gt;
&lt;li&gt;minor-mode-overriding-map-alist: minor modes in major modes.&lt;/li&gt;
&lt;li&gt;minor-mode-map-alist: as previous (preferred for minor modes) &amp;lt;—–&lt;/li&gt;
&lt;li&gt;current-local-map: buffers current local map.&lt;/li&gt;
&lt;li&gt;current-global-map: last place to look (ie. global).&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;mode hooks&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;(local-set-key (kbd &amp;quot;c-c q&amp;quot;) 'my-awesome-method)) in hook-method.&lt;/li&gt;
&lt;li&gt;for key-chord-define, use current-local-map.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 23 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-key-bindings-and-maps</guid></item><item><title>Matlab and Audio Files</title><link>https://bastibe.de/2015-04-22-matlab-and-audio-files.html</link><description>&lt;p&gt;So I wanted to work with audio files in Matlab. In the past, Matlab could only do this with &lt;code&gt;auread&lt;/code&gt; and &lt;code&gt;wavread&lt;/code&gt;, which can read &lt;em&gt;*.au&lt;/em&gt; and &lt;em&gt;*.wav&lt;/em&gt; files. With 2012b, Matlab introduced &lt;a href="http://mathworks.com/help/matlab/ref/audioread.html"&gt;&lt;code&gt;audioread&lt;/code&gt;&lt;/a&gt;, which claims to support &lt;em&gt;*.wav&lt;/em&gt;, &lt;em&gt;*.ogg&lt;/em&gt;, &lt;em&gt;*.flac&lt;/em&gt;, &lt;em&gt;*.au&lt;/em&gt;, &lt;em&gt;*.mp3&lt;/em&gt;, and &lt;em&gt;*.mp4&lt;/em&gt;, and simultaneously deprecated &lt;code&gt;auread&lt;/code&gt; and &lt;code&gt;wavread&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Of these file formats, only &lt;em&gt;*.au&lt;/em&gt; is capable of storing more than 4 Gb of audio data. But the documentation is actually wrong: &lt;code&gt;audioread&lt;/code&gt; can &lt;em&gt;actually&lt;/em&gt; read more data formats than documented: it reads &lt;em&gt;*.w64&lt;/em&gt;, &lt;em&gt;*.rf64&lt;/em&gt;, and &lt;em&gt;*.caf&lt;/em&gt; no problem. And these can store more than 4 Gb as well.&lt;/p&gt;
&lt;p&gt;It's just that, while &lt;code&gt;audioread&lt;/code&gt; supports all of these nice file formats, &lt;a href="http://mathworks.com/help/matlab/ref/audiowrite.html"&gt;&lt;code&gt;audiowrite&lt;/code&gt;&lt;/a&gt; is more limited, and only supports &lt;em&gt;*.wav&lt;/em&gt;, &lt;em&gt;*.ogg&lt;/em&gt;, &lt;em&gt;*.flac&lt;/em&gt;, and &lt;em&gt;*.mp4&lt;/em&gt;. And it does not support any undocumented formats, either. So it seems that there is no way of writing files larger than 4 Gb. But for the time being, &lt;code&gt;auwrite&lt;/code&gt; is still available, even though deprecated. I tried it, though, and it didn't finish writing 4.8 Gb in half an hour.&lt;/p&gt;
&lt;p&gt;In other words, Matlab is incapable of writing audio files larger than 4 Gb. It just can't do it.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Wed, 22 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2015-04-22-matlab-and-audio-files.html</guid></item><item><title>My weekend with Elm</title><link>https://gilmi.me/post/2015/04/21/weekend-with-elm</link><description>&lt;p&gt;&lt;a href="http://ludumdare.com/compo/"&gt;Ludum Dare&lt;/a&gt; is an online game jam competition/event that takes place every 4 months.
Each competition starts when it's theme is announced and each participant has 48/72 hours
for compo/jam entry respectively to complete and publish a game based on the theme.&lt;/p&gt;&lt;p&gt;This weekend &lt;a href="http://ludumdare.com/compo/ludum-dare-32/?action=preview"&gt;LD32&lt;/a&gt; took place, and I decided to participate while using &lt;a href="http://elm-lang.org/"&gt;Elm&lt;/a&gt; to build my game - &lt;a href="http://ludumdare.com/compo/ludum-dare-32/?action=preview&amp;amp;uid=29243"&gt;Banana Bandit&lt;/a&gt; (source on &lt;a href="https://github.com/soupi/ld32"&gt;github&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Edit: &lt;a href="http://www.gilmi.xyz/static/misc/gamejams/ld32/Game/dist/update.html"&gt;post-jam updates&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Since I didn't have a lot of Elm experience (I wrote at most 100 LOC in it) prior to jam,
I decided that my goal is to learn Elm, FRP and a new way to model games on the fly, during the jam,
and gain real experience working with it,
while somewhat sacrificing the quality of the end result (the game).&lt;/p&gt;&lt;p&gt;In this post I will try and describe my reflection of the weekend, what went wrong, what went well,
and what could have been done better.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;Starting the work was pretty easy, I was able to install Elm-platform pretty easily,&lt;/p&gt;&lt;ul&gt;&lt;li&gt;There are &lt;a href="http://elm-lang.org/Examples.elm"&gt;many examples&lt;/a&gt; on the main Elm website that can be run and changes online&lt;/li&gt;&lt;li&gt;There is an &lt;a href="https://github.com/evancz/elm-architecture-tutorial#the-elm-architecture"&gt;Elm architecture tutorial&lt;/a&gt; that explains how to start modeling applications in Elm&lt;/li&gt;&lt;li&gt;There is a &lt;a href="https://github.com/elm-lang/elm-lang.org/blob/258181d16df10d7b51721f1f5005baca03c8b7e7/frontend/public/examples/Intermediate/GameSkeleton.elm"&gt;Game Skeleton&lt;/a&gt; which I used as a template&lt;/li&gt;&lt;li&gt;Elm compiles to JavaScript, means it will work on the web - a huge win for LD in my opinion&lt;/li&gt;&lt;li&gt;There is a vim syntax-highlighting plugin&lt;/li&gt;&lt;li&gt;elm-reactor saves the trouble of compiling and running every time&lt;/li&gt;&lt;li&gt;I was able to start modeling and look at the changes to the model over time without drawing anything&lt;/li&gt;&lt;li&gt;Graphics were &lt;i&gt;really&lt;/i&gt; easy to add, change and replace. From simple rectangle place holders to images and animations.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Problem is, since I started from scratch, I had to implement all the elements and logic of a game,
game objects with position, velocity, state, actions, movement logic with acceleration and deceleration,
collision detection, timers, interactions and so on. All those features that comes today with every
game engine were very time consuming and were proving tricky to implement. Which is why such things
need to be done prior to a jam. But I learned a lot implementing all of this things.&lt;/p&gt;&lt;h3 id="a-lot-bugs-related-to-logic-and-arithmetics-mistakes-started-to-appear-and-were-very-time-consuming-to-identify-and-fix:"&gt;A lot bugs related to logic and arithmetics mistakes started to appear, and were very time consuming to identify and fix:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Timers changed too quickly because I was accidentally working with milliseconds instead of seconds&lt;/li&gt;&lt;li&gt;Movement and acceleration did bizarre things due to incorrect calculations&lt;/li&gt;&lt;li&gt;AI bugs due to calculation mistakes&lt;/li&gt;&lt;li&gt;Collision problems&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/soupi/ld32/blob/c1c6fbb591dc27620935ce7216b7e3c6a9776141/src/Game/Game.elm#L86"&gt;Infinite recursion&lt;/a&gt; by accident that stuck the game&lt;/li&gt;&lt;li&gt;Maze generator logic bugs&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And more.&lt;/p&gt;&lt;p&gt;Elm-reactor proved valuable in some of these bugs. Being able to watch values changing over time,
stop and rewind really helped tackle some of these bugs. If I could also look at the code at certain points when pausing
it would have been even better.
Some mistakes were probably due to sloppiness on my part, the old &amp;quot;if it type checks, it works&amp;quot; saying at the back of my head
might have made me less careful on my variable naming and such. Maybe that infinite recursion could have been avoided.&lt;/p&gt;&lt;p&gt;Second set of problems: working with Elm was not without problems.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Only syntax highlighting plugin for Vim was available. I needed to run the game through elm-reactor to see parsing/typing/etc bugs.&lt;/li&gt;&lt;li&gt;At times Elm felt still an immature platform to work on. Many parsing bugs were cryptic, not so informative and were sometimes not placed close to the actual error.&lt;/li&gt;&lt;li&gt;I was not able to hot-swap, restart, or unpaused with Elm-reactor.&lt;/li&gt;&lt;li&gt;There was a &lt;a href="https://github.com/soupi/ld32/tree/80b80e76124691639a99af23dad4c84b49479d09"&gt;problem&lt;/a&gt; that when trying to compile, elm-make would just throw an &amp;quot;out of memory&amp;quot; error. I really don't know how I solved that&lt;/li&gt;&lt;li&gt;Elm 0.15 was announced a few hours before I finished and a package I used no longer appeared on &lt;a href="http://package.elm-lang.org"&gt;package.elm-lang.org&lt;/a&gt; so I had to look at the code for documentation.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id="things-i-didn39t-have-enough-time-to-do:"&gt;Things I didn't have enough time to do:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Animations&lt;/li&gt;&lt;li&gt;Integrating audio (I could no longer find the &lt;a href="https://github.com/jcollard/elm-audio"&gt;elm-audio&lt;/a&gt; package on package.elm-lang.org after the announcement to 0.15) though I recorded some music and sfx.&lt;/li&gt;&lt;li&gt;Fixing the maze generator -&amp;gt; many levels&lt;/li&gt;&lt;li&gt;Score, lives and such&lt;/li&gt;&lt;li&gt;Screens&lt;/li&gt;&lt;/ul&gt;&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;&lt;p&gt;I had fun, I learned a lot, and I was really happy to finally use functional programming for games.
Even though I got stuck a lot of times, have had to chase and solve many bugs due to faulty logic
and didn't &lt;b&gt;really&lt;/b&gt; finish the game, It was a very eye-opening experience and I felt like I gained a lot from it.&lt;/p&gt;&lt;p&gt;Elm is still a little rough around the edges and so it is not so easy to work with, at the moment,
during a 72 hour game jam, from scratch, with minimal prior knowledge on it,
But it is also very young. I have a feeling that if it keeps in that direction - work hard on better tools like elm-reactor,
work on the eco-system and packages, fix bugs and such, for another 3 years, it will become
an incredible programming language and system to work with.&lt;/p&gt;&lt;p&gt;The next time I participate on Ludum Dare, it will most likely be with Elm. This time with better understanding of it
and hopefully, a much better result :)&lt;/p&gt;&lt;p&gt;Thanks for reading!&lt;/p&gt;</description><author>λm.me</author><pubDate>Tue, 21 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://gilmi.me/post/2015/04/21/weekend-with-elm</guid></item><item><title>I Have Never…</title><link>https://huphtur.nl/i-have-never/</link><description>&lt;ul&gt;
&lt;li&gt;Done drugs&lt;/li&gt;
&lt;li&gt;Drank coffee&lt;/li&gt;
&lt;li&gt;Worn a scarf&lt;/li&gt;
&lt;li&gt;Been camping&lt;/li&gt;
&lt;li&gt;Watched &lt;a href="http://imgur.com/wGEEiCK"&gt;Titanic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Smoked cigarettes&lt;/li&gt;
&lt;li&gt;Listened to a Drake song (voluntarily)&lt;/li&gt;
&lt;li&gt;Believed in a higher power (besides my &lt;a href="https://www.strava.com/athletes/1157"&gt;watts&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…and most likely never will.&lt;/p&gt;</description><author>huphtur</author><pubDate>Tue, 21 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://huphtur.nl/i-have-never/</guid></item><item><title>Silicon Valley: Season 2</title><link>https://olshansky.info/tv/silicon_valley_season_2/</link><description>Olshansky's review of Silicon Valley: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 20 Apr 2015 16:09:33 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/silicon_valley_season_2/</guid></item><item><title>Game of Thrones: Season 5</title><link>https://olshansky.info/tv/game_of_thrones_season_5/</link><description>Olshansky's review of Game of Thrones: Season 5</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 20 Apr 2015 16:01:29 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/game_of_thrones_season_5/</guid></item><item><title>Docker containers in Oh-My-Vagrant</title><link>https://purpleidea.com/blog/2015/04/20/docker-containers-in-oh-my-vagrant/</link><description>&lt;p&gt;The &lt;a href="https://github.com/purpleidea/oh-my-vagrant"&gt;Oh-My-Vagrant&lt;/a&gt; (omv) project is an easy way to bootstrap a development environment. It is particularly useful for spinning up an arbitrary number of virtual machines in Vagrant without writing ruby code. For multi-machine container development, &lt;em&gt;omv&lt;/em&gt; can be used to help this happen more naturally.&lt;/p&gt;
&lt;p&gt;Oh-My-Vagrant can be very useful as a docker application development environment. I&amp;rsquo;ve made a quick (&amp;lt;9min) screencast demoing this topic. Please have a look:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dl.fedoraproject.org/pub/alt/purpleidea/screencasts/oh-my-vagrant-docker-screencast.ogv"&gt;&lt;a href="https://dl.fedoraproject.org/pub/alt/purpleidea/screencasts/oh-my-vagrant-docker-screencast.ogv"&gt;https://dl.fedoraproject.org/pub/alt/purpleidea/screencasts/oh-my-vagrant-docker-screencast.ogv&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 20 Apr 2015 07:35:43 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/04/20/docker-containers-in-oh-my-vagrant/</guid></item><item><title>F# Vs C#</title><link>https://nicolaiarocci.com/f-vs-c/</link><description>&lt;p&gt;I have another guest post up at the official MSDN Team Blog. Titled &lt;a href="http://blogs.msdn.com/b/italy/archive/2015/04/17/f-vs-c.aspx"&gt;F# Versus C#&lt;/a&gt;, it is an attempt at a gentle introduction to F# for the Italian C# developer.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 20 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/f-vs-c/</guid></item><item><title>Of type lists and type switches</title><link>https://bastian.rieck.me/blog/2015/type_lists_and_switches/</link><description>&lt;p&gt;Every C++ programmer sooner or later happens to stumble over template meta-programming. I was no
exception. And suddenly, the old adage applied to me as well: &amp;quot;If all you have is a hammer,
everything starts to look like a nail&amp;quot;&lt;/p&gt;
&lt;p&gt;A very useful technique from template meta-programming is the concept of &lt;em&gt;type lists&lt;/em&gt;. Briefly put,
a type list is a list that contains &lt;em&gt;types&lt;/em&gt; instead of values. It is thus defined at compile-time
already. When might this be useful? In itself, probably never. Except for showing off. But in my
opinion, the real utility of type lists unfolds when they are coupled with &lt;em&gt;type switches&lt;/em&gt;. A type
switch is another—you guessed it—concept from meta-programming. Given a type list, a
type switch offers a way for calling a functor with a given type from the type list. The whole point
is that the type switch permits the selection of a functor &lt;em&gt;at runtime&lt;/em&gt;! Hold on to your hats,
gentlefolks! This means I can essentially write something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;IntegerTypes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Functor&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;TypeSwitch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IntegerTypes&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cin&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The snippet above does not compile yet, but we&amp;rsquo;ll get there! You can see that we have deferred the
decision about which type to use in the functor call. We let a &lt;em&gt;user input&lt;/em&gt; at &lt;em&gt;runtime&lt;/em&gt; decide
about the type. Even though we are using templates. When I first learned about this, it seemed
like magic to me. As we all know, any sufficiently analysed magic is indistinguishable from science,
though. So, let&amp;rsquo;s try to get there. Throughout this post, I will include some snippets from real
code. &lt;a href="https://github.com/Pseudomanifold/TypeSwitch"&gt;You can get the complete project on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="type-list"&gt;Type list&lt;/h1&gt;
&lt;p&gt;There are many ways for designing a type list. I chose a very easy one by limiting my type list to
10 types, which spared me from having to define it recursively. Andrei Alexandrescu has a &lt;a href="http://www.drdobbs.com/generic-programmingtypelists-and-applica/184403813"&gt;great
article about recursively-defined type lists and their
applications&lt;/a&gt;. We start
out differently, by defining a generic base case first:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;EmptyType&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T6&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T7&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T9&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EmptyType&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;TypeList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So far, nothing wild is going on. We have an &lt;em&gt;empty type&lt;/em&gt; and a template declaration. We shall now
use &lt;em&gt;template specialization&lt;/em&gt; to refine the type list:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;TypeList&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;T0&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;T9&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;enum&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is also not very spectacular. We have a &lt;code&gt;typedef&lt;/code&gt; for the head and a reduced type for the tail
of the list. We also define a recursive &lt;code&gt;enum&lt;/code&gt;. This is allowed because &lt;code&gt;tail&lt;/code&gt; refers to a type that
is known at compile-time. We are not finished, though. We still need to define a base case, namely
that of the &lt;em&gt;fully empty&lt;/em&gt; type list:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;TypeList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;enum&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And there we have it! A simple type list that is utterly useless. Well, we can at least query its
size:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;IntegerTypes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;IntegerTypes&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This should yield an output of &lt;code&gt;4&lt;/code&gt;. We can capture this in a nice struct:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;TypeListLength&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;enum&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This permits us to write &lt;code&gt;TypeListLength&amp;lt;IntegerTypes&amp;gt;::value&lt;/code&gt;, making the intent somewhat clearer.
Also, it makes writing an access struct easier.&lt;/p&gt;
&lt;h1 id="accessing-a-type-from-a-type-list"&gt;Accessing a type from a type list&lt;/h1&gt;
&lt;p&gt;A useful operation for the type list would be an access functor. Given an index, we should be able
to query the time at that index. If the index is out of range, we refuse to compile. That&amp;rsquo;s at
least one good thing about templates—we catch problems early with very confusing compiler
output. Let&amp;rsquo;s start with an access functor then:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;Index&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Step&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;OutOfRange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;TypeListLength&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;TypeListGet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;TypeListGet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Step&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is only the general case. We have an &lt;code&gt;Index&lt;/code&gt; attribute that refers to the desired index in the
type list by the client, and some &amp;quot;internal&amp;quot; attributes for keeping track of where we are
in the type list.&lt;/p&gt;
&lt;p&gt;Now let&amp;rsquo;s handle the specialization. The first one is easy. If we have reached the end of the type
list, we define the struct to be empty. This will result in a compile-time error when a client aims
to access an incorrect index:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Step&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;TypeListGet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Step&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Stop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="c1"&gt;// This is empty by design.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The other specialization is straightforward as well. In case &lt;code&gt;Index&lt;/code&gt; and &lt;code&gt;Step&lt;/code&gt; coincide, the &lt;code&gt;Stop&lt;/code&gt;
attribute is set to &lt;code&gt;true&lt;/code&gt;. This means we have found our desired type and it is at the very
beginning of the type list. Hence:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Step&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;OutOfRange&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;TypeListGet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Step&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;OutOfRange&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now our demo program may become slightly more involved:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"type_list.hh"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;typeinfo&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;IntegerTypeList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;IntegerTypeList&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"The type list has a length of "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;TypeListLength&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IntegerTypeList&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"The first type is "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;typeid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;TypeListGet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IntegerTypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"The second type is "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;typeid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;TypeListGet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IntegerTypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"The third type is "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;typeid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;TypeListGet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IntegerTypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"The fourth type is "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;typeid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;TypeListGet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IntegerTypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output should read like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The type list has a length of 4
The first type is c
The second type is s
The third type is i
The fourth type is l
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Still not terribly useful, but somewhat cool, I guess.&lt;/p&gt;
&lt;h1 id="the-type-switch"&gt;The type switch&lt;/h1&gt;
&lt;p&gt;Now let&amp;rsquo;s add the magic. Given a functor that provides a templated &lt;code&gt;operator()()&lt;/code&gt;, we want to call
it with a type that is selected &lt;em&gt;at runtime&lt;/em&gt; using an index. The generalized case is very ugly here
because we do not know the return type of the functor beforehand. Lucky for us, C++11 offers the
&lt;code&gt;decltype&lt;/code&gt; specifier:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Stop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;Index&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;TypeListLength&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;TypeSwitch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Functor&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;decltype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;Functor&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;TypeListGet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Index&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;()(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Functor&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Index&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;TypeListGet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Index&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;TypeSwitch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;()(&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;decltype&lt;/code&gt; ensures that we get the proper return type of the functor for the current type at the
requested index of the type list. If we have not found the proper index yet, we create a new type
switch (with adjusted index) and recurse.&lt;/p&gt;
&lt;p&gt;Now the only thing that is left to handle is the when the index goes out of bounds. Here, we can use
a specialization with a fixed value for the &lt;code&gt;Stop&lt;/code&gt; attribute. Recall that it is set when the index
is equal to the length of the type list, i.e. upon encountering the first invalid index.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;TypeSwitch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Functor&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;decltype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;Functor&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EmptyType&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;()(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="cm"&gt;/* i */&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Functor&lt;/span&gt; &lt;span class="cm"&gt;/* f */&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;runtime_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s"&gt;"Index is out of range"&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And that&amp;rsquo;s it. We may now use such cool constructions as the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"type_list.hh"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"type_switch.hh"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;typeinfo&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Functor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;()()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Called with the following type: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;typeid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;TypeList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;MyTypes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Functor&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;TypeSwitch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyTypes&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;TypeListLength&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyTypes&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;try&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;runtime_error&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cerr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Oops, this type does not exist: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;what&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This results in the following output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Called with the following type: c
Called with the following type: b
Oops, this type does not exist: Index is out of range
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;OK, maybe the program is not completely useful. In general, type switches can be very useful,
though. I have used it in the past to loop over pre-defined types for volume data. The functor in
this case simply checked whether it was possible to load volume data of a fixed size with a given
type. If so, we knew that we had identified the right type. The advantage of this approach is that
it naturally scales with the number of types we define. We do not have to resort to ugly
&lt;code&gt;dynamic_cast&lt;/code&gt; constructions or something like that.&lt;/p&gt;
&lt;p&gt;If you want to learn more, I can only recommend the books by Andrei Alexandrescu. If you are a bit
like me, please also take JWZ&amp;rsquo;s law into account:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some people, when confronted with a problem, think &amp;quot;I know, I&amp;rsquo;ll use &lt;strike&gt;regular
expressions&lt;/strike&gt; template meta-programming.&amp;quot; Now they have two problems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Enjoy your templates!&lt;/p&gt;
&lt;h1 id="i-want-the-code"&gt;I want the code&lt;/h1&gt;
&lt;p&gt;Sure, you can have it. &lt;a href="https://github.com/Pseudomanifold/TypeSwitch"&gt;It&amp;rsquo;s on GitHub&lt;/a&gt; and licensed
under an MIT license.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 19 Apr 2015 16:03:24 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/type_lists_and_switches/</guid></item><item><title>Tokyo travel bookmarks</title><link>https://xenodium.com/tokyo-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://roadsandkingdoms.com/travel-guide/tokyo/know-before-you-go-to-tokyo/"&gt;14 Things to Know Before You Go to Tokyo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://globalhelpswap.com/5-alternative-things-to-do-in-tokyo/"&gt;5 alternative things to do in Tokyo (by globalhelpswap)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://roadsandkingdoms.com/travel-guide/tokyo/a-history-of-tokyo-in-8-dishes/"&gt;A History of Tokyo in 8 Dishes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Akasaka area (N/E of Roppongi).&lt;/li&gt;
&lt;li&gt;Akasaka Sagamiya (also Mamekan, established in 1895).&lt;/li&gt;
&lt;li&gt;Akihabara: Electronics district, arcades and comic stores.&lt;/li&gt;
&lt;li&gt;Asakusa (tourist spot). Kaminarimon, Nakamise (oldest shopping street in Japan). Sensoji Temple.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hokke.co.jp/english/asakusa/"&gt;Asakusa hotel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Asakusa Shrine: Shinto shrine and market.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bar-navi.suntory.co.jp/shop/0334413588/index.html"&gt;Bar Epilogue&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://authenticbar.com/odin/yebisu.html"&gt;Bar Odin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tripadvisor.co.uk/Restaurant_Review-g1066461-d1688630-Reviews-Benten-Taito_Tokyo_Tokyo_Prefecture_Kanto.html"&gt;Benten, Taito - 3-21-8 Asakusa, Ueno, Asakusa (Buckwheat noodles shop)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Bentomi (Sushi).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cheese-stand.com/"&gt;CHEESE STAND （チーズスタンド）&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Coffee Tengoku, Asakusa (best hotcakes/pancakes). Noting is premade. After 12 years, best hotcakes.&lt;/li&gt;
&lt;li&gt;Cup noodle museum.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tabelog.com/en/tokyo/A1313/A131301/13002389/"&gt;Daiwasushi (food)&lt;/a&gt;. An account &lt;a href="http://mjkobb.com/Prattling%20on/6570A66F-8F2F-49FD-912C-4A5D0C3862C8.html"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Dorayaki (in Ukenbukuru). Seijuken is long established in Ningyocho.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dairycream.blogspot.co.uk/2016/07/doteno-iseya-127-year-old-tempura-don.html"&gt;Doteno-Iseya 土手の伊勢屋: 127-year old Tempura&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Eateries around Takadanobaba eki&lt;/li&gt;
&lt;li&gt;Ebisu (area for izakaya experience, drink/chat with bartender). Look for Ebisu Yokocho.&lt;/li&gt;
&lt;li&gt;Fish market (6am sushi).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.rocketnews24.com/2017/10/11/five-of-the-worst-areas-to-live-in-and-around-tokyo/?utm_content=buffer38deb&amp;amp;utm_medium=social&amp;amp;utm_source=twitter.com&amp;amp;utm_campaign=buffer"&gt;Five of the worst areas to live in and around Tokyo | SoraNews24&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tokyoeats.jp/fuunji/"&gt;Fu-unji &amp;amp; 風雲児 | Tokyo Eats&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ghibli-museum.jp/en/welcome"&gt;Ghibli museum&lt;/a&gt; (book in advance or try &lt;a href="http://www.lawson.co.jp/ghibli/museum/ticket/english.html"&gt;lawson&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Ginza Kimuraya (bakery). Try anpan (invented here).&lt;/li&gt;
&lt;li&gt;Ginza.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tabelog.com/en/tokyo/A1301/A130103/13002611/"&gt;Ginzakyuubee (food)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://unmissabletokyo.com/golden-gai"&gt;Golden Gai (lots tiny bars)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.govoyagin.com/tokyo-christmas"&gt;How to Spend a Magical Christmas in Tokyo (2019 update)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.timeout.com/tokyo/restaurants/tokyo-coolest-kakigori"&gt;https://www.timeout.com/tokyo/restaurants/tokyo-coolest-kakigori&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ichiran Ramen.&lt;/li&gt;
&lt;li&gt;Imperial Palace: Book to go inside. Beautiful park, great for pictures.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/Tokyo/comments/1dnwpwr/in_which_ward_are_you_living"&gt;In which ward are you living?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Irie known (sweet shop) for Mamekan. In Monzen-Nakacho.&lt;/li&gt;
&lt;li&gt;Isetan (upscale food market).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tabelog.com/en/tokyo/A1313/A131301/13091991/"&gt;Isozushi (food)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://trulytokyo.com/jimbocho-book-town/"&gt;Jimbocho Book Town (largest second-hand book town in the world, classic-style cafes, old school charm)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Kaiden-don, near tsukiji (Sushi).&lt;/li&gt;
&lt;li&gt;Kajitsuen Libre. Peach Parfait. Fresh fruit.&lt;/li&gt;
&lt;li&gt;Kinozen restaurant for Matcha Bavarian cream (matcha bavaroa). Kagurazaka. Check out the backstreets.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.waentei-kikko.com/"&gt;Kodai's Fukui restaurant (old tea house)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Kushikatsu restaurant in Golden Gai, a karaoke booth in Ebisu, or drifting through the back alley izakayas of Akabane.&lt;/li&gt;
&lt;li&gt;Menya Musashi and Fuunji are both generally very well regarded and about a 5-7 minute walk from the SW part of Shinjuku station.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://openbuildings.com/buildings/mikimoto-ginza-2-profile-2818"&gt;Mikimoto building in Ginza&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mori.art.museum/eng/index.html"&gt;Mori Art museum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.co.uk/webhp?sourceid=chrome-instant&amp;amp;ion=1&amp;amp;espv=2&amp;amp;ie=UTF-8#q=musashiya+tripadvisor+tokyo"&gt;Musashiya ramen&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tokyocheapo.com/food-and-drink/michelin-star-ramen-nakiryu/"&gt;Nakiryu: Tantalizing Tantanmen Noodles with a Michelin Star&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Nezu_Museum"&gt;Nezu museum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gotokyo.org/en/destinations/southern-tokyo/odaiba/index.html"&gt;Odaiba&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tokyoplaying.blogspot.co.uk/2012/01/not-japanese-pizza-okonomiyaki-in.html"&gt;Okonomiyaki in Tokyo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Omoide yokocho: Alleyway next to Shinjuku station. Lots of yakitori restaurants.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ooo-koffee.com/"&gt;Omotesando Koffee&lt;/a&gt; (coffee and baked custard slice).&lt;/li&gt;
&lt;li&gt;Omotesando side streets.&lt;/li&gt;
&lt;li&gt;Pan No Tora Bakery (Kyoto?).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pignontokyo.jp/"&gt;Pignon | French Restaurant&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Pound cake from Patisserie Gondola in Kudanue.&lt;/li&gt;
&lt;li&gt;Roppongi.&lt;/li&gt;
&lt;li&gt;Savarin (brioge-based, of french origin) in Yokohama. Cafe Recherche.&lt;/li&gt;
&lt;li&gt;Seafood street south of Ueno eki&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.huckmag.com/art-and-culture/photography-2/tokyo-street-photographer-mikiko-hara/"&gt;Secret snapshots of Tokyo vivid street life&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://livejapan.com/en/in-shibamata_kita-senju_kameari/article-a0001571/"&gt;Shibamata: Snacking and Sightseeing in Tokyo’s Old Edo Neighborhood&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Shibuya Crossing: Largest pedestrian crossing in the world.&lt;/li&gt;
&lt;li&gt;Shimokitazawa (Shimokita for short). Bohemian, vintage shopping.&lt;/li&gt;
&lt;li&gt;Shimokitazawa (thirft stores, music bands, pubs, and cafes).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/Tokyo/comments/1dikh1q/short_trips_from_tokyo/"&gt;Short trips from Tokyo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/Tokyo/comments/1dikh1q/short_trips_from_tokyo"&gt;Short trips from Tokyo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tabelog.com/en/tokyo/A1301/A130101/13002260/"&gt;Sukiyabashi Jiro&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Sushi dai (Sushi, long queue, maybe turisty).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tabelog.com/en/tokyo/A1301/A130103/13005003/"&gt;Sushi Kanesaka&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Sushi places around Tsukiji market in the morning (much better than the market visit itself, these days)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tabelog.com/en/tokyo/A1308/A130802/13015251/"&gt;Sushi Saito&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tabelog.com/en/tokyo/A1313/A131301/13002388/"&gt;Sushidai (food)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tabelog.com/en/tokyo/A1307/A130701/13061640/"&gt;Sushitsu (food)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tabelog.com/en/tokyo/A1316/A131603/13013967/"&gt;Sutekihausukatsura&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.japan-guide.com/e/e3029.html"&gt;Takaosan (Mount Takao)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.minube.com/rincon/restaurante-tsunahachi-a186891"&gt;Tempura Tsunahachi en Tokio: 4 opiniones y 7 fotos&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tabelog.com/en/tokyo/A1303/A130301/13001783/"&gt;Tenkazushi (food)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The whole of Kabukicho (area in-between Shinjuku station and Shin-Okubo)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ytravelblog.com/things-to-do-in-tokyo-japan/"&gt;Things to Do in Tokyo Japan - Sunday Spotlight&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/tokyo_gov/status/1201652265649606656"&gt;Tokyo Gov on Twitter: Higashikurume Station&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/japan/travel-tips-and-articles/tokyo-in-winter-what-to-see-do-and-eat/40625c8c-8a11-5710-a052-1479d276b0f5"&gt;Tokyo in winter: what to see, do and eat (Lonely Planet)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Tokyo Municipal Government building: Only for observation deck with view to Fuji (if clear day).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/japan/tokyo/travel-tips-and-articles/tokyo-on-a-budget-tips-for-making-your-yen-go-further/40625c8c-8a11-5710-a052-1479d2775214?utm_campaign=article&amp;amp;utm_medium=social&amp;amp;utm_source=twitter&amp;amp;utm_content=Tokyo%20on%20a%20budget:%20tips%20for%20making%20your%20yen%20go%20further"&gt;Tokyo on a budget: tips for making your yen go further (Lonely Planet)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tokyoplaying.blogspot.co.uk/"&gt;Tokyo play blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://japaneseruleof7.com/tokyo-salaries-all-you-need-to-know"&gt;Tokyo Salaries: all you need to know&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Tokyo station: Friendly JR office (english spoken). They help book all trips/tickets/reservations.&lt;/li&gt;
&lt;li&gt;Tokyo Station: Massive station. Lots of restaurants and shops (check out ramen street).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://coffeeandpassport.com/tokyo-travel-tips/"&gt;Tokyo Travel Tips: 5 Things You Need In Japan | Coffee and Passport&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/yanarchy/status/1162570360769798144"&gt;Tokyo Twitter: any Japanese breakfast restaurants&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cntraveller.com/article/travel-guide-tokyo"&gt;Tokyo, Japan - Condé Nast Traveller | CN Traveller&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tokyocheapo.com/"&gt;TokyoCheapo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theguardian.com/artanddesign/gallery/2024/jul/08/tokyos-oldest-train-line-jr-yamanote-in-pictures"&gt;Tokyo’s oldest train line – in pictures | Art and design | The Guardian&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Tokyu Hands and Loft (shops in Shibuya).&lt;/li&gt;
&lt;li&gt;Toritake (yakitori at Shibuya).&lt;/li&gt;
&lt;li&gt;Try Mos rice burger (fast food).&lt;/li&gt;
&lt;li&gt;Try out Pancan (bread in can).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tsukiji-market.or.jp/etc/calendar/2016.html"&gt;Tsukiji Fish Market calendar&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Tsukiji Fish Market: Sushi bars and food vendors (get there early, visitor numbers restricted).&lt;/li&gt;
&lt;li&gt;Umemura in Asakusa (also Mamekan).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/JapanTravel/comments/79c82l/unusual_things_to_do_in_tokyo/"&gt;Unusual things to do in Tokyo? &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.alojapan.com/253056/walk-around-yoyogi-uehara-station-shibuya-binaural-city-soundsasmr-in-tokyo-japan-osmo-pocket/"&gt;Walk around Yoyogi-Uehara Station, Shibuya, Binaural City Sounds(ASMR) in Tok…&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/Tokyo/s/1mBB6ix3aW"&gt;What's something you know about in Tokyo that you think others should know about?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Yurakucho Yakitori Alley&lt;/li&gt;
&lt;li&gt;Zauo.com &amp;quot;Let's fixhing enjoy&amp;quot;. Catch your own fish to eat.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tabelog.com/en/tokyo/A1303/A130301/13058009/"&gt;婁熊東京 (raw and grilled pork)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://r.tabelog.com/tokyo/A1307/A130701/13041724/"&gt;酒友&lt;/a&gt; (Sake &amp;amp; good Shabushabu), Roppongi.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 19 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/tokyo-travel-bookmarks</guid></item><item><title>UK travel bookmarks</title><link>https://xenodium.com/uk-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.buzzfeed.com/chelseypippin/25-wanderlust-worthy-day-trips-from-london#.xbkbNaApW"&gt;25 stunning british places you can reach from London&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/ddoniolvalcroze/status/1278326573070876672"&gt;A graveyard of red telephone boxes located in the small village of Carlton Miniott&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Dunmore_Pineapple"&gt;Dunmore Pinapple&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hitchinlavender.co.uk/"&gt;Hitchin Lavender&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.theguardian.com/travel/2015/may/10/scotland-beach-swimming-wild-camping"&gt;In search of Scotland’s best beach&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.seemytravels.com/2015/01/23/the-isle-of-man-mist/"&gt;Isle of Man&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Sandwood_Bay"&gt;Sandwood Bay&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=sark+island&amp;amp;t=ffsb&amp;amp;iax=1&amp;amp;ia=images"&gt;Sark island&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.theguardian.com/travel/2015/aug/23/scotland-north-coast-500-road-trip?CMP%3Dshare_btn_tw"&gt;Scotland’s new North Coast 500 route&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/amp/articles/best-hikes-in-england"&gt;The 8 most dramatic hikes in England&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thenewforest.co.uk/"&gt;The New Forest&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.seemytravels.com/2015/02/15/where-to-find-street-art-in-liverpool/"&gt;Where to Find Street Art in Liverpool&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.x-pilot.co.uk/"&gt;X-Pilot (Redsand towers)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 19 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/uk-travel-bookmarks</guid></item><item><title>Development quotes</title><link>https://xenodium.com/development-quotes</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/giorgiosironi/status/587507955521708032"&gt;If your backlog is exploding the problem is not that your developers are slow, but that your business model is not based on reality&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://redux.js.org/docs/introduction/PriorArt.html"&gt;If you lose out on object allocation, you still win by avoiding expensive re-renders and re-calculations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sandimetz.com/blog/2016/1/20/the-wrong-abstraction"&gt;Duplication is far cheaper than the wrong abstraction (prefer duplication up to a point)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Rule_of_three_(computer_programming)"&gt;Choosing an appropriate design to duplication avoid might benefit from more examples to see patterns in. Attempting premature refactoring risks selecting a wrong abstraction&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.deconstructconf.com/2017/brian-marick-patterns-failed-why-should-we-care"&gt;Patterns failed, why we should case&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 19 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/development-quotes</guid></item><item><title>Development philosophy</title><link>https://xenodium.com/development-philosophy</link><description>&lt;ul&gt;
&lt;li&gt;Boyscout rule: Leave campground cleaner than found.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nibblestew.blogspot.com/2019/12/what-can-clang-format-teach-us-about.html?m=1"&gt;What can clang-format teach us about the human condition?&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 19 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/development-philosophy</guid></item><item><title>Spain travel bookmarks</title><link>https://xenodium.com/spain-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.larecomendadora.com/2019/11/cafeterias-bonitas-originales-encanto-madrid.html"&gt;7 CAFETERIAS BONITAS, ORIGINALES y CON ENCANTO en MADRID&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tripadvisor.co.uk/Restaurant_Review-g187514-d6673431-Reviews-Bomboneria_Santa-Madrid.html"&gt;BOMBONERIA SANTA, Madrid - Barrio de Salamanca&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.timeout.com/madrid/cinemas/cine-dore-filmoteca-espanyola"&gt;Cine Doré Filmoteca Española | Cinemas in Lavapiés, Madrid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.timeout.com/madrid/art/espacio-fundacion-telefonica"&gt;Espacio Fundación Telefónica | Art in Malasaña, Madrid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.timeout.com/madrid/art/fundacion-masaveu"&gt;Fundación Masaveu | Art in Madrid, Madrid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.larecomendadora.com/2019/10/juanchis-burgers-hamburguesas-madrid.html"&gt;JUANCHI'S BURGERS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://laduquesita.es/"&gt;La Duquesita. Pastelería - Bombonería - Confitería repostería desde 1914&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/La_Palma"&gt;La Palma, most north-westerly of the Canary Islands&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/pages/La-Perejila/116839091715751"&gt;La Perejila - Madrid - Bar de tapas y restaurante, Restaurante español&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tripadvisor.com/ShowUserReviews-g1802172-d1887157-r141602833-El_Lago_Verde-El_Golfo_Lanzarote_Canary_Islands.html"&gt;Lanzarote's green lagoon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.viajenaviagem.com/destino/madri/onde-comer-madri/"&gt;Madri: onde comer | Restaurantes e bares de tapas recomendados&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.madricioso.com"&gt;Madricioso&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.timeout.com/madrid/art/matadero-madrid"&gt;Matadero Madrid | Art in Legazpi, Madrid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mataderomadrid.org"&gt;Matadero Madrid. Centro de creación contemporánea&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.timeout.com/madrid/shopping/mercado-de-san-fernando"&gt;Mercado de San Fernando | Shopping in Lavapiés, Madrid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.timeout.com/madrid/things-to-do/mercado-de-vallehermoso"&gt;Mercado de Vallehermoso | Things to do in Chamberí, Madrid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://commons.wikimedia.org/wiki/Category:Rock_carved_hermitage_of_Saints_Justus_and_Pastor,_Olleros_de_Pisuerga"&gt;Rock carved hermitage of Saints Justus and Pastor, Olleros de Pisuerga&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eltriciclo.es/triciclo/"&gt;triciclo - grupotriciclo&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 19 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/spain-travel-bookmarks</guid></item><item><title>Meet up bookmarks</title><link>https://xenodium.com/meet-up-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.couchsurfing.com"&gt;Couchsurfing.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.meetup.com/"&gt;Meetup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://teawithstrangers.com"&gt;Tea with strangers&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 19 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/meet-up-bookmarks</guid></item><item><title>2015-04-19</title><link>https://ho.dges.online/pictures/2015-04-19/</link><description>&lt;p&gt;Probably my favourite ever picture of B and one of the very few occasions when I managed to harness the magic of the Fuji 56mm lens.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sun, 19 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-04-19/</guid></item><item><title>Every app is a superpower</title><link>https://stephango.com/every-app-is-a-superpower</link><description>&lt;p&gt;When Google Maps first came out, it blew me away. It still seems like one of the most magical technologies we have today.&lt;/p&gt;

&lt;p&gt;I wonder what Ferdinand Magellan would think if you showed him Google Maps on a phone? The entire world mapped in detail, with photos of every building in every city.&lt;/p&gt;

&lt;p&gt;I sat in an airport listening to Pyotr Ilyich Tchaikovsky on Spotify, wondering what he’d think if he knew that anyone can listen to high-fidelity recordings of all his compositions. Just a phone and a pair of earbuds  —  no matter where you are.&lt;/p&gt;

&lt;p&gt;What if Johannes Gutenberg could hold the world’s knowledge in the palm of his hands, and search Wikipedia for anything he can think of?&lt;/p&gt;

&lt;p&gt;Imagine showing Nicéphore Niépce and the Lumière brothers what images they could capture from a camera that fits in your pocket.&lt;/p&gt;

&lt;p&gt;I would love to see Alexander Graham Bell wirelessly have a face-to-face conversation with anyone on Earth.&lt;/p&gt;

&lt;p&gt;Within ten seconds, I can tell you what the weather will be like tomorrow or what the top five restaurants are, for any city in the world. I can have a chauffeur here in 5 minutes, or have my groceries delivered before dinner.&lt;/p&gt;

&lt;p&gt;In our pockets is a portal to powers that even kings couldn’t dream of.&lt;/p&gt;</description><author>Steph Ango</author><pubDate>Sun, 19 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://stephango.com/every-app-is-a-superpower</guid></item><item><title>Plantuml example</title><link>https://xenodium.com/plantuml-example</link><description>&lt;p&gt;Played with &lt;a href="http://plantuml.sourceforge.net/PlantUML_Language_Reference_Guide.pdf"&gt;Plantuml&lt;/a&gt;. Convenient for generating UML diagrams from text. Here's the &lt;a href="http://plantuml.sourceforge.net/PlantUML_Language_Reference_Guide.pdf"&gt;Language Reference Guide&lt;/a&gt;. Here's an example:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.plantuml"&gt;@startuml
  abstract class Singer {
    abstract void sing()
    void Dance()
  }

  skinparam monochrome true
  Singer &amp;lt;|-- PopSinger
  Singer &amp;lt;|-- SalsaSinger

  class PopSinger {
    void sing()
  }

  class SalsaSinger {
    void sing()
  }

@enduml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/plantuml-example/plantuml-singer.png" /&gt;&lt;/p&gt;
&lt;p&gt;Install plantuml on Mac OS X:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;brew install plantum
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Generating diagram:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$GRAPHVIZ_DOT=~/homebrew/bin/dot java -jar path/to/plantuml.8018.jar diagram.plantuml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ps. Installation and verification &lt;a href="https://gist.github.com/NLKNguyen/c39596c205ba1f1866c8"&gt;gist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;ps2. More handy UML examples in this &lt;a href="https://github.com/xenodium/uml"&gt;fork&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 17 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/plantuml-example</guid></item><item><title>Fattura Elettronica Open Source Update</title><link>https://nicolaiarocci.com/fattura-elettronica-open-source-update/</link><description>&lt;p&gt;&lt;a href="http://fatturaelettronicaopensource.org/"&gt;Fattura Elettronica Open Source&lt;/a&gt; has been updated to v0.1.3 a few days ago and is available on &lt;a href="https://www.nuget.org/packages/FatturaElettronicaPA/"&gt;NuGet&lt;/a&gt;. Sources are on &lt;a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA"&gt;GitHub&lt;/a&gt;. It fixes a deserialization issue with the &lt;code&gt;ReadXML&lt;/code&gt; method.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Fri, 17 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/fattura-elettronica-open-source-update/</guid></item><item><title>A cost-based scheduler for ETL pipelines</title><link>https://blog.tafkas.net/2015/04/17/a-cost-based-scheduler-for-etl-pipelines/</link><description>To speed up the ETL data pipeline, you should try to run jobs in parallel. Obviously, not all jobs can run at the same time in most cases, since there are dependency constraints between the jobs and limits of the servers capacity (number of processors and/or IO bandwidth).
So assuming the server allows you to run n jobs in parallel, often there is the situation that the dependencies give you the option to run any of a set of m different jobs with m &amp;gt; n.</description><author>Tafkas Blog</author><pubDate>Fri, 17 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tafkas.net/2015/04/17/a-cost-based-scheduler-for-etl-pipelines/</guid></item><item><title>Go from a PHP Perspective</title><link>https://www.brightball.com/articles/go-from-a-php-perspective</link><description>Here are the slides from my recent presentation to UpstatePHP in Greenville, looking at Go (Golang) from a PHP Perspective.</description><author>Brightball Articles</author><pubDate>Fri, 17 Apr 2015 00:06:59 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/go-from-a-php-perspective</guid></item><item><title>The Gambler</title><link>https://olshansky.info/movie/the_gambler/</link><description>Olshansky's review of The Gambler</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 16 Apr 2015 18:52:27 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_gambler/</guid></item><item><title>Anvil: big progress for a small library</title><link>https://zserge.com/posts/anvil-2/</link><description>Anvil: big progress for a small library I have just released Anvil 0.0.2. So many changes have been made and now I am absolutely confident that Anvil has its strong points even though I&amp;rsquo;m the only active user of it.
What is Anvil? This section is for those who missed the early steps of Anvil.
Anvil is a tiny reactive UI library for Android. What does this mean? It means that you can declare your UI in Java, bind your data to the views, bind event listeners to the views and leave it running.</description><author>zserge's blog</author><pubDate>Thu, 16 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/anvil-2/</guid></item><item><title>Where Anvil meets Kotlin</title><link>https://zserge.com/posts/anvil-kotlin/</link><description>Kotlin is a very nice language for JVM. I wrote about it in the past.
Anvil is a very nice UI library for Android. How do these two play together?
The first attempt My favourite example to demonstrate Anvil syntax is a simple click counter. It demonstrates the use of layouts, views, data binding and event binding. In Java it looks like this:
public ViewNode view() { return v(LinearLayout.class, orientation(LinearLayout.VERTICAL), v(TextView.</description><author>zserge's blog</author><pubDate>Thu, 16 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/anvil-kotlin/</guid></item><item><title>Taken 3</title><link>https://olshansky.info/movie/taken_3/</link><description>Olshansky's review of Taken 3</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 15 Apr 2015 17:45:39 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/taken_3/</guid></item><item><title>Star Wars: Episode IV - A New Hope</title><link>https://olshansky.info/movie/star_wars_episode_iv_-_a_new_hope/</link><description>Olshansky's review of Star Wars: Episode IV - A New Hope</description><author>🦉 olshansky 🦁</author><pubDate>Wed, 15 Apr 2015 17:39:27 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/star_wars_episode_iv_-_a_new_hope/</guid></item><item><title>Numpy matrices work for general objects</title><link>http://negfeedback.blogspot.com/2015/04/numpy-matrices-work-for-general-objects.html</link><description>A student was having difficulty using a class I had created to represent transfer function objects. I discovered that they were actually placing these objects in a &lt;span style="font-family: Courier New, Courier, monospace;"&gt;numpy.matrix&lt;/span&gt;&amp;nbsp;and trying to multiply things by one another. To my surprise, this actually worked! I had to investigate. The code here is all in Python.&lt;br /&gt;
&lt;br /&gt;
I created a quick tracing object which just kind of logs the operations that are done on it as an expression:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;class operation:
&amp;nbsp; &amp;nbsp; def __init__(self, name):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.string = name
&amp;nbsp; &amp;nbsp; def __repr__(self):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return self.string
&amp;nbsp; &amp;nbsp; def __str__(self):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return self.string
&amp;nbsp; &amp;nbsp; def __add__(self, other):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return operation("({} + {})".format(str(self), str(other)))
&amp;nbsp; &amp;nbsp; def __mul__(self, other):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return operation("{}*{}".format(str(self), str(other)))
&amp;nbsp; &amp;nbsp; def __radd__(self, other):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return operation("({} + {})".format(str(other), str(self)))
&amp;nbsp; &amp;nbsp; def __rmul__(self, other):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return operation("{}*{}".format(str(other), str(self)))
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;/pre&gt;
&lt;div&gt;
Now I can do some interesting stuff:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class="prettyprint"&gt;    In []: a*b
    Out[]: a*b
    In []: a + b
    Out[]: (a + b)
&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Ok, but what about matrix multiplication?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class="prettyprint"&gt;import numpy as np
In []: tracer = np.matrix([[a, b, c],
[d, e, f],
[g, h, i]])

In []: tracer*tracer
Out[]:
matrix([[((a*a + b*d) + c*g), ((a*b + b*e) + c*h), ((a*c + b*f) + c*i)],
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [((d*a + e*d) + f*g), ((d*b + e*e) + f*h), ((d*c + e*f) + f*i)],
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [((g*a + h*d) + i*g), ((g*b + h*e) + i*h), ((g*c + h*f) + i*i)]], dtype=object)
&lt;/pre&gt;
&lt;div&gt;
That kind of blew me away! It means I can probably get away with a whole lot less code than I thought I would need to implement my own matrix-like objects.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In addition, it appears that some numpy functions will attempt to call corresponding functions in the object they act on:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class="prettyprint"&gt;    In []: np.exp(a)
---------------------------------------------------------------------------

AttributeError &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Traceback (most recent call last)
 in ()
----&amp;gt; 1 np.exp(a)
AttributeError: exp
&lt;/pre&gt;
&lt;div&gt;
This error shows that np.exp is trying to access the exp attribute on this object. Let's extend our object with an exp method like this:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class="prettyprint"&gt;&amp;nbsp; &amp;nbsp; def exp(self):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return operation("e^({})".format(self))
&lt;/pre&gt;
&lt;div&gt;
Now (after re-instantiating a-i from above), we have&lt;/div&gt;
&lt;div&gt;
&lt;pre class="prettyprint"&gt;In []: np.exp(a)
Out[]: e^(a)
&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This is going to be super useful.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>Negative Feedback</author><pubDate>Wed, 15 Apr 2015 11:12:54 GMT</pubDate><guid isPermaLink="true">http://negfeedback.blogspot.com/2015/04/numpy-matrices-work-for-general-objects.html</guid></item><item><title>Burton Snowboards, the Anti-Apple</title><link>https://jonpauluritis.com/articles/burton-snowboards-the-anti-apple/</link><description>&lt;p&gt;One of the most disturbing aspects of design trends over the last decade or two is the cult of Apple, and the various sound bytes that they use to be able to convert people into their design aesthetic =&amp;gt; my specific issue is with this hyperbolic “minimalism” mantra that they have been spoon feeding Americans for the better part of 20 years now.&lt;/p&gt;
&lt;p&gt;Now its important to note I am not against “minimalism”, “simplification”, “usability”, or any of the other things that Apple likes to focus on with their products and marketing. In fact, I actually see them as very important design aesthetics and mantras. What I am against is the notion that minimalism is the sole design aesthetic, and that it is somehow the greater good thus a reason to build a dogma around it.&lt;/p&gt;
&lt;p&gt;Minimalism should be in context. Where would we be without Picasso’s cubism or Cézanne beautiful use of color or Van Gogh’s deep detail that required careful consideration. It was only later in Pop-Art and Minimalism movements that we felt the need to reduce twice over as an “antithesis” for many of the busy and colorful artistic movements from before.&lt;/p&gt;
&lt;p&gt;Thankfully, when I was reading Purple Cow it Came to me that one of my all time favorite companies, Burton Snowboards is actually an exact opposite to Apple inc. Here are some examples:&lt;/p&gt;
&lt;h3&gt;Major Features of Apple:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Minimalism&lt;/li&gt;
&lt;li&gt;Plain high contrast colors&lt;/li&gt;
&lt;li&gt;“easy to use”&lt;/li&gt;
&lt;li&gt;User friendly&lt;/li&gt;
&lt;li&gt;Design over Technology ( consistently a technology laggard technically by specifications)&lt;/li&gt;
&lt;li&gt;Very few products&lt;/li&gt;
&lt;li&gt;Larger than life CEO&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Major Features of Burton:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Active Designs&lt;/li&gt;
&lt;li&gt;Products that are harder to use =&amp;gt; Snowboarding over skiing&lt;/li&gt;
&lt;li&gt;Extremely colorful&lt;/li&gt;
&lt;li&gt;Technology leads to design&lt;/li&gt;
&lt;li&gt;Many products and varying features to each product line&lt;/li&gt;
&lt;li&gt;CEO that prefers to be out snowboarding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Burton’s approach is pretty much the exact opposite to Apple but their brand and products are every bit as strong as Apples (they just function in a smaller marketplace). For Example, Burton is aggressive about creating the best technology where as Apple traditionally sells technology that is 20% slower, less powerful, and smaller in capacity than the existing marketplace. Burton is very “active” with their designs and they consistently out design their competition (competition that focuses on Minimalism). Additionally, they have tons of products- yes they primarily sell snowboards but you have many choices within the Burton environment.&lt;/p&gt;
&lt;p&gt;I think there is a lot to what Burton is doing that other Companies could learn from, and I would urge people to consider their design Aesthetic in context.&lt;/p&gt;
&lt;p&gt;Apple is great, but that doesn’t mean they are the only ones that can get it right.&lt;/p&gt;</description><author>JonPaulUritis.com</author><pubDate>Wed, 15 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://jonpauluritis.com/articles/burton-snowboards-the-anti-apple/</guid></item><item><title>Unicode and Matlab on the command line</title><link>https://bastibe.de/2015-04-15-unicode-in-the-matlab-command-line.html</link><description>&lt;p&gt;As per the latest &lt;a href="http://stackoverflow.com/research/developer-survey-2015#techSuper-dreaded"&gt;Stackoverflow Developer Survey&lt;/a&gt;, Matlab is one of &lt;em&gt;the&lt;/em&gt; most dreaded tools out there. I run into Matlab-related trouble daily. In all honesty, I have never seen a programming language as user-hostile and as badly designed as this.&lt;/p&gt;
&lt;p&gt;So here is today's problem: When run from the command line, Matlab does not render unicode characters (on OSX).&lt;/p&gt;
&lt;p&gt;I say &amp;quot;(on OSX)&amp;quot;, because on Windows, it does not print a damn thing. Nope, no &lt;code&gt;disp&lt;/code&gt; output for Windows users.&lt;/p&gt;
&lt;p&gt;More analysis: It's not that Matlab does not render unicode characters at all when run from the command line. Instead, it renders them as &lt;code&gt;0x1a&lt;/code&gt; aka &lt;code&gt;SUB&lt;/code&gt; aka &lt;em&gt;substitute character&lt;/em&gt;. In other words, it tries to render unicode as ASCII (which doesn't work), and then replaces all non-ASCII characters with &lt;code&gt;SUB&lt;/code&gt;. This is actually reasonable if Matlab were running on a machine that can't handle unicode. This is not a correct assessment of post-90s Macs, though.&lt;/p&gt;
&lt;p&gt;To see why Matlab would do such a dastardly deed, you can use &lt;code&gt;feature('locale')&lt;/code&gt; to get information about the encoding Matlab uses. On Windows and OS X, this defaults to either &lt;code&gt;ISO-8859-1&lt;/code&gt; (when your locale is pure &lt;code&gt;de_DE&lt;/code&gt; or &lt;code&gt;en_US&lt;/code&gt;) or &lt;code&gt;US-ASCII&lt;/code&gt;, if it is something impure. In my case, German dates but English text. Because &lt;code&gt;US-ASCII&lt;/code&gt; is obviously the most all-encompassing choice for such mixed-languages environments.&lt;/p&gt;
&lt;p&gt;But luckily, there is help. Matlab has a widely documented (not) and easily discoverable (not) configuration option to change this: To change Matlab's encoding settings, edit &lt;code&gt;%MATLABROOT%/bin/lcdata.xml&lt;/code&gt;, and look for the entry for your locale. For me, this is one of&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;locale&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;de_DE&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;encoding=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ISO-8859-1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xpg_name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;de_DE.ISO8859-1&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;...
&lt;span class="nt"&gt;&amp;lt;locale&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;en_US&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;encoding=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ISO-8859-1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xpg_name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;en_US.ISO8859-1&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;...
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In order to make Matlab's encoding default to UTF-8, change the entry for your locale to&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;locale&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;de_DE&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;encoding=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xpg_name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;de_DE.UTF-8&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;...
&lt;span class="nt"&gt;&amp;lt;locale&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;en_US&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;encoding=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;xpg_name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;en_US.UTF-8&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;...
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With that, Matlab will print UTF-8 to the terminal.&lt;/p&gt;
&lt;p&gt;You still can't type unicode characters to the command prompt, of course. But who would want that anyway, I dare ask. Of course, what with Matlab being basically free, and frequently updated, we can forgive such foibles easily...&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Wed, 15 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2015-04-15-unicode-in-the-matlab-command-line.html</guid></item><item><title>Talk - High Performance Software Defined Storage</title><link>https://smcleod.net/2015/04/talk-high-performance-software-defined-storage/</link><description>&lt;p&gt;A high level talk from Infracoders Melbourne on 12/04/2015.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://media.githubusercontent.com/media/sammcj/smcleod_files/refs/heads/master/slides/lightning_san.pdf"&gt;&lt;img alt="Click to Start Slides" src="https://smcleod.net//img/san/supermicrox2.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://media.githubusercontent.com/media/sammcj/smcleod_files/refs/heads/master/slides/lightning_san.pdf"&gt;&lt;img alt="Click to Start Slides" src="https://smcleod.net//img/san/ic-slides-image.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also a low quality recording available here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/VAdqurA2zQ4?t=198"&gt;&lt;img alt="Click to Start Video" src="https://smcleod.net//img/san/ic-sds-yt-thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Related posts:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://smcleod.net/building-a-high-performance-ssd-san/"&gt;Building a high performance SSD SAN - Part 1&lt;/a&gt;&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Wed, 15 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/04/talk-high-performance-software-defined-storage/</guid></item><item><title>Filetree Listing</title><link>https://boyter.org/2015/04/filetree-listing/</link><description>&lt;p&gt;Just a quick update to searchcode. A few small tweaks here and there, but the largest is that there is now a file tree listing option which will show the file tree for any project. An example would be going to &lt;a href="https://searchcode.com/codesearch/view/92885393/"&gt;this file&lt;/a&gt; and then clicking the &amp;ldquo;View File Tree&amp;rdquo; button on the top left.&lt;/p&gt;
&lt;p&gt;An example screenshot of the result of this is included below.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.boyter.org/wp-content/uploads/2015/04/filetree.png"&gt;&lt;!-- raw HTML omitted --&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Wed, 15 Apr 2015 00:32:31 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/04/filetree-listing/</guid></item><item><title>Helm-describe-helm-attribute</title><link>https://xenodium.com/helm-describe-helm-attribute</link><description>&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v%3DXjKtkEMUYGc"&gt;Writing A Spotify Client in 16 Minutes&lt;/a&gt; is fantastic for picking up helm and Emacs lisp tips. Of interest helm-describe-helm-attribute, second to the awesomeness of helm-spotify integration.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;iframe width='420'
        height='315'
        src='https://www.youtube.com/embed/XjKtkEMUYGc'
        frameborder='0'
        allowfullscreen&amp;gt;
&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 14 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/helm-describe-helm-attribute</guid></item><item><title>Forget Not His Benefits</title><link>http://evantravers.com/articles/2015/04/14/forget-not-his-benefits/</link><description>&lt;p&gt;&lt;img alt="cracks" src="https://images.evantravers.com/articles/2015/04/cracks.jpg" /&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Bless the Lord, O my soul, and forget not all his benefits, who forgives all
your iniquity, who heals all your diseases, who redeems your life from the pit,
who crowns you with steadfast love and mercy, (‭Psalm‬
‭103‬:‭2-4‬ ESV)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This whole passage is glorious, but I've been reflecting on being crowned with
steadfast love and mercy... God is a good father, and it seems to me that He
would not &amp;quot;crown&amp;quot; us unless He had already provided for all our basic needs.
Washed clean by His blood, fed by His Word, clothed in His righteousness,
crowned by His faithfulness and mercy.&lt;/p&gt;
&lt;p&gt;I'm convicted that I have often forgotten this benefit, indeed I even enter
prayer without acknowledging any of these glorious truths... Asking for so
much, I end up praising for so little. I'm going to spend some serious time
this week revisiting &amp;quot;his benefits.&amp;quot; It's already been a sweet thing for my
soul. Thank you Lord!&lt;/p&gt;</description><author>trv.rs</author><pubDate>Tue, 14 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2015/04/14/forget-not-his-benefits/</guid></item><item><title>Poem by Simon Armitage</title><link>https://ho.dges.online/words/commonplace/poem-by-simon-armitage/</link><description>&lt;p&gt;And if it snowed and snow covered the drive&lt;br /&gt;
he took a spade and tossed it to one side.&lt;br /&gt;
And always tucked his daughter up at night&lt;br /&gt;
And slippered her the one time that she lied.&lt;br /&gt;
And every week he tipped up half his wage.&lt;br /&gt;
And what he didn&amp;rsquo;t spend each week he saved.&lt;br /&gt;
And praised his wife for every meal she made.&lt;br /&gt;
And once, for laughing, punched her in the face.&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Tue, 14 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/poem-by-simon-armitage/</guid></item><item><title>The Sea of Tranquility</title><link>https://apurva-shukla.me/bookshelf/the-sea-of-tranquility/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ I started reading this book based on a friend’s recommendation and a few chapters in I started to regret it.

For me, the…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Mon, 13 Apr 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-sea-of-tranquility/</guid></item><item><title>Tips for Building Mobile Games in HTML5</title><link>https://thomashunter.name/posts/2015-04-13-tips-for-building-mobile-games-in-html5</link><author>Thomas Hunter II</author><pubDate>Mon, 13 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://thomashunter.name/posts/2015-04-13-tips-for-building-mobile-games-in-html5</guid></item><item><title>How To Automatically Update Your Angular Offline Webapps</title><link>https://phacks.dev/articles/how-to-automatically-update-your-angular-offline-webapps</link><description>Offline-first webapps are a gracious way to guarantee a worst-case user experience that can be controlled and fine-tuned by developers.</description><author>Nicolas Goutay</author><pubDate>Mon, 13 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://phacks.dev/articles/how-to-automatically-update-your-angular-offline-webapps</guid></item><item><title>Explaining the need for privacy</title><link>https://bastian.rieck.me/blog/2015/explaining_privacy/</link><description>&lt;p&gt;John Oliver recently explained the need for privacy in his great show &lt;a href="http://www.hbo.com/last-week-tonight-with-john-oliver"&gt;Last Week
Tonight&lt;/a&gt; by using a rather NSFW example,
namely his private parts. &lt;a href="https://cantheyseemydick.com"&gt;There is even a new website about this very
issue&lt;/a&gt;. I love the internet.&lt;/p&gt;
&lt;p&gt;However, I am not entirely satisfied with the &lt;em&gt;reason&lt;/em&gt; for privacy. Taking and sending pictures of
your junk is a deliberate action of your part. Eric Schmidt had the following to say about this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you have something that you don&amp;rsquo;t want anyone to know, maybe you shouldn&amp;rsquo;t be doing it in the
first place.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is certainly not completely wrong—and this is &lt;em&gt;precisely&lt;/em&gt; the reason why I dislike the
example used by John Oliver. Let me explain: In German, we have two words for privacy. We have
&lt;em&gt;Intimsphäre&lt;/em&gt;, which pertains to things that are “intimate”, e.g. your junk. We also have the
word &lt;em&gt;Privatsphäre&lt;/em&gt;, which pertains to things that are (merely) private. In my opinion, it is
a bad idea to reduce the problem with surveillance to the most intimate of things! Of course, most
people would not like the government to make copies of their nude pictures or whatever. That is
beside the point. I even resent governments or anyone snooping in things that are clearly
private.&lt;/p&gt;
&lt;p&gt;A more useful example is the current state of my apartment. When I am having people over, I clean
everything to make sure that no discarded clothes, papers, or anything messy is around. When I am on
my own, books start to occupy all surfaces over time. This is not something I need to &lt;em&gt;hide&lt;/em&gt;,
but I would still be &lt;em&gt;embarassed&lt;/em&gt; if I am having a visitor and the apartment is not cleaned. Now
imagine the government being able to look over your daily affairs, with all the social make-up
removed. All your journal entries, e-mails to loved ones (with or without pictures of private
parts), comments on social networks, and so on. &lt;em&gt;This&lt;/em&gt; is the real issue with (government)
surveillance. We must not let the NSA and others take over our &lt;em&gt;Privatsphäre&lt;/em&gt; and fall back to our
&lt;em&gt;Intimsphäre&lt;/em&gt;. They need to be kept out of both!&lt;/p&gt;
&lt;p&gt;(I wrote this as a result of a very intriguing coffee-break discussion with friends and colleagues.
Thank you for the insights)&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 12 Apr 2015 15:48:27 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/explaining_privacy/</guid></item><item><title>Youtube videos in your org html export</title><link>https://xenodium.com/youtube-videos-in-your-org-html-export</link><description>&lt;p&gt;&lt;a href="https://twitter.com/sachachua"&gt;Sacha Chua&lt;/a&gt; and &lt;a href="https://twitter.com/jwiegley"&gt;John Wiegley&lt;/a&gt; posted a wonderful video on &lt;a href="http://sachachua.com/blog/2015/04/2015-04-08-emacs-lisp-development-tips-with-john-wiegley"&gt;Emacs lisp development tips&lt;/a&gt;. Embedding the following raw HTML using #+BEGIN_HTML/#+END_HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;iframe width=&amp;quot;420&amp;quot;
        height=&amp;quot;315&amp;quot;
        src=&amp;quot;https://www.youtube.com/embed/QRBcm6jFJ3Q&amp;quot;
        frameborder=&amp;quot;0&amp;quot;
        allowfullscreen&amp;gt;
&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;results in an embedded video when exporting your org file:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;iframe width=&amp;quot;420&amp;quot;
        height=&amp;quot;315&amp;quot;
        src=&amp;quot;https://www.youtube.com/embed/QRBcm6jFJ3Q&amp;quot;
        frameborder=&amp;quot;0&amp;quot;
        allowfullscreen&amp;gt;
&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 12 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/youtube-videos-in-your-org-html-export</guid></item><item><title>.net bookmarks</title><link>https://xenodium.com/dot-net-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://thomasvm.github.io/blog/2015/03/17/open-source-net-libraries-that-make-your-life-easier/"&gt;Open Source .Net libraries that make your life easier&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 12 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/dot-net-bookmarks</guid></item><item><title>Decisions in Pillars of Eternity</title><link>https://bastibe.de/2015-04-12-decisions-in-poe.html</link><description>&lt;p&gt;Early on in &lt;a href="https://en.wikipedia.org/wiki/Pillars_of_Eternity"&gt;Pillars of Eternity&lt;/a&gt;, you are tasked to kill one of two characters: Either you kill King Rethoric, who executed many innocent people, or you kill Rolsc, the leader of the rebellion. This is an interesting moral choice, but it is also profoundly sad that the game presents killing either of them as the only resolution to this conflict.&lt;/p&gt;
&lt;p&gt;It got me thinking. In the real world, I would not consider killing to be an option, ever. But in the game, you have to play by the game's rules. And furthermore, you can't just walk away and have the two characters duke it out amongst themselves: The whole game is built around the player, and without the player's interaction, the game world doesn't evolve.&lt;/p&gt;
&lt;p&gt;Thus, this conflict won't resolve itself, and the player is forced to kill. I wish there were a diplomatic option, or a way of fixing the underlying problem so the two characters are not at odds any more. I fear how these choices in video games might influence our perceptions of everyday choices, and crave for video games that offer interesting choices that do not revolve around murder.&lt;/p&gt;
&lt;p&gt;From what I hear, Planescape Torment did offer such choices. As did many of &lt;a href="https://en.wikipedia.org/wiki/Gone_Home"&gt;my&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/The_Stanley_Parable"&gt;favorite&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/X-Plane_%2528simulator%2529"&gt;games&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Civilization_V"&gt;of&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/The_Wolf_Among_Us"&gt;all&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/The_Witcher_%2528video_game%2529"&gt;times&lt;/a&gt;.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Sun, 12 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2015-04-12-decisions-in-poe.html</guid></item><item><title>HP Support Solutions Framework Security Issue</title><link>https://tomforb.es/blog/hp-support-solutions-framework-security-issue/</link><description>After discovering the flaw in Dell’s System Detect software I looked into other similar software for issues. This post details two issues I found with the HP Product Detection software and explores the protections HP put in place. I’m also going to explain how they could be easily bypassed to allow ...</description><author>Tom Forbes</author><pubDate>Sun, 12 Apr 2015 02:50:23 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/hp-support-solutions-framework-security-issue/</guid></item><item><title>A Brief History of Time</title><link>https://olshansky.info/book/a_brief_history_of_time/</link><description>Olshansky's review of A Brief History of Time by Stephen Hawking</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 11 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/book/a_brief_history_of_time/</guid></item><item><title>UK property bookmarks</title><link>https://xenodium.com/uk-property-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://commutefrom.com/"&gt;Commute from&lt;/a&gt; (find property based on potential commute).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://property.mapumental.com"&gt;Mapumental Property&lt;/a&gt; (find property by travel time).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 10 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/uk-property-bookmarks</guid></item><item><title>Git commit message style</title><link>https://xenodium.com/git-commit-message-style</link><description>&lt;p&gt;Adopted Tim Pope's Git commit message &lt;a href="http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html"&gt;style&lt;/a&gt;. Also enabled Emacs's git-commit-training-wheels-mode:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(use-package git-commit-training-wheels-mode :ensure t
  :commands (git-commit-training-wheels-mode))

(use-package git-commit-mode :ensure t
  :config
  (add-hook 'git-commit-mode-hook 'git-commit-training-wheels-mode)
  :commands (git-commit-mode))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Another great &lt;a href="http://chris.beams.io/posts/git-commit/"&gt;post&lt;/a&gt; by Chris Beams.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 09 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/git-commit-message-style</guid></item><item><title>Sharing dev environments with Oh-My-Vagrant</title><link>https://purpleidea.com/blog/2015/04/08/sharing-dev-environments-with-oh-my-vagrant/</link><description>&lt;p&gt;With &lt;a href="https://github.com/purpleidea/oh-my-vagrant"&gt;Oh-My-Vagrant&lt;/a&gt; (omv) you can set up a dev environment in seconds. (Read the &lt;a href="https://purpleidea.com/blog/2014/09/03/introducing-oh-my-vagrant/"&gt;omv introduction&lt;/a&gt; if you&amp;rsquo;ve never used it before!) Since everything is defined in a single &lt;code&gt;omv.yaml&lt;/code&gt; file, it is easy to share your cluster prototype with a friend! The one missing feature was associating code with this config file. This is now possible! Let me show you how it works&amp;hellip;&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;omv.yaml&lt;/code&gt; file there is an &lt;code&gt;extern&lt;/code&gt; variable. It is a list of each &lt;em&gt;external&lt;/em&gt; repository which you&amp;rsquo;d like to include. Each element in this list is a hash of key value pairs. Currently four are supported: &lt;em&gt;type&lt;/em&gt;, &lt;em&gt;system&lt;/em&gt;, &lt;em&gt;repository&lt;/em&gt;, &lt;em&gt;directory&lt;/em&gt;.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Wed, 08 Apr 2015 06:37:18 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/04/08/sharing-dev-environments-with-oh-my-vagrant/</guid></item><item><title>"many more gadgets will surely be built with FPGAs"</title><link>https://stop.zona-m.net/2015/04/many-more-gadgets-will-surely-be-built-with-fpgas/</link><description>&lt;figure&gt;
  &lt;img alt="" src="https://stop.zona-m.net//img/time-for-fpga.png" width="100%" /&gt;
&lt;/figure&gt;
&lt;p&gt;Three and a half years ago, I explained &lt;a href="https://stop.zona-m.net/2011/09/its-time-to-bring-fpga-design-to-the-masses/"&gt;why it&amp;rsquo;s time to bring FPGAs to the masses&lt;/a&gt;. One year later, I wrote that &lt;a href="https://stop.zona-m.net/2012/09/it-is-time-for-european-microprocessors-and-fpgas/"&gt;this is the time for European microprocessors and FPGAs.&lt;/a&gt;. And guess what I just read today?&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Tue, 07 Apr 2015 09:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/04/many-more-gadgets-will-surely-be-built-with-fpgas/</guid></item><item><title>Coursera: Principles of Reactive Programming</title><link>https://danielpecos.com/2015/04/07/coursera-principles-of-reactive-programming/</link><description>&lt;p&gt;&lt;img alt="Principles of Reactive Programming" class="alignleft size-medium" height="169" src="https://danielpecos.com/assets/2015/04/principles-reactive-v1.0-300x169.jpg" width="300" /&gt;In little less than a week, a new edition of Coursera&amp;rsquo;s course, &lt;a href="https://www.coursera.org/course/reactive"&gt;Principles of Reactive Programming&lt;/a&gt; from Martin Odersky, Erik Meijer and Roland Kuhn, is launching.&lt;/p&gt;
&lt;p&gt;This course is a follow-up of &lt;a href="https://www.coursera.org/course/progfun"&gt;Principles of Functional Programming in Scala&lt;/a&gt;, which I took in its first edition and which I enjoyed a lot. I&amp;rsquo;ve regretted missing out first edition of this second course for a long time (more than a year, in fact), so if you want to learn about this magnificent frameworks of the Scala world, don&amp;rsquo;t miss this chance!&lt;/p&gt;
&lt;p&gt;And best of all, it&amp;rsquo;s free!&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Tue, 07 Apr 2015 05:32:33 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2015/04/07/coursera-principles-of-reactive-programming/</guid></item><item><title>So Long and Thanks for All the Job Jackets</title><link>https://solomon.io/so-long-and-thanks-for-all-the-job-jackets/</link><description>April 1, 2013 was my first day working at Red Square Agency as an interactive producer. April 1, 2015 was my first day working full-time on SidePrize.</description><author>Sam Solomon</author><pubDate>Tue, 07 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/so-long-and-thanks-for-all-the-job-jackets/</guid></item><item><title>Ruby on Rails and PostgreSQL Class Slides</title><link>https://www.brightball.com/articles/ruby-on-rails-and-postgresql-class-slides</link><description>In August I taught a course titled Ruby on Rails and PostgreSQL - Intro to Advanced in Greenville over the span of 3 weeks. Here is the compilation of slides from the class.</description><author>Brightball Articles</author><pubDate>Mon, 06 Apr 2015 19:03:00 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/ruby-on-rails-and-postgresql-class-slides</guid></item><item><title>fci-mode and org-html-export-to-html bug</title><link>https://xenodium.com/fci-mode-and-org-html-export-to-html-bug</link><description>&lt;p&gt;Having enabled fci-mode in most programing modes, org-html-export-to-html now exports an additional unicode character in source blocks. This &lt;a href="http://lists.gnu.org/archive/html/emacs-orgmode/2014-09/msg00777.html"&gt;thread&lt;/a&gt; has a workaround:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(defun org-html-fontify-code (code lang)
  ;; ...
  (funcall lang-mode)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (when (require 'fill-column-indicator nil 'noerror)
    (fci-mode -1))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (insert code)
  ;; ...
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 06 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/fci-mode-and-org-html-export-to-html-bug</guid></item><item><title>Medium abuses nofollow</title><link>https://captnemo.in/blog/2015/04/06/medium-abuses-nofollow/</link><description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Since I published this post, I have changed my opinion somewhat on the matter. This post is &lt;a href="https://news.ycombinator.com/item?id=9328384"&gt;quite confrontational&lt;/a&gt; and I didn’t mean it to be that way. Medium is not wrong in this matter, but I still think we need to look for better solutions. I have since been working on a &lt;a href="https://github.com/captn3m0/ideas/blob/master/BADIDEAS.md#-nofollow-enforcer"&gt;proposal/idea&lt;/a&gt; that would use machine learning to “solve” this problem, instead of side-stepping it.&lt;/p&gt;

&lt;p&gt;I call &lt;a href="https://medium.com" rel="nofollow" title="This is a nofollow link"&gt;medium&lt;/a&gt; a “&lt;em&gt;mostly good&lt;/em&gt;” platform for lazy writers. A lot of people have written about its excellent typography, or it being the next “big publishing platform”. I’ve used medium in the past, and while it does have its benefits, I have stopped using it.&lt;/p&gt;

&lt;p&gt;My primary reason was that I already have a blog, where I can control the entire experience. This is the same reason why New York Times does not start publishing articles on Medium.&lt;/p&gt;

&lt;p&gt;The other reason is nofollow abuse.&lt;/p&gt;

&lt;p&gt;Medium hosts more than &lt;a href="https://www.google.co.in/webhp?q=site%3Amedium.com#q=site:medium.com"&gt;1M indexed pages&lt;/a&gt;. It has around &lt;a href="https://medium.com/editors-picks"&gt;650k users&lt;/a&gt; currently by &lt;a href="https://www.quora.com/How-many-users-does-Medium-have/answer/Josh-Yang"&gt;a conservative estimate&lt;/a&gt;. Rounding it to 700k to account for other users, collections, and other internal pages, it leaves us with around 300,000 articles on medium.&lt;/p&gt;

&lt;p&gt;A basic tenet of the web is linkability. That is what Tim Berners Lee meant when he talked about HyperText:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;HyperText is a way to link and access information of various kinds as a web of nodes in which the user can browse at will.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Over time, the web has evolved, and is now not just limited to human users, but to computers as well. This is an important consideration on which the web rests today. The biggest example of this is Google Search, which uses these links to “follow, spider, and index” the web. Google uses this linking information to build a citation index, which gives us the quality of a web page depending on the quality and number of sites that link to it.&lt;/p&gt;

&lt;p&gt;If you know a bit or two about SEO, you might have heard of shady backlink techniques, which essentially amount to you getting links from an established site. This often takes the form of user-generated content such as comments and answers.&lt;/p&gt;

&lt;p&gt;While fighting spam is important, it is far more important to make sure that web remains linked, that people are credited for the content they create. Medium hosts 300,000 articles published by half a million users, and yet none of these links back to external website, because of something called “rel=nofollow”.&lt;/p&gt;

&lt;p&gt;When a link has a &lt;code class="language-plaintext highlighter-rouge"&gt;rel=nofollow&lt;/code&gt; attribute, search engines do not count it as a citation in their index. While this may be the right strategy for comments on a wordpress blog to prevent spam, this is not the right way to move forward if you want to “revolutionize the publishing industry”.&lt;/p&gt;

&lt;p&gt;While medium is not as bad as some other sites in this regard (like quora, which even blocks the internet archive), it is very important because it portrays itself as a “publishing platform”. This means, medium is made up of articles, blog posts, with lots of outbound links compared to, for instance, StackOverflow answers (which &lt;a href="http://meta.stackexchange.com/questions/111279/remove-nofollow-on-links-deemed-reputable"&gt;solved this problem back in 2011&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;If you publish content on medium, and provide relevant links for your readers, remember that these links are not considered as relevant by search engines.&lt;/p&gt;

&lt;p&gt;Medium has said that this is &lt;a href="https://twitter.com/lenkendall/status/432203084270292992"&gt;not a top priority&lt;/a&gt; at the moment for them.&lt;/p&gt;

&lt;p&gt;I understand completely. Handling spam would be a far more harder problem to solve than just blacklisting all outbound links. But we cannot go this way, if we want an open web. We need publishing platforms that cite content, and not blacklist it. This is why I write content on my own blog, and not on medium.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Mon, 06 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/04/06/medium-abuses-nofollow/</guid></item><item><title>2015-04-05</title><link>https://ho.dges.online/pictures/2015-04-05/</link><description>&lt;p&gt;Midnight on the Rest And Be Thankful. Probably the longest exposure I&amp;rsquo;ve done (10 mins!)&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sun, 05 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-04-05/</guid></item><item><title>Lazy Performance Comparison of WordPress and Ghost</title><link>https://www.anmolsarma.in/post/lazy-performance-comparison-of-wordpress-and-ghost/</link><description>&lt;p&gt;So, I switched to a new blogging platform. Again. After trying out a static approach, I moved back to a WordPress when I stumbled across &lt;a href="https://www.openshift.com/"&gt;OpenShift&lt;/a&gt; (&lt;em&gt;And their fantastic &lt;a href="https://www.openshift.com/products/pricing/plan-comparison"&gt;free plan&lt;/a&gt;&lt;/em&gt;). That was well over two years ago. In the meantime, I hardly blogged and didn&amp;rsquo;t really run into any issues but the blog did feel a tad sluggish.&lt;/p&gt;
&lt;p&gt;Fast-forward to yesterday when I had a sudden impulse to try something new. Ghost looked interesting so, I spun up an install using OpenShift&amp;rsquo;s &lt;a href="https://github.com/openshift-quickstart/openshift-ghost-quickstart"&gt;Ghost Quick-Start&lt;/a&gt; and proceeded to &lt;a href="https://ghostforbeginners.com/how-to-transfer-blog-posts-from-wordpress-to-ghost/"&gt;import data from my WordPress&lt;/a&gt; blog which turned out to be pretty painless.&lt;/p&gt;
&lt;p&gt;Given the same resources (&lt;em&gt;Small Gear&lt;/em&gt;) and same amount tweaking (i.e. none, using OpenShift&amp;rsquo;s quickstart installation defaults and using the default themes with no plugins), Ghost certainly &lt;em&gt;felt&lt;/em&gt; a lot faster but how fast was it really? To answer that (&lt;em&gt;And because I apparently have nothing better to do on a Friday night&lt;/em&gt;), I started a simultaneous stress test on WordPress and Ghost using &lt;a href="http://blazemeter.com/"&gt;BlazeMeter&lt;/a&gt; with a maximum of 50 users. The answer, as turns out is a &lt;strong&gt;helluva lot faster!&lt;/strong&gt;&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;td&gt; &lt;/td&gt;
&lt;td align="right"&gt;Avg. Latency&lt;/td&gt;
&lt;td align="right"&gt;Avg. Response Time&lt;/td&gt;
&lt;td align="right"&gt;90%&lt;/td&gt;
&lt;td align="right"&gt;95%&lt;/td&gt;
&lt;td align="right"&gt;99%&lt;/td&gt;
&lt;td align="right"&gt;Min&lt;/td&gt;
&lt;td align="right"&gt;Max&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Ghost&lt;/td&gt;
&lt;td align="right"&gt;255.05&lt;/td&gt;
&lt;td align="right"&gt;752.28&lt;/td&gt;
&lt;td align="right"&gt;739&lt;/td&gt;
&lt;td align="right"&gt;793&lt;/td&gt;
&lt;td align="right"&gt;4647&lt;/td&gt;
&lt;td align="right"&gt;602&lt;/td&gt;
&lt;td align="right"&gt;7240&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Wordpress&lt;/td&gt;
&lt;td align="right"&gt;12129.55&lt;/td&gt;
&lt;td align="right"&gt;21238.06&lt;/td&gt;
&lt;td align="right"&gt;33641&lt;/td&gt;
&lt;td align="right"&gt;37725&lt;/td&gt;
&lt;td align="right"&gt;52178&lt;/td&gt;
&lt;td align="right"&gt;2273&lt;/td&gt;
&lt;td align="right"&gt;67093&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;On average, Ghost&amp;rsquo;s response is &lt;strong&gt;28 times faster&lt;/strong&gt; and its latency is &lt;strong&gt;47 times lower&lt;/strong&gt;. Looking at how the two respond to load is interesting:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://www.anmolsarma.in/images/2015/04/Ghost-wordpress-responsetime.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://www.anmolsarma.in/images/2015/04/Ghost_Wordpress_latency.png" /&gt;&lt;/p&gt;
&lt;p&gt;Ghost doesn&amp;rsquo;t even seem to break a sweat while WordPress starts panting quite early into the run. The longest it took for Ghost to respond was &lt;strong&gt;7240 ms&lt;/strong&gt; which is almost a whole order of a magnitude faster than Wondpress&amp;rsquo;s &lt;strong&gt;67093 ms&lt;/strong&gt;. The shortest time for Ghost is &lt;strong&gt;602 ms&lt;/strong&gt;, a comfortable &lt;strong&gt;3.77 times&lt;/strong&gt; better than &lt;strong&gt;2273 ms&lt;/strong&gt; it took WordPress.&lt;/p&gt;
&lt;p&gt;Basically Ghost crushes WordPress in this admittedly lazy and unscientific test. It is pretty similar to what others have reported. If your personal WordPress setup is struggling to keep up with traffic, you should at least consider Ghost. It doesn&amp;rsquo;t have anywhere near the number of plugins or themes as WordPress, it clearly is not as mature (&lt;em&gt;It&amp;rsquo;s still in version 0.5.10&lt;/em&gt;) but boy is it fast! As for the writing flow, I can only say its different. I&amp;rsquo;m not entirely sure if it is better than what we have been used to (&lt;em&gt;No spell check&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;I for one am quite happy I tried (&lt;em&gt;And switched to&lt;/em&gt;) Ghost. And I got a blog post out it to boot!&lt;/p&gt;</description><author>Anmol Sarma</author><pubDate>Sat, 04 Apr 2015 21:40:03 GMT</pubDate><guid isPermaLink="true">https://www.anmolsarma.in/post/lazy-performance-comparison-of-wordpress-and-ghost/</guid></item><item><title>All hail Octocat!</title><link>https://bastian.rieck.me/blog/2015/hail_octocat/</link><description>&lt;p&gt;I am moving my personal projects to &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;. While I had a good run with the
simple &lt;code&gt;gitweb&lt;/code&gt; interface, it just is not up-to-date any more. I hope to increase the reach of my
projects via GitHub, in particular the &lt;a href="http://github.com/Pseudomanifold/QtOSG"&gt;QtOSG widget project&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You may find my main profile under &lt;a href="http://github.com/Pseudomanifold"&gt;http://github.com/Pseudomanifold&lt;/a&gt;.
My previous project domain, &lt;a href="http://git.annwfn.net"&gt;git.annwfn.net&lt;/a&gt; has been set up to
provide a permanent redirect to this profile.&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sat, 04 Apr 2015 17:38:36 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/hail_octocat/</guid></item><item><title>Why Casting List(T) Isn't a Thing: Examining an 'obvious' upcast that really isn't.</title><link>https://joshuarogers.net/articles/2015-04/why-casting-list-t-isnt-a-thing/</link><description>From time to time I hear a certain question floating around through the office, along the lines of &amp;ldquo;Why won't .NET let me pass my List&amp;lt;Thing&amp;gt; as a List&amp;lt;IThing&amp;gt;?&amp;rdquo;
The tone of the question usually suggests that someone is annoyed that .NET isn't smart enough to make such a simple inference. The reality though is that the compiler is smart enough to know that it can't.
You're kidding, right? If Thing is an IThing, then all the Thing in a List&amp;lt;Thing&amp;gt; must also be IThing.</description><author>Joshua Rogers</author><pubDate>Sat, 04 Apr 2015 15:00:00 GMT</pubDate><guid isPermaLink="true">https://joshuarogers.net/articles/2015-04/why-casting-list-t-isnt-a-thing/</guid></item><item><title>Thinking through substrate</title><link>https://liza.io/thinking-through-substrate/</link><description>&lt;p&gt;After checking in the basic substrate item implementation yesterday I got to thinking - never a good sign.&lt;/p&gt;
&lt;p&gt;The original idea was to have some pre-set types of substrate - garden dirt, rock, potting soil, pellets, whatever. &lt;em&gt;But&lt;/em&gt; how would these items affect the snails and the jar? Would I need to invent some sort of set of attribute templates? Like &amp;ldquo;Oh well this garden dirt item is going to decrease jar temperature by 1C.&amp;rdquo; and &amp;ldquo;Oh well some snails somehow don&amp;rsquo;t like gardend dirt and prefer other substrates&amp;rdquo;. But why? Why would a snail prefer one template to another and how would this be decided?&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 04 Apr 2015 13:21:27 GMT</pubDate><guid isPermaLink="true">https://liza.io/thinking-through-substrate/</guid></item><item><title>2015-04-04</title><link>https://ho.dges.online/pictures/2015-04-04/</link><description>&lt;p&gt;&lt;strong&gt;Breakfast for One.&lt;/strong&gt;&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Sat, 04 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-04-04/</guid></item><item><title>The Poor Man's Character Controller</title><link>https://etodd.io/2015/04/03/poor-mans-character-controller/</link><description>&lt;p&gt;
Let's say that, like so many of us, you want to make a surreal voxel-based
first-person parkour game. You're trying to figure out a production schedule.
What will take the longest? Graphics? Sound? Level design? I bet it will be the
character controller. And I bet it will take 4½ years. Why?
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
	In running/jumping games, player movement is paramount. It takes forever to
	nail the right feeling.
	&lt;/li&gt;
	&lt;li&gt;
	Each game is a unique snowflake. You will not find an article explaining
	how to design the controls for your specific game. You're flying blind.
	&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
That said, each game offers a few transferrable bits of wisdom. Here's my
story.
&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Sat, 04 Apr 2015 00:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/04/03/poor-mans-character-controller/</guid></item><item><title>Try cocoapods out</title><link>https://xenodium.com/try-cocoapods-out</link><description>&lt;p&gt;&lt;a href="https://github.com/CocoaPods/cocoapods-try"&gt;Cocapods try&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ pod try POD_NAME
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 03 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/try-cocoapods-out</guid></item><item><title>Cornwall travel bookmarks</title><link>https://xenodium.com/cornwall-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://barefootcornwall.com/on-the-road/"&gt;Food along the way&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 03 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/cornwall-travel-bookmarks</guid></item><item><title>Austria travel bookmarks</title><link>https://xenodium.com/austria-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/austria/vienna/travel-tips-and-articles/coffee-house-culture-in-vienna-where-to-get-your-caffeine-hit"&gt;Coffee houses in Vienna&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q%3Dmelk%2Baustria%2Blibrary&amp;amp;iax%3D1&amp;amp;ia%3Dimages"&gt;Melk Abbey library&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 03 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/austria-travel-bookmarks</guid></item><item><title>A 10 minutes walk into Grafana &amp;amp; Influxdb</title><link>https://blog.nobugware.com/post/2015/04/grafana_influxdb/</link><description>This is a 10 minute tutorial to set up an InfluxDB + Grafana with Go on your Mac, but should work with minor modifcations on your favorite Unix too, it assumes you already have a working Go compiler.
InfluxDB is a database specialized into time series, think store everything associated with a time, makes it perfect for monitoring and graphing values. Grafana is a js frontend capable of reading the data from InfluxDB and graphing it.</description><author>Fabrice Aneche</author><pubDate>Thu, 02 Apr 2015 19:49:04 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2015/04/grafana_influxdb/</guid></item><item><title>Java 8 and Functional Programming</title><link>https://danielpecos.com/2015/04/02/java-8-functional-programming/</link><description>&lt;p&gt;&lt;img alt="Duke Lambda" class="alignleft size-full" height="229" src="https://danielpecos.com/assets/2015/04/duke_lambda.jpg" width="230" /&gt;Purpose of this post is to provide a glimpse of the new features included in Java 8 that shift this language towards a more Functional Programming paradigm. But before, let’s define what we understand for Functional Programming (FP). Functional programming key characteristics include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Higher Order Functions&lt;/li&gt;
&lt;li&gt;Pure Functions and Immutability&lt;/li&gt;
&lt;li&gt;Tail Call Recursion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Higher Order Functions&lt;/strong&gt; for a FP language means that functions are considered first class citizens, allowing the programmer to use them as any other value the language defines, for example, a Function value:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;can be assigned to a variable defined with a proper type&lt;/li&gt;
&lt;li&gt;can be passed or returned to/from another functions, allowing functions to be composed or _curried_ (partially applied).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Pure Functions&lt;/strong&gt; are those functions that don’t produce &lt;em&gt;side effects&lt;/em&gt;. Instead of directly modifying data structures within the function body, those data structures are returned as result of the invocation. This behaviour results in &lt;strong&gt;Immutable data structures&lt;/strong&gt;, which are far less error prone than classical mutable data structures.&lt;/p&gt;
&lt;img alt="Tail recursion" class=" size-medium alignright" height="300" src="https://danielpecos.com/assets/2015/04/xkcd-functional-252x300.png" width="252" /&gt;
&lt;p&gt;&lt;strong&gt;Tail Call Recursion&lt;/strong&gt; allows a compiler to reuse a call stack frame in a recursive algorithm, making the execution behave (in terms of memory allocation) as if it were an iterative algorithm. Instead of allocating new stack frames for every recursive call, if the structure of the call follows an specific pattern, the compiler then can reuse same frame, making possible the use recursion without any increase in program’s memory footprint.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://danielpecos.com/assets/2015/04/tail_call.jpg"&gt;&lt;img alt="Tail Call Optimization" class="aligncenter size-medium" height="216" src="https://danielpecos.com/assets/2015/04/tail_call-300x216.jpg" width="300" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, what does Java 8 include in order to make FP paradigm closer to the programmer? The key feature included in this release is are &lt;strong&gt;Lambda Expressions&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;But what’s a Lambda Expression? Well, it just a syntactic sugar included in the language,  reducing the amount of code needed to work with anonymous classes. Lambdas’ its syntax kind of reminds of a closure or monad, but let’s better see an example of a lambda:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; System.out.println("Hello Lambdas!");
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But, as previously said, this could also be defined as anonymous class, as this is &lt;em&gt;just&lt;/em&gt; syntactic sugar (let’s assume that &lt;em&gt;LambadInterface&lt;/em&gt; is an already defined interface with one method &lt;em&gt;apply&lt;/em&gt;):&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;new LambdaInterface {
   @Override
   public void apply() {
      System.out.println("Hello... Lambdas?");
   }
};
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Not quite the same? Let’s evolve these pieces of code a little bit further:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; System.out.println("Hello Lambdas!");
lamdba.apply(); // Hello Lambdas!

LambdaInterface lambda = new LambdaInterface {
   public void apply() {
      System.out.println("Hello... Lambdas?");
   }
};
lamdba.apply(); // Hello... Lambdas?
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;How do Lambdas differ from FP &lt;em&gt;Closures?&lt;/em&gt; Well, a closure is an anonymous function packed with the context where it was defined, being able to modify it’s context (context defined variables are, in fact, &lt;em&gt;closed&lt;/em&gt;) . Java 8 Lambdas can access external context variables but only if they’re defined as &lt;em&gt;final&lt;/em&gt; or if the programmer assures that they are not going to change their value (are actually &lt;em&gt;final&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;We said that &lt;strong&gt;Function Composition&lt;/strong&gt; is also another key characteristic of FP, so, are Lambdas composable? Let’s see an actual example of Lambdas composition in action:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; n * 2;
Function&amp;amp;lt;Integer, Integer&amp;amp;gt; increment = (n) -&amp;gt; n + 1;

Function&amp;amp;lt;Integer, Integer&amp;amp;gt; doublePlusOne = duplicate.andThen(increment);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Unfortunately, &lt;strong&gt;Tail recursion&lt;/strong&gt; is not included in Java 8, so we’ll still have to be cautious with memory consumption in recursive algorithms.&lt;/p&gt;
&lt;p&gt;In future posts, we’ll deep into Lambdas and Functional Interfaces, and how they allow us to create a cleaner and more expressive code.&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Thu, 02 Apr 2015 12:54:58 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2015/04/02/java-8-functional-programming/</guid></item><item><title>Jar substrate is a go</title><link>https://liza.io/jar-substrate-is-a-go/</link><description>&lt;p&gt;It&amp;rsquo;s finally in. Well, the beginning stages anyway. Jar substrate. Anyone who knows anything about snails knows that they can&amp;rsquo;t live in a glass box without some sort of substrate to hide in, get moisture from, and burrow under. So now you can apply one type of substrate (so far) to a jar. Eventually there will be different kinds of substrate, and maybe even substrate you can mix together from other types of substrate. Currently the substrate has no effect on the snails or the environment outside of being present and visually represented, but eventually it can impact everything from snail nutrients to jar temperature and what kinds of plants you can grow inside the jar. Here&amp;rsquo;s how it works.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 02 Apr 2015 11:41:21 GMT</pubDate><guid isPermaLink="true">https://liza.io/jar-substrate-is-a-go/</guid></item><item><title>Tackling Gastropoda's memory usage - Round One</title><link>https://liza.io/tackling-gastropodas-memory-usage-round-one/</link><description>&lt;p&gt;I&amp;rsquo;ve been having to power cycle my Gastropoda Digital Ocean droplet every day lately because something was hogging up all the memory. It was a little annoying to diagnose because I know the problem had to do with the recurring events that are run using a cron job, of which there are quite a few. I know ideally PHP isn&amp;rsquo;t something you would use for a long running server process, but these jobs weren&amp;rsquo;t long running - they were just frequent.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 02 Apr 2015 10:20:27 GMT</pubDate><guid isPermaLink="true">https://liza.io/tackling-gastropodas-memory-usage-round-one/</guid></item><item><title>Cinnamon desktop run dialog</title><link>https://xenodium.com/cinnamon-desktop-run-dialog</link><description>&lt;p&gt;Note to self. Open with Alt-f2.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 02 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/cinnamon-desktop-run-dialog</guid></item><item><title>Antimony</title><link>https://mattkeeter.com/projects/antimony/3</link><description>A fresh look at CAD software</description><author>Matt Keeter</author><pubDate>Thu, 02 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://mattkeeter.com/projects/antimony/3</guid></item><item><title>Protecting Users from Phishing and Fraud</title><link>https://www.brightball.com/articles/protecting-users-from-phishing-and-fraud</link><description>This presentation covers my experiences combatting phishing and fraud using DMARC and assorted other techniques in a large eBay-like platform for a niche market...when the site previously did everything over direct user email...for over a decade. Good times.</description><author>Brightball Articles</author><pubDate>Thu, 02 Apr 2015 01:47:23 GMT</pubDate><guid isPermaLink="true">https://www.brightball.com/articles/protecting-users-from-phishing-and-fraud</guid></item><item><title>Talk Python To Me Podcast Episode #1: EVE RESTful APIs for Humans</title><link>https://nicolaiarocci.com/talk-python-to-me-podcast-episode-1-eve-restful-apis-for-humans/</link><description>&lt;p&gt;I was lucky enough be the first guest for the shiny new &lt;a href="http://www.talkpythontome.com"&gt;Talk Python To Me Podcast&lt;/a&gt; hosted by Michael Kennedy. In this episode we talk about Eve an my other open source releases, which gives us an excuse to touch on a variety of topics such as Polyglot Programming, New Microsoft and the .NET evolution, MongoDB and the Open Source eco-system as seen from the point of view of an old fart who has been spending most of his career in closed systems.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 01 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/talk-python-to-me-podcast-episode-1-eve-restful-apis-for-humans/</guid></item><item><title>Google Drive: Publicly hosting a static website</title><link>https://www.seanw.org/blog/publicly-host-and-share-websites-on-google-drive/</link><description>I frequently need to demo work in progress web sites and web apps to people I&amp;rsquo;m working with. I was looking for the most convenient way to do this and found that Google Drive was a good fit to letting me publicly share web development projects.
Google Drive provides an easy way to store and share documents in the cloud. The Google Drive desktop app also conveniently keeps a folder on your machine in sync with your online Google Drive folder in the same way Dropbox does.</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Wed, 01 Apr 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/publicly-host-and-share-websites-on-google-drive/</guid></item><item><title>DRY Configuration</title><link>https://www.craigpardey.com/post/2015-03-30-dry-config/</link><description>&lt;p&gt;Externalizing application configuration values into a properties file is a common pattern in enterprise applications, because it gets the environment-specific settings out of the code and avoids the need for environment-specific builds. Being able to deploy the same binary to multiple environments (Dev, QA, UAT, Production) is a Good Thing.&lt;/p&gt;
&lt;p&gt;I came across an interesting quirk in an application recently. I needed to change the port of the application server for one of the app&amp;rsquo;s components, and the port value was wired up via Spring using some code that looked like this:&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Mon, 30 Mar 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2015-03-30-dry-config/</guid></item><item><title>Sqlplus is my second home, part 8: Embedding multiple sqlplus arguments into one variable</title><link>https://tanelpoder.com/2015/03/29/sqlplus-is-my-second-home-part-8-embedding-multiple-sqlplus-arguments-into-one-variable/</link><description>&lt;p&gt;I’ve updated some of my &lt;a class="broken_link" href="https://github.com/tanelpoder/tpt-oracle/blob/master/ash/" target="_blank"&gt;ASH scripts&lt;/a&gt; to use these 4 arguments in a standard way:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What ASH columns to display (and aggregate by)&lt;/li&gt;
&lt;li&gt;Which ASH rows to use for the report (filter)&lt;/li&gt;
&lt;li&gt;Time range start&lt;/li&gt;
&lt;li&gt;Time range end&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So this means whenever I run &lt;a href="https://github.com/tanelpoder/tpt-oracle/blob/master/ash/ashtop.sql" target="_blank"&gt;ashtop&lt;/a&gt; (or &lt;a href="https://github.com/tanelpoder/tpt-oracle/blob/master/ash/dashtop.sql" target="_blank"&gt;dashtop&lt;/a&gt;) for example, I need to type in all 4 parameters. The example below would show top SQL_IDs only for user SOE sessions from last hour of ASH samples:&lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Mon, 30 Mar 2015 00:23:51 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2015/03/29/sqlplus-is-my-second-home-part-8-embedding-multiple-sqlplus-arguments-into-one-variable/</guid></item><item><title>Books for 2015</title><link>https://xenodium.com/books-for-2015</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Catch-22-Vintage-Classics-Joseph-Heller/dp/0099470462"&gt;Catch 22&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Circle-Dave-Eggers/dp/0804172293"&gt;The Circle&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Born-Run-Hidden-Ultra-Runners-Greatest/dp/1861978774"&gt;Born to Run&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Thinking-Fast-Slow-Daniel-Kahneman/dp/0141033576"&gt;Thinking, Fast and Slow&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 29 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/books-for-2015</guid></item><item><title>Ayahuasca bookmarks</title><link>https://xenodium.com/ayahuasca-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ayaadvisor.org/listings/onanya-joni-shipibo-europe/"&gt;Ayaadvisor&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.erowid.org/chemicals/ayahuasca/ayahuasca_death.shtml"&gt;Ayahuasca fatalities&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://erowid.org/chemicals/ayahuasca/"&gt;Ayahuasca on erowid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cbc.ca/m/news/canada/jennifer-logan-s-death-in-peru-puts-focus-on-purging-ceremonies-1.2948955"&gt;Jennifer Logan's death in Peru&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@Grayfox/the-hacker-who-drank-ayahuasca-517148aa1ed4"&gt;The hacker who drank Ayahuasca&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 29 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/ayahuasca-bookmarks</guid></item><item><title>On proper git commit messages and frequent git pushes</title><link>https://blog.erethon.com/blog/2015/03/28/on-proper-git-commit-messages-and-frequent-git-pushes/</link><description>&lt;p&gt;
&lt;code class="verbatim"&gt;Edit: This post was written many years ago. Back then I was a lot more&lt;/code&gt;
&lt;code class="verbatim"&gt;strict on how other people did things and I now understand this was a mistake.
I'm leaving this post here as a reminder of past mistakes.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;
Note: this is a rant on how people use git.&lt;/p&gt;
&lt;p&gt;
When I was introduced to git, I was told I should read this &lt;a href="http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html"&gt;great post
on git commit messages&lt;/a&gt; by &lt;a href="http://tpo.pe/"&gt;Tim Pope&lt;/a&gt;. Ever since, I've been trying to
follow that system in all of my commits across all projects.&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Sat, 28 Mar 2015 15:37:51 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2015/03/28/on-proper-git-commit-messages-and-frequent-git-pushes/</guid></item><item><title>Emacs init.el bookmarks</title><link>https://xenodium.com/emacs-init.el-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/daschwa/emacs.d"&gt;Adam Schwartz's init&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/apg/emacs-config/tree/master/lisp/activator.d"&gt;Andrew Gwozdziewycz's init.el&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cs.utah.edu/~aek/code/init.el.html"&gt;Andrew Kensler's init.el&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Droogans/.emacs.d/blob/mac/init.el"&gt;Andrew's .emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ikame/.emacs.d-literate"&gt;Anler Hernandez's literate config&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/redguardtoo/emacs.d/"&gt;Chen Bin's init.el&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/eastwood/config/blob/master/emacs.d/org-init.org"&gt;Clinton Ryan's init (JS config)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/daviderestivo/emacs-config/blob/master/README.md"&gt;daviderestivo/emacs-config (clean/macOS)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/iocanel/dotfiles/blob/master/.config/emacs/config.org"&gt;dotfiles/config.org at master · iocanel/dotfiles · GitHub (mu4e config)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.emacswiki.org/emacs/StarterKits"&gt;EmacsWiki: Starter Kits&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ejmr/DotEmacs/blob/master/.emacs"&gt;Eric James Michael Ritz&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alhassy/emacs.d"&gt;GitHub - alhassy/emacs.d: My Emacs configuration, literately&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rememberYou/.emacs.d/"&gt;GitHub - FIXME rememberYou/.emacs.d: Personal GNU Emacs configuration&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Fuco1/.emacs.d"&gt;GitHub - Fuco1/.emacs.d: My emacs config&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MatthewZMD/.emacs.d"&gt;GitHub - MatthewZMD/.emacs.d: M-EMACS, a full-feature GNU Emacs configuration&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zamansky/emacs.dz"&gt;GitHub - zamansky/emacs.dz: Awesome emacs config files&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zoliky/dotemacs"&gt;GitHub - zoliky/dotemacs: My GNU Emacs configuration (super clean)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grettke/home/blob/master/ALEC.txt"&gt;Grant Rettke's literate config&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://doc.rix.si/org/fsem.html"&gt;Hardcore Freestyle Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/huseyinyilmaz/emacs-config/blob/master/lisp/user-init.el"&gt;Huseyin Yilmaz&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ianpan870102/.personal-emacs.d/blob/master/init.el"&gt;ianpan870102/.personal-emacs.d&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ivanmalison.github.io/dotfiles/"&gt;Ivan Malison's Emacs init&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ivanmalison.github.io/dotfiles/#colorizecompliationbuffers"&gt;Ivan Malison's init.el&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.john2x.com/emacs.html"&gt;John's Emacs Config (mu4e and ledger usage)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://justin.abrah.ms/dotfiles/emacs.html"&gt;Justin Abrahms: My Emacs Configuration&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ladicle.com/post/config/"&gt;Ladicle's Emacs Configuration&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MatthewZMD/.emacs.d#lsp"&gt;M-EMACS's lsp config&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/msparks/dotfiles/blob/master/.emacs"&gt;Mark Sparks's init.el&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/CQQL/dotfiles/blob/master/src/.emacs.d/init.el"&gt;Marten Lienen's init.el&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://writequit.org/org/settings.html"&gt;Mathew Lee Hinman's Emacs settings file&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/angrybacon/dotemacs/blob/master/dotemacs.org"&gt;Mathieu Marques's wonderful literary config (uses tern for Javascript)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/abdullin/emacs.d/blob/master/emacs.org"&gt;Rinat Abdullin's literary config&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/To1ne/temacco"&gt;Temacco's init&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/to1ne/temacco"&gt;Temacco's Plutonium empowered emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wasamasa/dotemacs/blob/master/TODO.org"&gt;Wasamama's extensive init TODO &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zzamboni.org/post/my-emacs-configuration-with-commentary/"&gt;zzamboni.org | My Emacs Configuration, With Commentary&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etienne.depar.is/emacs.d/init.html"&gt;Étienne Deparis's Emacs Main Initialization File&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 28 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-init.el-bookmarks</guid></item><item><title>CSS vertical align using flex</title><link>https://xenodium.com/css-vertical-align-using-flex</link><description>&lt;p&gt;Codepen &lt;a href="http://codepen.io/oisinlavery/pen/Jmjtz"&gt;snippet&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-css"&gt;div{
  height: 200px;
  background: #ccc;
  display: flex;
  justify-content: center;
  align-items: center;
}

p{
  margin: auto
}
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 28 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/css-vertical-align-using-flex</guid></item><item><title>[3.27.15] Dell 3007 Repair</title><link>https://transistor-man.com/Dell_3007_repair.html</link><description>A quick 'upgrade' of a dell 3007 monitor to address power supply brownout due to thermal loading.</description><author>transistor-man.com</author><pubDate>Fri, 27 Mar 2015 10:38:38 GMT</pubDate><guid isPermaLink="true">https://transistor-man.com/Dell_3007_repair.html</guid></item><item><title>Team Culture by Merlin Mann</title><link>https://ho.dges.online/words/commonplace/team-culture-by-merlin-mann/</link><description>&lt;blockquote&gt;
&lt;p&gt;Most team culture comes out of a combination of what is tolerated and what is rewarded. If you legit want your culture to improve, change what you reward and rethink what you will tolerate.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>ho.dges.online</author><pubDate>Fri, 27 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/team-culture-by-merlin-mann/</guid></item><item><title>How Celery Chord Synchronization Works</title><link>http://blog.untrod.com/2015/03/how-celery-chord-synchronization-works.html</link><description>&lt;p&gt;Celery is a powerful tool for managing asynchronous tasks in
Python. The basic model is synchronous Python code pushes a task
(in the form of a serialized message) into a message queue (the Celery
"broker", which can be a variety of technologies - Redis, RabbitMQ,
Memcached, or even a database), and …&lt;/p&gt;</description><author>Untrod</author><pubDate>Thu, 26 Mar 2015 19:20:00 GMT</pubDate><guid isPermaLink="true">http://blog.untrod.com/2015/03/how-celery-chord-synchronization-works.html</guid></item><item><title>London diving schools</title><link>https://xenodium.com/london-diving-schools</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://londonschoolofdiving.co.uk"&gt;London Diving School&lt;/a&gt;. Not heard good comments.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.divewimbledon.com"&gt;Dive Wimbledon&lt;/a&gt;. Heard ok comments.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.clidive.org/"&gt;Clidive&lt;/a&gt; is a BSAC club (amateur organisation). Not commercial but may take longer.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sublimediving.co.uk/"&gt;Sublime Diving&lt;/a&gt;. Heard good comments.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.oysterdiving.com/"&gt;Oyster Diving&lt;/a&gt;. Pool in cetral London. Good comments.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/SS_Thistlegorm"&gt;SS Thistlegorm&lt;/a&gt; mentioned as a memorable site.&lt;/li&gt;
&lt;li&gt;Many suggest to get certified elsewhere. Perhaps Egypt via &lt;a href="http://www.poseidondivers.com/"&gt;Poseidon Divers&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 26 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/london-diving-schools</guid></item><item><title>Helm buffer URLs</title><link>https://xenodium.com/helm-buffer-urls</link><description>&lt;p&gt;Venturing into Emacs lisp and &lt;a href="https://github.com/emacs-helm/helm"&gt;Helm&lt;/a&gt;. Here's a go at listing all URLs in current buffer.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(require 'goto-addr)

(defun ar/helm-buffer-url-candidates ()
  &amp;quot;Generate helm candidates for all URLs in buffer.&amp;quot;
  (save-excursion
    (goto-char (point-min))
    (let ((helm-candidates '())
          (url))
      (while (re-search-forward goto-address-url-regexp
                                nil t)
        (setq url
              (buffer-substring-no-properties (match-beginning 0)
                                              (match-end 0)))
        (add-to-list 'helm-candidates
                     (cons url
                           url)))
      helm-candidates)))

(defun ar/helm-buffer-urls ()
  &amp;quot;Narrow down and open a URL in buffer.&amp;quot;
  (interactive)
  (helm :sources `(((name . &amp;quot;Buffer URLs&amp;quot;)
                    (candidates . ,(ar/helm-buffer-url-candidates))
                    (action . (lambda (url)
                                (browse-url url)))))))
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 26 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/helm-buffer-urls</guid></item><item><title>Groovy to be part of the Apache Software Foundation</title><link>https://danielpecos.com/2015/03/25/groovy-part-of-apache-software-foundation/</link><description>&lt;p&gt;&lt;img alt="Groovy" class="alignleft size-medium" height="150" src="https://danielpecos.com/assets/2015/03/groovy-logo-300x150.png" width="300" /&gt;As March 11th, &lt;a href="http://blog.pivotal.io/pivotal/news-2/groovy-2-4-and-grails-3-0-to-be-last-major-releases-under-pivotal-sponsorship"&gt;Pivotal dropped its financial sponsorship for Groovy&lt;/a&gt;, and despite of not really endangering it, as Groovy is an already well established language with a great community backing it, it raised many concerns, as the required boost a platform like this deserves was missing until now. Furthermore, its creator and project leader until lately, &lt;a href="http://restlet.com/blog/2015/03/02/head-of-groovy-project-joins-restlet-to-lead-api-development-tools/"&gt;Guillaume Laforge, also recently stepped back&lt;/a&gt; in order to focus in Restlet.&lt;/p&gt;
&lt;p&gt;Also the recent release of Java 8, with the introduction of lambdas into the Java language has increased the interest and traction of Java, making a lot of people question if there were still room for other JVM languages, even more being so closed to Java.&lt;/p&gt;
&lt;p&gt;So being worried about Groovy’s future is a normal consequence of this recent events. But don’t forget that this language has been community driven for a long time now, making this changes have a lower impact than initially expected.&lt;/p&gt;
&lt;p&gt;So in order to clarify them, &lt;a href="https://blogs.apache.org/foundation/entry/groovy_submitted_to_become_a"&gt;moving to the Apache Software Foundation&lt;/a&gt; has been a really smart move by the community, and as &lt;a href="http://melix.github.io/blog/2015/02/who-is-groovy.html"&gt;Cédric Champeu explains&lt;/a&gt;, a natural next step in Groovy&amp;rsquo;s lifetime that will help it weathering those changes.&lt;/p&gt;
&lt;p&gt;This backup guarantees the position Groovy has as a trending alternative inside the JVM, making it still the most successful productivity booster and most enjoyable language, compared to the Old Java Language, within the JVM.&lt;/p&gt;
&lt;p&gt;Further references:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://groovy.dzone.com/articles/groovy-submitted-apache"&gt;http://groovy.dzone.com/articles/groovy-submitted-apache&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Wed, 25 Mar 2015 20:06:15 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2015/03/25/groovy-part-of-apache-software-foundation/</guid></item><item><title>Things That Have Almost Killed Me</title><link>https://jonpauluritis.com/articles/things-that-have-almost-killed-me/</link><description>&lt;p&gt;I’m celebrating my 30th birthday November 4th. I am completely flabbergasted that I have lived this long. So in honor of my 30th I’d like to put out to the world a list of things that could have killed me, or could have led to situations that could have killed me.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fell off a cliff at a rock quarry into a foot and a half of water&lt;/li&gt;
&lt;li&gt;Broke my back snowboarding (later broke my clavicle snowboarding)&lt;/li&gt;
&lt;li&gt;Fist fight at our Christmas formal that Heavy B saved me from having a 1.75 bottle of Jack Daniels smashed through the back of my head.&lt;/li&gt;
&lt;li&gt;Having a old guy crash through the window into our retail location with his car.&lt;/li&gt;
&lt;li&gt;3 car accidents&lt;/li&gt;
&lt;li&gt;1 near car accident because we were having a 6 person Nerf gun fight in a mini-van I was driving, but its okay because we won&lt;/li&gt;
&lt;li&gt;Almost hit by a NYC subway&lt;/li&gt;
&lt;li&gt;Food poisoning in Tianjin China.&lt;/li&gt;
&lt;li&gt;Almost drowned surfing hurricane swell at Salt Creek (double overhead)&lt;/li&gt;
&lt;li&gt;Guy at Johnny Brenda’s in Fishtown pulled his gun on us&lt;/li&gt;
&lt;li&gt;Almost drowned by pod of dauphins&lt;/li&gt;
&lt;li&gt;Hit a deer with a car in Minnesota&lt;/li&gt;
&lt;li&gt;United almost crashing the plane on my way home to California (totally not kidding) last December&lt;/li&gt;
&lt;li&gt;(New! 2023) Guy at a basketball game threatened me and my team mates with a gun, SWAT team was called in full blazing AR-15s and Shotguns. The guy slipped out the back door.&lt;/li&gt;
&lt;li&gt;Not really life threatening but I feel like its worth mentioning I was almost Deported back to Canada (I have dual-citizenship)&lt;/li&gt;
&lt;li&gt;Fell off a rooftop in Philadelphia&lt;/li&gt;
&lt;/ul&gt;</description><author>JonPaulUritis.com</author><pubDate>Wed, 25 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jonpauluritis.com/articles/things-that-have-almost-killed-me/</guid></item><item><title>Oracle Exadata Performance: Latest Improvements and Less Known Features</title><link>https://tanelpoder.com/2015/03/24/oracle-exadata-performance-latest-improvements-and-less-known-features/</link><description>&lt;p&gt;Here are the slides of a presentation I did at the IOUG Virtual Exadata conference in February. I’m explaining the basics of some new Oracle 12c things related to Exadata, plus current latest cellsrv improvements like Columnar Flash Cache and IO skipping for Min/Max retrieval using Storage Indexes:&lt;/p&gt;

&lt;p&gt;Note that Christian Antognini and Roger MacNicol have written separate articles about some new features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://antognini.ch/2015/03/exadata-storage-index-minmax-optimization/" target="_blank"&gt;&lt;a href="http://antognini.ch/2015/03/exadata-storage-index-minmax-optimization/"&gt;http://antognini.ch/2015/03/exadata-storage-index-minmax-optimization/&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogs.oracle.com/smartscan-deep-dive/entry/examining_the_new_columnar_cache" target="_blank"&gt;&lt;a href="https://blogs.oracle.com/smartscan-deep-dive/entry/examining_the_new_columnar_cache"&gt;https://blogs.oracle.com/smartscan-deep-dive/entry/examining_the_new_columnar_cache&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description><author>Tanel Poder Blog</author><pubDate>Tue, 24 Mar 2015 16:57:51 GMT</pubDate><guid isPermaLink="true">https://tanelpoder.com/2015/03/24/oracle-exadata-performance-latest-improvements-and-less-known-features/</guid></item><item><title>VoCore OpenWRT as NAT access point</title><link>https://allanrbo.blogspot.com/2015/03/vocore-openwrt-as-nat-access-point.html</link><description>&lt;p&gt;I recently bought a &lt;a href="http://vocore.io/"&gt;VoCore&lt;/a&gt;. It came pre-flashed with OpenWRT Chaos Calmer (as of 2015-03-16). OpenWRT was configured as a wireless access point, bridging with the ethernet port. Here is what I did to get it to a configuration where it acts as a NAT'ing wireless access point, similar to most consumer routers/access points:&lt;/p&gt;

&lt;p&gt;SSH'ed to its default IP of 192.168.61.1.&lt;/p&gt;

&lt;p&gt;Edited /etc/config/network:&lt;/p&gt;
&lt;pre&gt;...
#config interface 'lan'
config 'interface' 'wan'
      option macaddr 'b8:d8:12:60:00:01'
      option proto 'dhcp'

config interface 'lan'
  option force_link '1'
  option macaddr 'b8:d8:12:60:00:02'
  option proto 'static'
  option ipaddr '192.168.61.1'
  option netmask '255.255.255.0'
...
&lt;/pre&gt;

&lt;p&gt;Edited /etc/config/wireless:&lt;/p&gt;
&lt;pre&gt;...
config wifi-iface
      option device   radio0
      option network  lan
      option mode     ap
      option ssid     gaffel8080
      option encryption psk2
      option key palle123
...
&lt;/pre&gt;

&lt;p&gt;Edited /etc/config/dhcp:&lt;/p&gt;
&lt;pre&gt;...
#config odhcpd 'odhcpd'
# option maindhcp '0'
# option leasefile '/tmp/hosts/odhcpd'
# option leasetrigger '/usr/sbin/odhcpd-update'
...
&lt;/pre&gt;

&lt;p&gt;To enable SSH from the ethernet port, I also edited /etc/config/firewall:&lt;/p&gt;
&lt;pre&gt;...
config rule
      option src wan
      option proto tcp
      option dst_port 22
      option target ACCEPT
&lt;/pre&gt;

&lt;p&gt;This was all that was needed for the basic scenario of using VoCore as an accesspoint combined with a NAT'ing router.&lt;/p&gt;

&lt;p&gt;I went a little further and installed some nice to have packages like openssh-sftp-server, nano, htop, ip, etc. However, in order to do this, I first had to fix /etc/opkg.conf:&lt;/p&gt;
&lt;pre&gt;...
#src/gz cheese_base http://downloads.openwrt.org/snapshots/trunk/ramips/packages/base
#src/gz cheese_luci http://downloads.openwrt.org/snapshots/trunk/ramips/packages/luci
src/gz chaos_calmer_base http://downloads.openwrt.org/snapshots/trunk/ramips/generic/packages/base/
src/gz chaos_calmer_luci http://downloads.openwrt.org/snapshots/trunk/ramips/generic/packages/luci/
src/gz chaos_calmer_management http://downloads.openwrt.org/snapshots/trunk/ramips/generic/packages/management/
src/gz chaos_calmer_packages http://downloads.openwrt.org/snapshots/trunk/ramips/generic/packages/packages/
src/gz chaos_calmer_routing http://downloads.openwrt.org/snapshots/trunk/ramips/generic/packages/routing/
src/gz chaos_calmer_telephony http://downloads.openwrt.org/snapshots/trunk/ramips/generic/packages/telephony/
&lt;/pre&gt;

&lt;p&gt;After that I could install the extra packages by running the following:&lt;/p&gt;
&lt;pre&gt;opkg update
opkg install openssh-sftp-server
opkg install nano
opkg install htop
opkg install ip
&lt;/pre&gt;

&lt;p&gt;Also, I recommend disabling Luci, as it is buggy, and a security concern:&lt;/p&gt;
&lt;pre&gt;rm /www/cgi-bin/luci
echo "A private box" &amp;gt; /www/index.html
&lt;/pre&gt;</description><author>Allan's Blog</author><pubDate>Tue, 24 Mar 2015 02:43:53 GMT</pubDate><guid isPermaLink="true">https://allanrbo.blogspot.com/2015/03/vocore-openwrt-as-nat-access-point.html</guid></item><item><title>Darknet Market Basket Analysis</title><link>https://www.ryancompton.net/2015/03/24/darknet-market-basket-analysis.html</link><description>The Evolution darknet marketplace was an online black market which operated from January 2014 until Wednesday of last week when it suddenly disappeared. A few days later, in a reddit post, gwern released a torrent containing daily wget crawls of the site dating back to its inception. I ran some off-the-shelf affinity analysis on the dataset – here’s what I found: Products can be categorized based on who sells them On Evolution there are a few top-level categories (“Drugs”, “Digital Goods”, “Fraud Related” etc.) which are subdivided into product-specific pages. Each page contains several listings by various vendors. I built a graph between products based on vendor co-occurrence relationships, i.e. each node corresponds to a product with edge weights defined by the number of vendors who sell both incident products. So, for example, if there are 3 vendors selling both mescaline and 4-AcO-DMT then my graph has an edge with weight 3 between the mescaline and 4-AcO-DMT nodes. I used graph-tool’s implementation of stochastic block model-based hierarchal edge bundling to generate the below visualization of the Evolution product network: The graph is available in graphml format here. It contains 73 nodes and 2,219 edges (I found a total of 3,785 vendors in the data). Edges with higher weights are drawn more brightly. Nodes are clustered with a stochastic block model and nodes within the same cluster are assigned the same color. There is a clear division between the clusters on the top half of the graph (correpsonding to drugs) and the clusters on the bottom half (corresponding to non-drugs, i.e. weapons/hacking/credit cards/etc.). This suggests that vendors who sold drugs were not as likely to sell non-drugs and vice versa.</description><author>Ryan Compton</author><pubDate>Tue, 24 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.ryancompton.net/2015/03/24/darknet-market-basket-analysis.html</guid></item><item><title>Java 8 one year later</title><link>https://danielpecos.com/2015/03/23/java-8-one-year-later/</link><description>&lt;p&gt;&lt;img alt="Duke - Java 8" class="alignleft size-medium" height="285" src="https://danielpecos.com/assets/2015/03/duke-java-8-e1427183087802-300x285.png" width="300" /&gt;It’s been a little more than a year since &lt;a href="https://www.java.com/en/download/faq/release_dates.xml"&gt;Java 8 was released (2014/03/18)&lt;/a&gt; and you might think that it’s a little too late for a &lt;em&gt;What’s new in&lt;/em&gt; post. In fact latest public update available is 8u40, so let’s review not only what was initially included in Java 8, but what else has changed during this first year, up to release 8u40.&lt;/p&gt;
&lt;p&gt;Lots of changes were included in the initial Java 8 release, being probably the most notable of them, in my opinion (feel free to disagree, looking forward to discussions):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java Language
&lt;ul&gt;
&lt;li&gt;Lambda Expressions&lt;/li&gt;
&lt;li&gt;Method references&lt;/li&gt;
&lt;li&gt;Default methods&lt;/li&gt;
&lt;li&gt;Functional interfaces&lt;/li&gt;
&lt;li&gt;Method parameter reflection&lt;/li&gt;
&lt;li&gt;Optional references&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;API
&lt;ul&gt;
&lt;li&gt;Collections Streams API&lt;/li&gt;
&lt;li&gt;Date-Time API (based on the popular Joda time library)&lt;/li&gt;
&lt;li&gt;Parallel Array Sorting&lt;/li&gt;
&lt;li&gt;Base64 encoding and decoding&lt;/li&gt;
&lt;li&gt;Unsigned Arithmetic Support&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tools
&lt;ul&gt;
&lt;li&gt;Nashorn Script Engine – Javascript in the JVM&lt;/li&gt;
&lt;li&gt;Java Mission Control&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;… among many other optimizations, fixes and new capabilities. You can get a fully detailed changelog detail &lt;a href="http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We’re not going to go into further detail for these new characteristics, as you’ll find plenty of articles about them. Furthermore some of those would require entire books to proper explain and deal with them, and that’s not the purpose of this article.&lt;/p&gt;
&lt;p&gt;But let’s review &lt;a href="http://www.oracle.com/technetwork/java/javase/8u-relnotes-2225394.html"&gt;what has changed during this first year of Java 8’s life&lt;/a&gt; (up to 8u40 release). Again, these are the most important in my opinion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New jdeps analysis tool&lt;/li&gt;
&lt;li&gt;Advanced Management Console (AMC)&lt;/li&gt;
&lt;li&gt;New Garbage Collection Tuning Guide added to JDK 8 documentation&lt;/li&gt;
&lt;li&gt;SSLv3 disabled by default&lt;/li&gt;
&lt;li&gt;Java Flight Recorder can be enabled in runtime&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;… and many other improvements and bugfixes.&lt;/p&gt;
&lt;p&gt;And last but no least, we should talk about Java 8 adoption rate, which &lt;a href="http://jaxenter.com/java-2-111936.html"&gt;has been surprisingly higher than initially expected&lt;/a&gt; based on a &lt;a href="http://info.typesafe.com/COLL-2014-10-20-Java-8-II-Survey-Report-LP.html?lsd=COLL-2014-10-20-Java-8-II-Survey-Report"&gt;Typesafe’s survey&lt;/a&gt;:&lt;/p&gt;
&lt;img alt="Java 8 Upgrade Plans" class="aligncenter size-full" height="387" src="https://danielpecos.com/assets/2015/03/typesafejava8.jpg" width="448" /&gt;
&lt;p&gt;Interestingly, one of the conclusions extracted from that survey is that the inclusion of Lambdas in the Java language has not hurt Scala at all, but validated its approach to Functional Programming:&lt;/p&gt;
&lt;img alt="Java 8 vs Scala" class="aligncenter size-full" height="352" src="https://danielpecos.com/assets/2015/03/typefacejavascala.jpg" width="638" /&gt;
&lt;p&gt;Other references:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.javacodegeeks.com/2014/03/8-new-features-for-java-8.html"&gt;http://www.javacodegeeks.com/2014/03/8-new-features-for-java-8.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/articles/Java-8-Quiet-Features"&gt;http://www.infoq.com/articles/Java-8-Quiet-Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.javaworld.com/article/2078836/java-se/love-and-hate-for-java-8.html"&gt;http://www.javaworld.com/article/2078836/java-se/love-and-hate-for-java-8.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Mon, 23 Mar 2015 20:48:20 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2015/03/23/java-8-one-year-later/</guid></item><item><title>Dell System Detect RCE vulnerability</title><link>https://tomforb.es/blog/dell-system-detect-rce-vulnerability/</link><description>I recently discovered a serious flaw with Dell System Detect that allowed an attacker to trigger the program to download and execute an arbitrary file without any user interaction. Below is a summary of the issue and the steps taken to bypass the protections Dell put in place. Timeline: The issue wa...</description><author>Tom Forbes</author><pubDate>Mon, 23 Mar 2015 17:16:10 GMT</pubDate><guid isPermaLink="true">https://tomforb.es/blog/dell-system-detect-rce-vulnerability/</guid></item><item><title>Chromecasts, Netflix &amp;amp; UI-200</title><link>https://pricey.uk/blog/netflix-and-ui-200/</link><description>&lt;p&gt;My Chromecast has regularly been refusing to play Netflix streams recently with error ui-200.&lt;/p&gt;</description><author>Joseph Price</author><pubDate>Mon, 23 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://pricey.uk/blog/netflix-and-ui-200/</guid></item><item><title>Doh! undo last git commit</title><link>https://xenodium.com/doh-undo-last-git-commit</link><description>&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ git reset --soft HEAD~1
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 23 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/doh-undo-last-git-commit</guid></item><item><title>BSDF System</title><link>https://blog.yiningkarlli.com/2015/03/bsdf-system.html</link><description>&lt;p&gt;Takua a0.5’s BSDF system was particularly interesting to build, especially because in previous versions of Takua Renderer, I never really had a good BSDF system. Previously, my BSDFs were written in a pretty ad-hoc way and were somewhat hardcoded into the pathtracing integrator, which made BSDF extensibility very difficult and multi-integrator support nearly impossible without significant duplication of BSDF code. In Takua a0.5, I’ve written a new, extensible, modularized BSDF system that is inspired by &lt;a href="mitsuba-renderer.org"&gt;Mitsuba&lt;/a&gt; and &lt;a href="https://renderman.pixar.com/resources/current/RenderMan/bxdfRef.html"&gt;Renderman 19/RIS&lt;/a&gt;. In this post, I’ll write about how Takua a0.5’s BSDF system works and show some pretty test images generated during development with some interesting models and props.&lt;/p&gt;

&lt;p&gt;First, here’s a still-life sort of render showcasing a number of models with a number of interesting materials, all using Takua a0.5’s BSDF system and rendered using my VCM integrator. All of the renders in this post are rendered either using my BDPT integrator or my VCM integrator.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/still_life.png"&gt;&lt;img alt="Still-life scene with a number of interesting, complex materials created using Takua a0.5's BSDF system. The chess pieces and notebooks make use of instancing. Rendered in Takua a0.5 using VCM." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/still_life.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BSDFs in Takua a0.5 are designed to support bidirectional evaluation and importance sampling natively. Basically, this means that all BSDFs need to implement five basic functions. These five basic functions are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Evaluate, which takes input and output directions of light and a normal, and returns the BSDF weight, cosine of the angle of the input direction, and color absorption of the scattering event. Evaluate can also optionally return the probability of the output direction given the input direction, with respect to solid angle.&lt;/li&gt;
  &lt;li&gt;CalculatePDFW, which takes the input and output directions of light and a normal, and returns the forward probability of the output direction given the input direction. In order to make the BSDF operate bidirectionally, this function also needs to be able to return the backwards probability if the input and output are reversed.&lt;/li&gt;
  &lt;li&gt;Sample, which takes in an input direction, a normal, and a random number generator and returns an output direction, the BSDF weight, the forward probability of the output direction, and the cosine of the input angle.&lt;/li&gt;
  &lt;li&gt;IsDelta, which returns true if the BSDF’s probability distribution function is a &lt;a href="http://en.wikipedia.org/wiki/Dirac_delta_function"&gt;Dirac delta function&lt;/a&gt; and false otherwise. This attribute is important for allowing BDPT and VCM to handle perfectly specular BSDFs correctly, since perfectly specular BSDFs are something of a special case.&lt;/li&gt;
  &lt;li&gt;GetContinuationProbability, which takes in an input direction and normal and returns the probability of ending a ray path at this BSDF. This function is used for Russian Roulette early path termination.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In order to be correct and bididirectional, each of these functions should return results that agree with the other functions. For example, taking the output direction generated by Sample and calling Evaluate with the Sample output direction should produce the same color absorption and forward probability and other attributes as Sample. Sample, Evaluate, and CalculatePDFW are all very similar functions and often can share a large amount of common code, but each one is tailored to a slightly different purpose. For example, Sample is useful for figuring out a new random ray direction along a ray path, while Evaluate is used for calculating BSDF weights while importance sampling light sources.&lt;/p&gt;

&lt;p&gt;Small note: I wrote that these five functions all take in a normal, which is technically all they need in terms of differential geometry. However, in practice, passing in a surface point and UV and other differential geometry information is very useful since that allows for various properties to be driven by 2D and 3D textures. In Takua a0.5, I pass in a normal, surface point, UV coordinate, and a geom and primitive ID for future PTEX support, and allow every BSDF attribute to be driven by a texture.&lt;/p&gt;

&lt;p&gt;One of the test props I made is the &lt;a href="http://www.pbrt.org/"&gt;PBRT book&lt;/a&gt;, since I thought rendering the Physically Based Rendering book with a physically based renderer and physically based shading would be amusing. The base diffuse color is driven by a texture map, and the interesting rippled and variation in the glossiness of the book cover comes from driving additional gloss and specular properties with more texture maps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/pbrt.png"&gt;&lt;img alt="Physically Based Rendering book, rendered with my physically based renderer. Note the texture-driven gloss and specular properties. Rendered using BDPT." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/pbrt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to be physically correct, BSDFs should also fulfill the following three properties:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Positivity, meaning that the return value of the BSDF should always be positive or equal to 0.&lt;/li&gt;
  &lt;li&gt;Helmholtz Reciprocity, which means the return value of the BSDF should not be changed by switching the input and output directions (although switching the input and output CAN change how things are calculated internally, such as in perfectly specular refractive materials).&lt;/li&gt;
  &lt;li&gt;Energy Conservation, meaning the surface cannot reflect more light than arrives.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the moment, my base BSDFs are not actually the best physically based BSDFs in the world… I just have Lambertian diffuse, normalized Blinn-Phong, and Fresnel-based perfectly specular reflection/refraction. At a later point I’m planning on adding Beckmann and Disney’s Principled BSDF, and possibly others such as GGX and Ward. However, for the time being, I can still create highly complex and interesting materials because of the modular nature of Takua a0.5’s BSDF system; one of the most powerful uses of this modular system is combining base BSDFs into more complex BSDFs. For example, I have another BSDF called FresnelPhong, which internally calls normalized Blinn-Phong BSDF but also calls the Fresnel code from my Fresnel specular BSDF to account for an output direction with the Fresnel effect with glossy surfaces. Since the Fresnel specular BSDF handles refractive materials, FresnelPhong allows for creating glossy transmissive surfaces such as frosted glass (albeit not as accurate to reality as one would get with Beckmann or GGX).&lt;/p&gt;

&lt;p&gt;Another one of my test props is a glass chessboard, where half of the pieces and board squares are using frosted glass. Needless to say, this scene is very difficult to render using unidirectional pathtracing. I only have one model of each chess piece type, and all of the pieces on the board are instances with varying materials per instance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/chessboard_0.png"&gt;&lt;img alt="Chessboard with ground glass squares and clear glass squares. Rendered using BDPT." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/chessboard_0.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/chessboard_1.png"&gt;&lt;img alt="Chessboard with ground glass and clear glass pieces. Rendered using BDPT." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/chessboard_1.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another interesting use of modular BSDFs and embedding BSDFs inside of other BSDFs is in implementing bump mapping. Takua a0.5 implements bump mapping as a simple BSDF wrapper that calculates the bump mapped normal and passes that normal into whatever the underlying BSDF is. This approach allows for any BSDF to have a bump map, and even allows for applying multiple bump maps to the same piece of geometry. In addition to specifying bump maps as wrapper BSDFs, Takua a0.5 also allows attaching bump maps to individual geometry so that the same BSDF can be reused with a number of different bump maps attached to a number of different geometries, but under the hood this system works exactly the same as the BSDF wrapper bump map.&lt;/p&gt;

&lt;p&gt;This notebook prop’s leathery surface detail comes entirely from a BSDF wrapper bump map:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/notebook.png"&gt;&lt;img alt="Notebook with a leathery surface. All surface detail comes from bump mapping. Rendered using BDPT." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/notebook.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, one of the most useful and interesting features of Takua a0.5’s BSDF system is the layered BSDF. The layered BSDF is a special BSDF that allows arbitrary combining, layering, and mixing between different BSDFs, much like Vray’s BlendMtl or Renderman 19/RIS’s LM shader system. Any BSDF can be used as a layer in a layered BSDF, including entire other layered BSDF networks. The Takua layered BSDF consists of a base substrate BSDF, and an arbitrary number of coat layers on top of the substrate. Each coat is given a texture-drive weight which determines how much of the final output BSDF is from the current coat layer versus from all of the layers and substrate below the current coat layer. Since the weight for each coat layer must be between 0 and 1, the result layered BSDF maintains physical correctness as long as all of the component BSDFs are also physically correct. Practically, the layered BSDF is implemented so that with each iteration, only one of the component BSDFs is evaluated and sampled, with the particular component BSDF per iteration chosen randomly based on each component BSDF’s weighting.&lt;/p&gt;

&lt;p&gt;The layered BSDF system is what allows the creation of truly interesting and complex materials, since objects in reality often have complex materials consisting of a number of different scattering event types. For example, a real object may have a diffuse base with a glossy clear coat, but there may also be dust and fingerprints on top of the clear coat contributing to the final appearance. The globe model seen in my adaptive sampling post uses a complex layered BSDF; the base BSDF is ground glass, with the continents layered on top as a perfectly specular mirror BSDF, and then an additional dirt and fingerprints layer on top made up of diffuse and varying glossy BSDFs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/globe_0.png"&gt;&lt;img alt="Glass globe using Takua's layered BSDF system. The globe has a base ground glass layer, a mirror layer for continents, and a dirt/fingerprints layer for additional detail. Rendered using VCM." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/globe_0.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s an additional close-up render of the globe that better shows off some of the complex surface detail:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/globe_1.png"&gt;&lt;img alt="Close-up of the globe. Rendered using VCM." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/globe_1.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Going forward, I’m planning on adding a number of better BSDFs to Takua a0.5 (as mentioned before). Since the BSDF system is so modular and extensible, adding new BSDFs should be relatively simple and should require little to no additional work to integrate into the renderer. Because of how I designed BSDF wrappers, any new BSDF I add will automatically work with the bump map BSDF wrapper and the layered BSDF system. I’m also planning on adding interesting effects to the refractive/transmission BSDF, such as absorption based on Beer’s law and spectral diffraction.&lt;/p&gt;

&lt;p&gt;After I finish work on my thesis, I also intend on adding more complex materials for subsurface scattering and volume rendering. These additions will be much more involved than just adding GGX or Beckmann, but I have a rough roadmap for how to proceed and I’ve already built a lot of supporting infrastructure into Takua a0.5. The plan for now is to implement a unified SSS/volume system based on the &lt;a href="http://www.cs.dartmouth.edu/~wjarosz/publications/krivanek14upbp.html"&gt;Unified Points, Beams, and Paths&lt;/a&gt; presented at SIGGRAPH 2014. UPBP can be thought of as extending VCM to combine a number of different volumetric rendering techniques. I can’t wait to get started on that over the summer!&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Mon, 23 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2015/03/bsdf-system.html</guid></item><item><title>Achieving Full Marks on Qualys SSL Labs</title><link>https://3059274a.danpalmer-me.pages.dev/2015-03-23-ssl-labs-grade-a/</link><description>Qualys have become well known in the recent crop of SSL and TLS vulnerabilities as a first-responder with automated testing and validation, but scoring top marks on their SSL Labs test can be difficult. I explored what was required to score full marks.</description><author>Dan Palmer</author><pubDate>Mon, 23 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://3059274a.danpalmer-me.pages.dev/2015-03-23-ssl-labs-grade-a/</guid></item><item><title>Resetting variables using defvar</title><link>https://xenodium.com/resetting-variables-using-defvar</link><description>&lt;p&gt;Want to re-evaluate defvars and modify variables? eval-defun (bound to C-M-x) can help. From the manual:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the current defun is actually a call to `defvar', then reset the variable using its initial value expression even if the variable already has some other value. (Normally `defvar' does not change the variable's value if it already has a value.) Treat `defcustom' similarly.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 22 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/resetting-variables-using-defvar</guid></item><item><title>Broken Xcode plugins?</title><link>https://xenodium.com/broken-xcode-plugins</link><description>&lt;p&gt;Some Xcode plugins stopped loading after updating Xcode. Ensure the latest DVTPlugInCompatibilityUUIDs is added to the plugin's Info.plist. Get from:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ defaults read \
    /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Additional suggestions as &lt;a href="http://stackoverflow.com/questions/30361228/why-are-my-xcode-plugins-such-as-clang-format-installed-with-alcatraz-no-longe"&gt;Stack Overflow&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 22 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/broken-xcode-plugins</guid></item><item><title>Born to Run references</title><link>https://xenodium.com/born-to-run-references</link><description>&lt;p&gt;References from reading Christopher McDougall's &lt;a href="http://www.chrismcdougall.com/born-to-run"&gt;Born to Run&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.chirunning.com"&gt;Chi running&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Chia and pinole. Random recipes &lt;a href="http://www.nomeatathlete.com/tarahumara-pinole-chia-recipes/"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://heritageseeds.org/"&gt;Heritage Seeds&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Ken Mierke’s &lt;a href="http://www.evolutionrunning.com"&gt;Evolution running&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://posemethod.com/running"&gt;Pose method&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Quotes, references, videos, etc. at &lt;a href="http://ultimatepaleoguide.com/born-to-run/"&gt;ultimate paleo guide&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Recipe by &lt;a href="http://www.bellaonline.com/articles/art51802.asp"&gt;Megan Mignot&lt;/a&gt;, based on book references:&lt;/p&gt;
&lt;h2&gt;Mama Tita’s Pancakes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;1 ½ cups cooked brown rice&lt;/li&gt;
&lt;li&gt;1 cup coconut milk&lt;/li&gt;
&lt;li&gt;2 ripe bananas&lt;/li&gt;
&lt;li&gt;1 tablespoon honey&lt;/li&gt;
&lt;li&gt;½ cup white cornmeal&lt;/li&gt;
&lt;li&gt;2 teaspoons baking powder&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 22 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/born-to-run-references</guid></item><item><title>Dallas Buyers Club</title><link>https://olshansky.info/movie/dallas_buyers_club/</link><description>Olshansky's review of Dallas Buyers Club</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 21 Mar 2015 08:03:18 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/dallas_buyers_club/</guid></item><item><title>Tinker Tailor Soldier Spy</title><link>https://olshansky.info/movie/tinker_tailor_soldier_spy/</link><description>Olshansky's review of Tinker Tailor Soldier Spy</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 21 Mar 2015 07:52:31 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/tinker_tailor_soldier_spy/</guid></item><item><title>Base Blitz</title><link>https://mbutler.org/base-blitz/</link><description>The 4th edition of Dungeons &amp;#38; Dragons often gets a bad rap for being too video gamey with encounters that drag out forever. However, it&amp;#8217;s a very elegant and well-designed game that balances combat well, especially playing on a grid. It&amp;#8217;s been my feeling that 4e would make an excellent video game. More specifically, 4e [&amp;#8230;]</description><author>mbutler</author><pubDate>Sat, 21 Mar 2015 03:57:35 GMT</pubDate><guid isPermaLink="true">https://mbutler.org/base-blitz/</guid></item><item><title>read, _read, and readable: Readable Streams in Node.js</title><link>https://www.khanna.law/blog/readable-streams-in-node-js</link><description>This article explains how readable streams work by considering the relationship between `read()`, `_read()`, and `push()` methods, and the `readable` event defined on the Readable base class</description><author>Khanna Law Blog</author><pubDate>Sat, 21 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.khanna.law/blog/readable-streams-in-node-js</guid></item><item><title>Monk is now a Ruby app.</title><link>https://benovermyer.com/blog/2015/03/monk-is-now-a-ruby-app/</link><description>&lt;p&gt;Well, it happened. It took a few days of work, but I taught myself enough Ruby on Rails to fully refactor Monkblog from PHP/Laravel to RoR.&lt;/p&gt;
&lt;p&gt;The blog is now running on Heroku, and my next step will be to setup continuous deployment. I'm pretty excited about this development! I'm officially running a Ruby on Rails app in production that I wrote myself.&lt;/p&gt;
&lt;p&gt;And of course, now that that's done, I'm working on improvements to the blog. The first order of business will probably be to make the writing screen look and feel more like Ghost's marvelous editor.&lt;/p&gt;
&lt;p&gt;I also need to port all of my old content from wherever I can find it into this new blog. I lost several posts when my old web server died (long story), but I imagine I can restore them easily enough. Just need to find backups...&lt;/p&gt;</description><author>Ben Overmyer's Site</author><pubDate>Sat, 21 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://benovermyer.com/blog/2015/03/monk-is-now-a-ruby-app/</guid></item><item><title>2015-03-21</title><link>https://ho.dges.online/pictures/2015-03-21/</link><description/><author>ho.dges.online</author><pubDate>Sat, 21 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-03-21/</guid></item><item><title>Repairing a Microsoft ergonomic keyboard</title><link>https://www.zufallsheld.de/2015/03/21/repairing-microsoft-ergonomic-keyboard/</link><description>&lt;p&gt;I accidentally spilled tea on my &lt;a href=""&gt;Microsoft natural ergonomic keyboard&lt;/a&gt; (Referal link). After cleaning up the visible mess I continued to use the keyboard as normal as everything still worked.
But the next day the keyboard didn&amp;#8217;t work anymore. The lights were still flashing but the keys I pressed …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Sat, 21 Mar 2015 01:00:00 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2015/03/21/repairing-microsoft-ergonomic-keyboard/</guid></item><item><title>Welcome to jvmGeek!</title><link>https://danielpecos.com/2015/03/20/welcome-to-jvmgeek/</link><description>&lt;p&gt;Welcome to &lt;strong&gt;jvmGeek&lt;/strong&gt;! &lt;img alt="Greetings from Duke!" class="alignright size-medium" height="300" src="https://danielpecos.com/assets/2015/03/duke_hi-167x300.png" width="167" /&gt;&lt;/p&gt;
&lt;p&gt;This new blog aims to talk and discuss about the JVM ecosystem, with news and articles discussing about Java – &lt;em&gt;the language&lt;/em&gt; -, and also about other JVM languages such as Scala, Kotlin or Clojure.&lt;/p&gt;
&lt;p&gt;But it won&amp;rsquo;t deal only about programming languages, but also about tools and libraries. You&amp;rsquo;ll find news, tutorials, code examples and more general articles, among other.&lt;/p&gt;
&lt;p&gt;From time to time I will also try to gather events and news related to one particular matter and post them as a flash post that will help you keep up to date with this effervescent platform.&lt;/p&gt;
&lt;p&gt;I hope you&amp;rsquo;ll enjoy reading this blog as least as much as I did writing it!&lt;/p&gt;
&lt;p&gt;Thank you very much!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://danielpecos.com/"&gt;Daniel Pecos&lt;/a&gt; (&lt;a href="http://twitter.com/danielpecos"&gt;@danielpecos&lt;/a&gt;).&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Fri, 20 Mar 2015 15:09:42 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2015/03/20/welcome-to-jvmgeek/</guid></item><item><title>Blog post on recent talk</title><link>https://captnemo.in/blog/2015/03/20/josd-talk/</link><description>&lt;p&gt;So I recently did a talk on Joy of Software Development. You can read more about the talk &lt;a href="https://captnemo.in/talks/josd/"&gt;here&lt;/a&gt; (link includes slides and list of topics covered). This post is devoted to the references I’d promised to link to in the talk. Since it was an introductory talk, and I didn’t want to bore people to death, I decided to cover lots of topics at a shallow depth, instead of covering a few topics deeply.&lt;/p&gt;

&lt;p&gt;This means that I need to post more material for people to follow up on. So, this is that reference blog post. Make sure you have a copy of the slides open as you go through these links.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: I also gave this talk (with a few updates) at &lt;a href="https://www.geekskool.com/"&gt;GeekSkool&lt;/a&gt; in October 2015.&lt;/p&gt;

&lt;h2 id="software-development-in-general"&gt;Software Development in general&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://sockpuppet.org/blog/2015/03/06/the-hiring-post/"&gt;Hiring in software industry is broken&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?BreadthFirstLearning"&gt;Breadth First Learning&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://blog.codinghorror.com/recommended-reading-for-developers/"&gt;Recommended readings for developers&lt;/a&gt; by Jeff Atwood (codinghorror)&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://blog.codinghorror.com/version-1-sucks-but-ship-it-anyway/"&gt;Ship v1, even if it sucks&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://web.archive.org/web/20160504181428/http://mstrick.com/ship-early-and-often/"&gt;Ship early, ship often&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.joelonsoftware.com/articles/fog0000000069.html"&gt;Never rewrite, always refactor&lt;/a&gt; by Joel Spolsky&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;The Joel Test&lt;/a&gt; to score a software company.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="software-security"&gt;Software Security&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=9164895"&gt;Security is the opposite of obscurity&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://owasp.org/www-project-top-ten/"&gt;OWASP Top 10&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://class.coursera.org/softwaresec-002"&gt;Software Security&lt;/a&gt; course on coursera&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://ctftime.org"&gt;CTFTime&lt;/a&gt; - See upcoming CTF contests&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://io.smashthestack.org/"&gt;SmashTheStack&lt;/a&gt; - Learn buffer overflow attacks&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://exploit-exercises.lains.space/nebula/"&gt;Nebula Exploit Excercises&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://backdoor.sdslabs.co/"&gt;Backdoor&lt;/a&gt; - Security CTF platform for beginners by SDSLabs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="starting-advice"&gt;Starting Advice&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://codahale.com/how-to-safely-store-a-password/"&gt;Use bcrypt&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://security.stackexchange.com/"&gt;Ask questions on Security.SE&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?PrincipleOfLeastPrivilege"&gt;Principle Of Least Privilege&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://stackoverflow.com/a/2794089/368328"&gt;Never trust user input&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="agnostic-software-development"&gt;Agnostic Software Development&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://programmers.stackexchange.com/questions/1189/what-should-i-do-to-be-language-agnostic"&gt;What should I do to be language-agnostic?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://pragprog.com/book/btlang/seven-languages-in-seven-weeks"&gt;Seven languages in seven weeks&lt;/a&gt; (Book)&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?PickTheRightToolForTheJob"&gt;Right tool for the job&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?LanguageAgnostic"&gt;Language Agnostic&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://programmers.stackexchange.com/questions/64701/balance-between-right-tool-for-the-job-and-familiarity"&gt;Balance between “right tool for the job” and familiarity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="free-and-open-source-development"&gt;Free and open source development&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.gnu.org/philosophy/open-source-misses-the-point.html"&gt;Why Open Source misses the point of Free Software&lt;/a&gt; - by Richard Stallman&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://opensource.org/osd-annotated"&gt;Open source definition&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://choosealicense.com/"&gt;Choose a license&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.gnu.org/philosophy/free-sw.html"&gt;What is free software?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.wired.com/2013/09/why-free-software-is-more-important-now-than-ever-before/"&gt;Why Free Software Movement is important&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.mozilla.org/en-US/mission/"&gt;Mozilla mission statement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="version-control"&gt;Version Control&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://git-scm.com/book/en/v2"&gt;Pro Git&lt;/a&gt; (Book)&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://try.github.io/levels/1/challenges/1"&gt;Learn Git in your browser&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://web.archive.org/web/20180926172759/http://hginit.com/"&gt;Hg Init&lt;/a&gt; Mercurial tutorial&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://stackoverflow.com/questions/35837/what-is-the-difference-between-mercurial-and-git"&gt;Difference betweeng Hg and Git&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://z.github.io/whygitisbetter/"&gt;Benefits of git&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;Must read post on git branching model&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://www.kernel.org/pub/software/scm/git/docs/everyday.html"&gt;Git in 20 commands&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="tests"&gt;Tests&lt;/h2&gt;

&lt;p&gt;During the talk, I decidedly used the term TDD incorrectly. TDD technically means going test first, but I used it as an introduction to testing in general. This was intentional. The links here will use TDD in the correct sense.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://code.tutsplus.com/tutorials/beginning-test-driven-development-in-python--net-30137"&gt;Test Driven Development Tutorial&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://programmers.stackexchange.com/questions/41409/why-does-tdd-work"&gt;Why TDD works&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://programmers.stackexchange.com/questions/66480/when-is-it-appropriate-to-not-unit-test"&gt;How much to cover in tests&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://blog.codinghorror.com/i-pity-the-fool-who-doesnt-write-unit-tests/"&gt;Importance of testing&lt;/a&gt; - Jeff Atwood&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://sd.jtimothyking.com/2006/07/11/twelve-benefits-of-writing-unit-tests-first/"&gt;Benefits of going test first&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://leif.me/on-testing-culture-in-github-projects/"&gt;Testing culture at github&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://github.com/captn3m0/talks/blob/gh-pages/josd/code/code2.js"&gt;Source code I used in talk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="rest-and-apis"&gt;REST and APIs&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://www.quora.com/How-did-Roy-Fieldings-introduction-of-REST-in-his-2000-doctoral-thesis-impact-the-internet"&gt;Why was REST a breakthrough&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.looah.com/source/view/2284"&gt;A simple lucid explanation of REST&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.programmableweb.com/"&gt;What API to use&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?NotInventedHere"&gt;NIH Syndrome&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="unix-philosophy"&gt;Unix Philosophy&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;The epic &lt;a href="http://www.leancrew.com/all-this/2011/12/more-shell-less-egg/#fnref:pipe"&gt;Knuth vs McIlroy&lt;/a&gt; story&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.catb.org/jargon/html/Z/Zawinskis-Law.html"&gt;Zawinski’s Law&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://onethingwell.org/"&gt;http://onethingwell.org/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy"&gt;Wikipedia article&lt;/a&gt; on the topic is surprisingly good&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://unix.stackexchange.com/questions/30759/whats-a-good-example-of-piping-commands-together"&gt;Good examples of pipes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="books"&gt;Books&lt;/h2&gt;
&lt;p&gt;These are books i absolutely recommend every software developer to read, in order.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href="http://blog.codinghorror.com/dont-make-me-think-second-edition/"&gt;Don’t Make Me Think&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/"&gt;The Pragmatic Programmer&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Other than these, I recommend reading Code Complete, Mythical Man Month, and everything by Jeff Atwood and Zach Homan, but only after you have read the above 2 books.&lt;/p&gt;

&lt;h2 id="how-to-get-better-at-software-development"&gt;How to get better at Software Development?&lt;/h2&gt;
&lt;p&gt;This is just a small list of topics I cover in a recent blog post. This is only present
in the updated version of the talk which I gave at GeekSkool. You can read the blog
post &lt;a href="/blog/2015/10/12/get-better-at-software-development/"&gt;here&lt;/a&gt; to look at the points I make.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Phew. That was a lot of links. If you are ever interested in learning more about software development, feel free to &lt;a href="/contact/"&gt;contact me&lt;/a&gt;. If you ever feel like chatting with me, I’m usually online at &lt;a href="https://chat.sdslabs.co"&gt;chat.sdslabs.co&lt;/a&gt;.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Fri, 20 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/03/20/josd-talk/</guid></item><item><title>Org tips from 2015-03-18 Emacs hangout</title><link>https://xenodium.com/org-tips-from-2015-03-18-emacs-hangout</link><description>&lt;p&gt;Lots of great tips in &lt;a href="http://sachachua.com/blog/2015/03/emacs-hangout-2015-03-18-show-notes/"&gt;Emacs Hangout 2015-03-18&lt;/a&gt;. Favorites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Private org drawer to prevent export:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-org"&gt;:PRIVATE:
My super duper secret text I don't want to export.
:END:
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;C-c C-p/C-c C-n Jump over sections.&lt;/li&gt;
&lt;li&gt;(setq org-hide-leading-stars t).&lt;/li&gt;
&lt;li&gt;(org-bullets-mode).&lt;/li&gt;
&lt;li&gt;(org-refile).&lt;/li&gt;
&lt;li&gt;C-u (org-refile) jumps, no refile.&lt;/li&gt;
&lt;li&gt;(helm-org-in-buffer-headings).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 19 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/org-tips-from-2015-03-18-emacs-hangout</guid></item><item><title>Food bookmarks</title><link>https://xenodium.com/food-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/cherdotdev/status/1264343579725647880"&gt;Cher's hot sauce collection&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/hex/status/1320350713734717440"&gt;Scott Martin's hot sauce collection&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://summertomato.com/"&gt;Summer tomato&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tarladalal.com/"&gt;Tarladalal recipes&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 19 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/food-bookmarks</guid></item><item><title>Ethiopia travel bookmarks</title><link>https://xenodium.com/ethiopia-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Church_of_Saint_George,_Lalibela"&gt;Bet Giyorgis Church&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 19 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/ethiopia-travel-bookmarks</guid></item><item><title>China travel bookmarks</title><link>https://xenodium.com/china-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://en.people.cn/n3/2021/0719/c90000-9874081.html"&gt;&amp;quot;If you have not been to Kashgar, then you haven’t really been to Xinjiang”&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/asia/travel-tips-and-articles/china-for-beginners-7-first-timer-fails-to-avoid-on-your-trip-to-beijing"&gt;7 first-timer fails to avoid on your trip to Beijing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/archpng/status/1146625946943967232"&gt;Archpng on Twitter: &amp;quot;Mount Maiji Grottoes,China… &amp;quot;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://t.co/1tSn3xxfP7"&gt;Beijing on a budget&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/china/travel-tips-and-articles/the-most-incredible-chinese-cities-youve-never-heard-of"&gt;Chinese cities you've never heard of&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Ctrip for hotels. Stick to high-rated only.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/asia/travel-tips-and-articles/essential-regional-cuisine-of-china"&gt;Essential regional cuisine of China&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Fenghuang_County"&gt;Fenghuang ancient town&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youramazingplaces.com/hallelujah-mountains-china/"&gt;Hallelujah Mountains&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goo.gl/maps/yP03w"&gt;Houhai Lake&lt;/a&gt; (Beijing). Miscellaneous bars.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Jiuzhaigou"&gt;Jiuzhaigou nature reserve&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/planetepics/status/613968121498632192"&gt;Luotuofeng peak, Sichuan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.boredpanda.com/worlds-most-dangerous-hiking-trail-huashan-mountain-china/"&gt;Mount Huashan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=Mount+Maiji+Grottoes&amp;amp;t=ffab&amp;amp;iax=images&amp;amp;ia=images"&gt;Mount Maiji Grottoes (DuckDuckGo)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goo.gl/maps/TfdOV"&gt;Nan Luo Gu Xiang&lt;/a&gt; (Beijing). Street Food!&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goo.gl/maps/15aFa"&gt;Qianmen Street&lt;/a&gt;. Near Tiananmen Square. Artifact shopping and famous food.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dailymail.co.uk/travel/article-1389739/Chinas-Sichuan-province-Visiting-lair-Yellow-Dragon.html"&gt;Rock pools&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lifeonnanchanglu.com/2010/06/shanghai-street-food-7-jian-bing.html"&gt;Shanghai Street Food #7 Jiān Bǐng 煎餅&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://joi.ito.com/weblog/2014/09/01/shenzhen-trip-r.html"&gt;Shenzhen&lt;/a&gt; (Hong Kong). The worlds manufacturing ecosystem.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arts.cultural-china.com/en/85Arts192.html"&gt;Suspended Temple of Mt. Hengshan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/round-the-world-travel/best-of-round-the-world-travel/content/travel-tips-and-articles/77807"&gt;The essential guide to backpacking China's silk road&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-are-some-must-try-foods-when-visiting-China"&gt;What are some must-try foods when visiting China? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Zhangjiajie_National_Forest_Park"&gt;Zhangjiajie National Forest Park&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/china/travel-tips-and-articles/chinas-most-epic-high-speed-rail-journeys/40625c8c-8a11-5710-a052-1479d2768596"&gt;China's most epic high-speed rail journeys&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 19 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/china-travel-bookmarks</guid></item><item><title>Updates to searchcode.com</title><link>https://boyter.org/2015/03/updates-searchcode-com/</link><description>&lt;p&gt;Just a quick post to list some updates to searchcode.com The first is a slight modification to the home page. A while ago I received an email from the excellent &lt;a href="https://plus.google.com/111936682578972850234/posts"&gt;Christian Moore&lt;/a&gt; who provided some mock-ups of how he felt it should look. I loved the designs, but was busy working on other issues. Thankfully however in the last week or so I found the time to implement his ideas and the result is far more professional to me.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Thu, 19 Mar 2015 00:11:33 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/03/updates-searchcode-com/</guid></item><item><title>The month from Hell</title><link>https://liza.io/the-month-from-hell/</link><description>&lt;p&gt;&lt;a href="https://liza.io/update-on-rigel-and-response-from-djurakuten/"&gt;Update on Rigel and response from DjurAkuten&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; When I first wrote this post I kept all clinic names anonymous. I am now un-anonymising one of the clinics (DjurAkuten), where this whole chain of events was triggered in the first place and which is now trying to claim that Rigel was already sick/had a flaccid bladder when we brought him in for a routine surgery as a healthy kitten despite their own records stating otherwise.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Wed, 18 Mar 2015 17:59:25 GMT</pubDate><guid isPermaLink="true">https://liza.io/the-month-from-hell/</guid></item><item><title>South Korea travel bookmarks</title><link>https://xenodium.com/south-korea-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nomadasaurus.com/things-to-do-in-jeonju-south-korea/"&gt;8 Amazing Things to Do in Jeonju, South Korea (2020 Guide)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Hongdae,_Seoul"&gt;Hongdae, Seoul&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.humarakausar.com/tag/koi-fish-mural"&gt;Koi fish mural at Naksan Park, Seoul&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 18 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/south-korea-travel-bookmarks</guid></item><item><title>Sharing on iOS</title><link>https://xenodium.com/sharing-on-ios</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIActivityViewController_Class/"&gt;UIActivityViewController&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;Use completionWithItemsHandler on iOS 8.&lt;/li&gt;
&lt;li&gt;Sample:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-objc"&gt;NSString *title = @&amp;quot;Sharing on iOS bookmarks.&amp;quot;;
NSURL *url = [NSURL URLWithString:@&amp;quot;http://xenodium.com/#sharing-on-ios&amp;quot;];
UIImage *image = [UIImage imageNamed:@&amp;quot;beautiful-image&amp;quot;];

UIActivityViewController *controller =
  [[UIActivityViewController alloc]
    initWithActivityItems:@[title, url, image]
    applicationActivities:nil];

// self being a UIViewController.
[self presentViewController:controller animated:YES completion:nil];
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Sharing through Mail app on simulator isn't supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;viewServiceDidTerminateWithError: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 &amp;quot;The operation couldn’t be completed. (_UIViewServiceInterfaceErrorDomain error 3.)&amp;quot; UserInfo=… {Message=Service Connection Interrupted}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Sharing through Mail app on device is OK.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://devstreaming.apple.com/videos/wwdc/2014/205xxqzduadzo14/205/205_hd_creating_extensions_for_ios_and_os_x,_part_1.mov?dl%3D1"&gt;WWDC 2014 Creating Extensions for iOS and OSX, Part 1&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;Share Extensions talk by Guy Fullerton.
&lt;ul&gt;
&lt;li&gt;Usually view controllers in addition to plist.&lt;/li&gt;
&lt;li&gt;CFBundleDisplayName.&lt;/li&gt;
&lt;li&gt;NSExtendion.
&lt;ul&gt;
&lt;li&gt;NSExtensionAttributes.
&lt;ul&gt;
&lt;li&gt;NSExtensionActivationRule.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SLComposeServiceViewController.&lt;/li&gt;
&lt;li&gt;UIActivityViewController.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://devstreaming.apple.com/videos/wwdc/2014/217xxsvxdga3rh5/217/217_hd_creating_extensions_for_ios_and_os_x_part_2.mov?dl%3D1"&gt;WWDC 2014 Creating Extensions for iOS and OSX, Part 2&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Want to a share URL to App Store? See &lt;a href="https://developer.apple.com/library/ios/qa/qa1633/_index.html"&gt;Technical Q&amp;amp;A 1633&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 18 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/sharing-on-ios</guid></item><item><title>San Francisco travel bookmarks</title><link>https://xenodium.com/san-francisco-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.bluestardonuts.com/"&gt;Blue Star Donuts (Portland + LA)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.yelp.com/biz/mr-and-mrs-miscellaneous-san-francisco"&gt;Mr. and Mrs. Miscellaneous&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.smittenicecream.com/"&gt;Smitten Ice Cream&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tiledsteps.org/"&gt;Tiled steps at 16th Moraga Street in San Francisco&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 18 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/san-francisco-travel-bookmarks</guid></item><item><title>Istanbul travel bookmarks</title><link>https://xenodium.com/istanbul-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://istanbulfood.com/altan-sekerleme-a-sweet-sweet-bayram/"&gt;Altan Şekerleme (turkish delight shop)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/turkey/istanbul/travel-tips-and-articles/top-10-traditional-cheap-eats-in-istanbuls-bazaar-district"&gt;Cheap eats in Istanbul's Bazaar District&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.turkeyfromtheinside.com/istanbul-guide/f/1255-findikli.html"&gt;Findikli rainbow stairs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Historic neighborhood of Arnavutkoy in Istanbul.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://istanbulfood.com/altan-sekerleme-a-sweet-sweet-bayram/"&gt;Istanbul Food: after the perfect bite&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/turkey/cappadocia-kapadokya/travel-tips-and-articles/the-rise-of-karakoy-istanbuls-hippest-neighbourhood"&gt;The rise of Karakoy: Istanbul's hippest neighbourhood&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.timwilmot.com/2012/04/fish-market-uskudar-istanbul.html"&gt;Uskudar Fish Market&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 18 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/istanbul-travel-bookmarks</guid></item><item><title>Rome travel bookmarks</title><link>https://xenodium.com/rome-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.topbikerental.com/nuovosito/eng/tour-rome/city-center.php"&gt;Bike rental in Rome&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.darkrome.com/"&gt;Darkrome tours&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/italy/travel-tips-and-articles/first-time-rome-a-beginners-guide-to-the-eternal-city#ixzz3lhwtbgg0"&gt;First time Rome: a beginner’s guide to the Eternal City&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 18 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/rome-travel-bookmarks</guid></item><item><title>Adaptive Sampling</title><link>https://blog.yiningkarlli.com/2015/03/adaptive-sampling.html</link><description>&lt;p&gt;Adaptive sampling is a relatively small and simple but very powerful feature, so I thought I’d write briefly about how adaptive sampling works in Takua a0.5. Before diving into the details though, I’ll start with a picture. The scene I’ll be using for comparisons in this post is a globe of the Earth, made of a polished ground glass with reflective metal insets for the landmasses and with a rough scratched metal stand. The globe is on a white backdrop and is lit by two off-camera area lights. The following render is the fully converged reference baseline for everything else in the post, rendered using VCM:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/adaptive_globe_baseline_vcm.png"&gt;&lt;img alt="Fully converged reference baseline. Rendered in Takua a0.5 using VCM." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/adaptive_globe_baseline_vcm.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As &lt;a href="http://blog.yiningkarlli.com/2015/02/bidirectional-pathtracing-integrator.html"&gt;mentioned before&lt;/a&gt;, in pathtracing based renderers, we solve the path integral through Monte Carlo sampling, which gives us an estimate of the total integral per sample thrown. As we throw more and more samples at the scene, we get a better and better estimate of the total integral, which explains why pathtracing based integrators start out producing a noisy image but eventually converge to a nice, smooth image if enough rays are traced per pixel.&lt;/p&gt;

&lt;p&gt;In a naive renderer, the number of samples traced per pixel is usually just a fixed number, equal for all pixels. However, not all parts of the image are necessarily equally difficult to sample; for example, in the globe scene, the backdrop should require fewer samples than the ground glass globe to converge, and the ground glass globe in turn should require fewer samples than the two caustics on the ground. This observation means that a fixed sampling strategy can potentially be quite wasteful. Instead, computation can be used much more efficiently if the sampling strategy can adapt and drive more samples towards pixels that require more work to converge, while driving fewer samples towards pixels that have already converged mid-render. Such a sample can also be used to automatically stop the renderer once the sampler has detected that the entire render has converged, without needing user guesswork for how many samples to use.&lt;/p&gt;

&lt;p&gt;The following image is the same globe scene as above, but limited to 5120 samples per pixel using bidirectional pathtracing and a fixed sampler. Note that most of the image is reasonable converged, but there is still noise visible in the caustics:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/fixed_globe_bdpt.png"&gt;&lt;img alt="Fixed sampling, 5120 samples per pixel, BDPT." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/fixed_globe_bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since it may be difficult to see the difference between this image and the baseline image on smaller screens, here is a close-up crop of the same caustic area between the two images:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/globe_fixed_baseline_comparison.png"&gt;&lt;img alt="500% crop. Left: converged baseline render. Right: fixed sampling, 5120 samples per pixel, BDPT." src="https://blog.yiningkarlli.com/content/images/2015/Mar/globe_fixed_baseline_comparison.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The difficult part of implementing an adaptive sampler is, of course, figuring out a metric for convergence. The &lt;a href="http://www.pbrt.org/"&gt;PBRT book&lt;/a&gt; presents a very simple adaptive sampling strategy on page 388 of the 2nd edition: for each pixel, generate some minimum number of initial samples and record the radiances returned by each initial sample. Then, take the average of the luminances of the returned radiances, and compute the contrast between each initial sample’s radiance and the average luminance. If any initial sample has a contrast from the average luminance above some threshold (say, 0.5), generate more samples for the pixel up until some maximum number of samples per pixel is reached. If all of the initial samples have contrasts below the threshold, then the sampler can mark the pixel as finished and move onto the next pixel. The idea behind this strategy is to try to eliminate fireflies, since fireflies result from statistically improbably samples that are significantly above the true value of the pixel.&lt;/p&gt;

&lt;p&gt;The PBRT adaptive sampler works decently, but has a number of shortcomings. First, the need to draw a large number of samples per pixel simultaneously makes this approach less than ideal for progressive rendering; while well suited to a bucketed renderer, a progressive renderer prefers to draw a small number of samples per pixel per iteration, and return to each pixel to draw more samples in subsequent iterations. In theory, the PBRT adaptive sampler could be made to work with a progressive renderer if sample information was stored from each iteration until enough samples were accumulated to run an adaptive sampling check, but this approach would require storing a lot of extra information. Second, while the PBRT approach can guarantee some degree of per-pixel variance minimization, each pixel isn’t actually aware of what its neighbours look like, meaning that there still can be visual noise across the image. A better, global approach would have to take into account neighbouring pixel radiance values as a second check for whether or not a pixel is sufficiently sampled.&lt;/p&gt;

&lt;p&gt;My first attempt at a global approach (the test scene in this post is a globe, but that pun was not intended) was to simply have the adaptive sampler check the contrast of each pixel with it’s immediate neighbours. Every N samples, the adaptive sampler would pull the accumulated radiances buffer and flag each pixel as unconverged if the pixel has a contrast greater than some threshold from at least one of its neighbours. Pixels marked unconverged are sampled for N more iterations, while pixels marked as converged are skipped for the next N iterations. After another N iterations, the adaptive sampler would go back and reflag every pixel, meaning that a pixel previously marked as converged could be reflagged as unconverged if its neighbours changed enormously. Generally N should be a rather large number (say, 128 samples per pixel), since doing convergence checks is meaningless if the image is too noisy at the time of the check.&lt;/p&gt;

&lt;p&gt;Using this strategy, I got the following image, which was set to run for a maximum of 5120 samples per pixel but wound up averaging 4500 samples per pixel, or about a 12.1% reduction in samples needed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/adaptive_perpixel_globe_bdpt.png"&gt;&lt;img alt="Adaptive sampling per pixel, average 4500 samples per pixel, BDPT." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/adaptive_perpixel_globe_bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At an initial glance, this looks pretty good! However, as soon as I examined where the actual samples went, I realized that this strategy doesn’t work. The following image is a heatmap showing where samples were driven, with brighter areas indicating more samples per pixel:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/adaptive_perpixel.png"&gt;&lt;img alt="Sampling heatmap for adaptive sampling per pixel. Brighter areas indicate more samples." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/adaptive_perpixel.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Generally, my per-pixel adaptive sampler did correctly identify the caustic areas as needing more samples, but a problem becomes apparent in the backdrop areas: the per-pixel adaptive sampler drove samples at clustered “chunks” evenly, but not evenly &lt;em&gt;across&lt;/em&gt; different clusters. This behavior happens because while the per-pixel sampler is now taking into account variance across neighbours, it still doesn’t have any sort of global sense across the entire image! Instead, the sampler is finding localized pockets where variance seems even across pixels, but those pockets can be quite disconnected from further out areas. While the resultant render looks okay at a glance, clustered variance patterns becomes apparent if the image contrast is increased:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/adaptive_perpixel_globe_bdpt_highcontrast.png"&gt;&lt;img alt="Adaptive sampling per pixel, with enhanced contrast. Note the local clustering artifacts." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/adaptive_perpixel_globe_bdpt_highcontrast.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Interestingly, these artifacts are reminiscent of the artifacts that show up in not-fully-converged Metropolis Light Transport renders. This similarity makes sense, since in both cases they arise from uneven localized convergence.&lt;/p&gt;

&lt;p&gt;The next approach that I tried is a more global approach adapted from &lt;a href="http://jo.dreggn.org/home/2009_stopping.pdf"&gt;Dammertz et al.’s paper, “A Hierarchical Automatic Stopping Condition for Monte Carlo Global Illumination”&lt;/a&gt;. For the sake of simplicity, I’ll refer to the approach in this paper as Dammertz for the rest of this post. Dammertz works by considering the variance across an entire block of pixels at once and flagging the entire block as converged or unconverged, allowing for much more global analysis. At the first variance check, the only block considered is the entire image as one enormous block; if the total variance &lt;em&gt;e&lt;sub&gt;b&lt;/sub&gt;&lt;/em&gt; in the entire block is below a termination threshold &lt;em&gt;e&lt;sub&gt;t&lt;/sub&gt;&lt;/em&gt;, the block is flagged as converged and no longer needs to be sampled further. If &lt;em&gt;e&lt;sub&gt;b&lt;/sub&gt;&lt;/em&gt; is greater than &lt;em&gt;e&lt;sub&gt;t&lt;/sub&gt;&lt;/em&gt; but still less than a splitting threshold &lt;em&gt;e&lt;sub&gt;s&lt;/sub&gt;&lt;/em&gt;, then the block will be split into two non-overlapping child blocks for the next round of variance checking after N iterations have passed. At each variance check, this process is repeated for each block, meaning the image eventually becomes split into an ocean of smaller blocks. Blocks are kept inside of a simple unsorted list, require no relational information to each other, and are removed from the list once marked as converged, making the memory requirements very simple. Blocks are split along their major axis, with the exact split point chosen to keep error as equal as possible across the two sides of the split.&lt;/p&gt;

&lt;p&gt;The actual variance metric used is also very straightforward; instead of trying to calculate an estimate of variance based on neighbouring pixels, Dammertz stores two framebuffers: one buffer I for all accumulated radiances so far, and a second buffer A for accumulated radiances from every other iteration. As the image approaches full convergence, the differences between I and A should shrink, so an estimation of variance can be found simply by comparing radiance values between I and A. The specific details and formulations can be found in section 2.1 of the paper.&lt;/p&gt;

&lt;p&gt;I made a single modification to the paper’s algorithm: I added a lower bound to the block size. Instead of allowing blocks to split all the way to a single pixel, I stop splitting after a block reaches 64 pixels in a 8x8 square. I found that splitting down to single pixels could sometimes cause false positives in convergence flagging, leading to missed pixels similar to in the PBRT approach. Forcing blocks to stop splitting at 64 pixels means there is a chance of false negatives for convergence, but a small amount of unnecessary oversampling is preferable to undersampling.&lt;/p&gt;

&lt;p&gt;Using this per-block adaptive sampler, I got the following image, which again is superficially extremely similar to the fixed sampler result. This render was also set to run for a maximum of 5120 samples, but wound up averaging just 2920 samples per pixel, or about a 42.9% reduction in samples needed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/adaptive_perblock_globe_bdpt.png"&gt;&lt;img alt="Adaptive sampling per block, average 2920 samples per pixel, BDPT." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/adaptive_perblock_globe_bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The sample heatmap looks good too! The heatmap shows that the sampler correctly identified the caustic and highlight areas as needing more samples, and doesn’t have clustering issues in areas that needed fewer samples:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/adaptive_perblock.png"&gt;&lt;img alt="Sampling heatmap for adaptive sampling per block. Brighter areas indicate more samples." src="https://blog.yiningkarlli.com/content/images/2015/Mar/adaptive_perblock.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Boosting the image contrast shows that the image is free of local clustering artifacts and noise is even across the entire image, which is what we would expect:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/adaptive_perblock_globe_bdpt_highcontrast.png"&gt;&lt;img alt="Adaptive sampling per block, with enhanced contrast. Note the even noise spread and lack of local clustering artifacts." src="https://blog.yiningkarlli.com/content/images/2015/Mar/preview/adaptive_perblock_globe_bdpt_highcontrast.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking at the same 500% crop area as earlier, the adaptive per-block and fixed sampling renders are indistinguishable:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Mar/globe_fixed_adaptive_comparison.png"&gt;&lt;img alt="500% crop. Left: fixed sampling, 5120 samples per pixel, BDPT. Right: adaptive per-block sampling, average 2920 samples per pixel, BDPT." src="https://blog.yiningkarlli.com/content/images/2015/Mar/globe_fixed_adaptive_comparison.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So with that, I think Dammertz works pretty well! Also, the computational and memory overhead required for the Dammertz approach is basically negligible relative to the actual rendering process. This approach is the one that is currently in Takua a0.5.&lt;/p&gt;

&lt;p&gt;I actually have an additional adaptive sampling trick designed specifically for targeting fireflies. This additional trick works in conjunction with the Dammertz approach. However, this post is already much longer than I originally planned, so I’ll save that discussion for a later post. I’ll also be getting back to the PPM/VCM posts in my series of integrator posts shortly; I have not had much time to write on my blog since the vast majority of my time is currently focused on my thesis, but I’ll try to get something posted soon!&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Wed, 18 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2015/03/adaptive-sampling.html</guid></item><item><title>NotMuch is awesome</title><link>https://blog.erethon.com/blog/2015/03/17/notmuch-is-awesome/</link><description>&lt;p&gt;
In one of my previous posts, I explained my &lt;a href="https://blog.erethon.com/blog/2015/02/27/my-mail-setup-using-mutt/offlineimap/imapfilter/"&gt;email setup in
detail&lt;/a&gt;. Since then I've added one more piece of software on the
"stack". It's called &lt;a href="http://notmuchmail.org/"&gt;NotMuch&lt;/a&gt; and it's an email indexer.&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Tue, 17 Mar 2015 08:18:56 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2015/03/17/notmuch-is-awesome/</guid></item><item><title>Italy travel bookmarks</title><link>https://xenodium.com/italy-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://themindcircle.com/stunning-italy/"&gt;22 Towns in Italy That Are Almost Too Perfect Looking&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.monte-oliveto.com/"&gt;Abbazia di Monte Oliveto Maggiore&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://travellingantics.com/"&gt;Abbruzzo's Sulmona: one of the oldest towns in the area and home to the Latin poet Ovid, confetti (sugared almonds) and arrosticini (barbecued lamb skewers)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Alberobello"&gt;Alberobello - Wikipedia&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.neatorama.com/2015/04/22/Furore-The-Little-Italian-Beach-Hidden-in-a-Fjord/"&gt;Amalfi coast's Furore beach&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Boboli_Gardens"&gt;Boboli Gardens, Florence&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://italychronicles.com/heavenly-beauty-braies-lake-italy/"&gt;Braie lake&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.caffemeletti.it/"&gt;Caffe Meletti&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Cinque_Terre"&gt;Cinque Terre&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Emilia-Romagna"&gt;Emilia Romagna&lt;/a&gt;. (foood!).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emilyluxton.co.uk/italy/five-small-towns"&gt;Fixe small towns in Italy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Herculaneum"&gt;Herculaneum - Wikipedia&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/italy/travel-tips-and-articles/italys-six-best-road-trips"&gt;Italy's six best road trips&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sirenuse.it/en"&gt;Le Sirenuse (Positano)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/italy/amalfi-coast/travel-tips-and-articles/76904"&gt;Live the good life: 12 local experiences on the Amalfi Coast&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Manarola"&gt;Manarola&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Milan - Deus cafe.&lt;/li&gt;
&lt;li&gt;Milan - &lt;a href="https://www.google.co.uk/search?sa%3DG&amp;amp;hl%3Den&amp;amp;q%3Dgelateria%2Bmilano&amp;amp;npsic%3D0&amp;amp;rflfq%3D1&amp;amp;tbm%3Dlcl&amp;amp;ved%3D0ahUKEwjx8vuA353KAhWIOhoKHaFNDq0QjGoIPQ&amp;amp;biw%3D1600&amp;amp;bih%3D789"&gt;Gelato joints&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Milan - &lt;a href="http://www.ilmangione.it/"&gt;Il mangione&lt;/a&gt; to find restaurants.&lt;/li&gt;
&lt;li&gt;Milan - Mercato Metropolitani.&lt;/li&gt;
&lt;li&gt;Milan - Navigli and eat at &amp;quot;el brellin&amp;quot;.&lt;/li&gt;
&lt;li&gt;Milan - &lt;a href="http://www.taveggia.it"&gt;Taveggia&lt;/a&gt; for hot chocolate.&lt;/li&gt;
&lt;li&gt;Milan - &lt;a href="http://www.msadventuresinitaly.com/blog/2008/04/14/where-to-go-to-aperitivo-in-milan-italy/"&gt;Where to go for aperitivo in Milan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Montalcino"&gt;Montalcino, and Brunello wine&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Palace_of_Venaria"&gt;Palace of Venaria&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Piazza_dei_Miracoli#Duomo"&gt;Piazza dei Miracoli&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Piedmont"&gt;Piedmont&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Pienza"&gt;Pienza, Tuscany&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Lampedusa"&gt;Rabbit beach&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tripadvisor.co.uk/Restaurant_Review-g635634-d1515714-Reviews-Re_di_Macchia-Montalcino_Tuscany.html"&gt;Re di Macchia, restaurant in Montalcino&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sacred-destinations.com/italy/san-galgano-abbey"&gt;San Galgano, Tuscany&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/San_Gimignano"&gt;San Gimignano, Tuscany&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://florence-markets.com/sanlorenzomarket.asp"&gt;San Lorenzo leather market&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/travel-tips-and-articles/skiing-in-italy-find-your-perfect-resort"&gt;Skiing in Italy: find your perfect resort&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lovefromtuscany.com/devils-bridge-tuscany/"&gt;The Devil's Bridge in Borgo a Mozzano, Tuscany, Italy - Love from Tuscany&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item"&gt;The New Treasures of Pompeii&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Volterra"&gt;Volterra, Tuscany&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 17 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/italy-travel-bookmarks</guid></item><item><title>Emacs lisp debug on entry</title><link>https://xenodium.com/emacs-lisp-debug-on-entry</link><description>&lt;p&gt;Wanted to track down which package was enabling ido-mode on my behalf. debug-on-entry to the rescue. Pass the method name in question and you're good to go.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(debug-on-entry 'ido-mode)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When done, use cancel.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(cancel-debug-on-entry 'ido-mode)
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 17 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/emacs-lisp-debug-on-entry</guid></item><item><title>Burma travel bookmarks</title><link>https://xenodium.com/burma-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;Bagan and Inle lake are the &amp;quot;touristy&amp;quot; areas.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://balloonsoverbagan.com/home"&gt;Balloons over Bagan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For Bagan, get bicycles.&lt;/li&gt;
&lt;li&gt;Inle lake guided boat tour.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Ngapali_Beach"&gt;Ngapali beach&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.go-myanmar.com/ngwe-saung/"&gt;Ngwe Saung beach&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Shwesandaw at sunset.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://imgur.com/a/D1EQJ"&gt;zyklusdiewelt's Myanmar's photos&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Tue, 17 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/burma-travel-bookmarks</guid></item><item><title>New Releases for Cerberus and Eve</title><link>https://nicolaiarocci.com/new-releases-for-cerberus-and-eve/</link><description>&lt;p&gt;Yesterday &lt;a href="https://github.com/nicolaiarocci/cerberus"&gt;Cerberus 0.8.1&lt;/a&gt; was released with a few little &lt;a href="https://github.com/nicolaiarocci/cerberus/blob/master/CHANGES"&gt;fixes&lt;/a&gt;, one of them being more a new feature than a fix really: sub-document fields can now be set as field dependencies by using a ‘dotted’ notation.&lt;/p&gt;
&lt;p&gt;So, suppose we set the following validation schema:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;schema = {
  'test_field': {
    'dependencies': [
      'a_dict.foo', 
      'a_dict.bar'
    ]
  },
  'a_dict': {
    'type': 'dict',
      'schema': {
        'foo': {'type': 'string'},
        'bar': {'type': 'string'}
      }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, we can validate a document like this:&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 17 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/new-releases-for-cerberus-and-eve/</guid></item><item><title>The Shadow of the Wind (The Cemetery of Forgotten Books, #1)</title><link>https://apurva-shukla.me/bookshelf/the-shadow-of-the-wind/</link><description>⭐ ⭐ ⭐ ⭐ ⭐ As soon as I flipped to the first page, I was enchanted.

I have no words, because it is just so superbly written with an excellent…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Mon, 16 Mar 2015 09:00:00 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-shadow-of-the-wind/</guid></item><item><title>Fancy git aliases and git cherryfetch</title><link>https://purpleidea.com/blog/2015/03/16/fancy-git-aliases-and-git-cherryfetch/</link><description>&lt;p&gt;Here are two quick &lt;a href="https://en.wikipedia.org/wiki/Git_%28software%29"&gt;git&lt;/a&gt; tricks that I&amp;rsquo;ve added to my toolbox lately&amp;hellip;&lt;/p&gt;
&lt;p&gt;I wanted to create a git alias that takes in argv from the command, but in the middle of the command. Here&amp;rsquo;s the hack that I came up with for the &lt;code&gt;[alias]&lt;/code&gt; section of my &lt;code&gt;~/.gitconfig&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-fallback"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;[alias]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    # cherryfetch fetches a repo ($1) / branch ($2) and applies it rebased!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    # the &amp;amp;&amp;amp; true at the end eats up the appended args
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;    cherryfetch = !git fetch "$1" "$2" &amp;amp;&amp;amp; git cherry-pick HEAD..FETCH_HEAD &amp;amp;&amp;amp; true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Explanation&lt;/span&gt;:&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 16 Mar 2015 07:36:19 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/03/16/fancy-git-aliases-and-git-cherryfetch/</guid></item><item><title>OS X Screencasts to animated GIF</title><link>https://xenodium.com/os-x-screencasts-to-animated-gif</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/dergachev/4627207"&gt;Alex Dergachev&lt;/a&gt; has a great &lt;a href="https://gist.github.com/dergachev/4627207"&gt;howto&lt;/a&gt; for generating animated GIF out of OS X Screencasts.&lt;/li&gt;
&lt;li&gt;Of interest &lt;a href="http://gifbrewery.com/"&gt;GIF Brewery&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 16 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/os-x-screencasts-to-animated-gif</guid></item><item><title>Can secure voting exist on the Internet?</title><link>https://stop.zona-m.net/2015/03/can-secure-voting-exist-on-the-internet/</link><description>&lt;p&gt;Last week I was asked this question: &lt;em&gt;&amp;ldquo;If relatively secure financial transactions can exist, relatively secure voting can exist on the internet, can it not?&amp;quot;&lt;/em&gt; My answer? No. Because&amp;hellip;&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sun, 15 Mar 2015 18:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/03/can-secure-voting-exist-on-the-internet/</guid></item><item><title>Ted 2</title><link>https://olshansky.info/movie/ted_2/</link><description>Olshansky's review of Ted 2</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 15 Mar 2015 18:04:02 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/ted_2/</guid></item><item><title>The Stanford Prison Experiment</title><link>https://olshansky.info/movie/the_stanford_prison_experiment/</link><description>Olshansky's review of The Stanford Prison Experiment</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 15 Mar 2015 10:45:38 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_stanford_prison_experiment/</guid></item><item><title>Writing Xcode plugins</title><link>https://xenodium.com/writing-xcode-plugins</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kattrali/Xcode-Plugin-Template"&gt;Xcode-Plugin-Template&lt;/a&gt; from &lt;a href="http://www.delisa.me/"&gt;Delisa Mason&lt;/a&gt;/&lt;a href="https://github.com/kattrali/Xcode-Plugin-Template"&gt;kattrali&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;Ensure DVTPlugInCompatibilityUUIDs is in Info.plist.&lt;/li&gt;
&lt;li&gt;Get from:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;defaults read \
    /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Luis Solanos's &lt;a href="https://github.com/luisobo/Xcode-RuntimeHeaders"&gt;Xcode-RuntimeHeaders&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Boris Bügling's &lt;a href="https://github.com/neonichu/Xcode-RuntimeHeaders"&gt;Xcode-RuntimeHeaders&lt;/a&gt; fork.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://artsy.github.io/blog/2014/06/17/building-the-xcode-plugin-snapshots/"&gt;Building the Xcode plugin snapshots&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/edwardaux/XcodeExplorer"&gt;Xcode Explorer&lt;/a&gt; enables you to explore Xcode events/notifications.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blackdogfoundry.com/blog/creating-an-xcode4-plugin/"&gt;Creating an Xcode4 plugin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blackdogfoundry.com/blog/common-xcode4-plugin-techniques/"&gt;Common Xcode plugin techniques&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blackdogfoundry.com/blog/xcodeexplorer-monitor-xcode4-internals/"&gt;XcodeExplorer to monitor Xcode internals&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blackdogfoundry.com/blog/debugging-your-xcode-plugin/"&gt;Debugging your Xcode plugin&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 15 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/writing-xcode-plugins</guid></item><item><title>Uninstalling Alcatraz from Xcode</title><link>https://xenodium.com/uninstalling-alcatraz-from-xcode</link><description>&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin
$ rm -rf ~/Library/Application\ Support/Alcatraz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ps. Removing all plugins:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/*
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 15 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/uninstalling-alcatraz-from-xcode</guid></item><item><title>Attention is a Resource</title><link>https://nicolaiarocci.com/attention-is-a-resource/</link><description>&lt;p&gt;Today, the New York Times’ SundayReview features a great column by Matthew B. Crawford: &lt;a href="http://www.nytimes.com/2015/03/08/opinion/sunday/the-cost-of-paying-attention.html"&gt;The Cost of Paying Attention&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention is a resource; a person has only so much of it […] What if we saw attention in the same way that we saw air or water, as a valuable resource that we hold in common? Perhaps, if we could envision an “attentional commons,” then we could figure out how to protect it.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Sun, 15 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/attention-is-a-resource/</guid></item><item><title>Continuous integration for the Linux Kernel - Built within Docker</title><link>https://smcleod.net/2015/03/continuous-integration-for-the-linux-kernel-built-within-docker/</link><description>&lt;p&gt;Linux Kernel CI for Debian&lt;/p&gt;
&lt;p&gt;&lt;img src="https://smcleod.net//img/build-passing.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/sammcj/kernel-ci"&gt;Github: sammcj/kernel-ci&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Those of us using technologies such as Docker and BTRFS or simply trying to gain a performance edge on the competition have a lot to gain from the features and performance of recent Kernel updates (especially from 3.18 onwards).&lt;/p&gt;
&lt;p&gt;&amp;lsquo;Enterprise&amp;rsquo; Linux distributions such as RHEL &amp;amp; variants are concerningly out of date when comes to the Kernel.
Many people seem to have forgotten what Linux is&amp;hellip; &lt;em&gt;Linux IS the Kernel&lt;/em&gt;.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Sun, 15 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/03/continuous-integration-for-the-linux-kernel-built-within-docker/</guid></item><item><title>Amounts 1.0.3 Bugfix Update</title><link>https://swiftfox.co/2015/03/amounts-1-0-3-bugfix-update/</link><description>&lt;p&gt;It has been a while since I have updated this page! I just wanted to let people know that there was a change to sqlite in iOS 8.2 that has caused issues with Amounts. I&amp;#8217;ve just submitted a small bugfix update to Apple that should hopefully go out next week. In the meantime I will...  &lt;a class="excerpt-read-more" href="https://swiftfox.co/2015/03/amounts-1-0-3-bugfix-update/" title="ReadAmounts 1.0.3 Bugfix Update"&gt;Read more &amp;#187;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a href="https://swiftfox.co/2015/03/amounts-1-0-3-bugfix-update/"&gt;Amounts 1.0.3 Bugfix Update&lt;/a&gt; first appeared on &lt;a href="https://swiftfox.co"&gt;Swift Fox Software LLC&lt;/a&gt;.&lt;/p&gt;</description><author>Swift Fox Software LLC</author><pubDate>Sat, 14 Mar 2015 18:23:45 GMT</pubDate><guid isPermaLink="true">https://swiftfox.co/2015/03/amounts-1-0-3-bugfix-update/</guid></item><item><title>Prefill Emacs swiper with current region</title><link>https://xenodium.com/prefill-emacs-swiper-with-current-region</link><description>&lt;p&gt;The new &lt;a href="https://github.com/abo-abo/swiper"&gt;swiper&lt;/a&gt; Emacs package is proving to be a great alternative to &lt;a href="https://github.com/ShingoFukuyama/helm-swoop"&gt;helm-swoop&lt;/a&gt;. Here's how to prefill with current region:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(defun ar/prefilled-swiper ()
  &amp;quot;Pre-fill swiper input with region.&amp;quot;
  (interactive)
  (if (region-active-p)
      (let ((region-text (buffer-substring (region-beginning)
                                           (region-end))))
        (swiper region-text))
    (swiper)))

(global-set-key (kbd &amp;quot;C-s&amp;quot;)
                #'ar/prefilled-swiper)
&lt;/code&gt;&lt;/pre&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 14 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/prefill-emacs-swiper-with-current-region</guid></item><item><title>Change macOS app icon</title><link>https://xenodium.com/change-mac-os-app-icon</link><description>&lt;ul&gt;
&lt;li&gt;Open the new icon (.icns) in Preview.&lt;/li&gt;
&lt;li&gt;Click on large image&lt;/li&gt;
&lt;li&gt;Select all (⌘-a).&lt;/li&gt;
&lt;li&gt;Copy (⌘-c).&lt;/li&gt;
&lt;li&gt;Ctrl-click on app icon.&lt;/li&gt;
&lt;li&gt;Select Get Info.&lt;/li&gt;
&lt;li&gt;Click on app icon (top-left).&lt;/li&gt;
&lt;li&gt;Paste (⌘-v).&lt;/li&gt;
&lt;li&gt;Done!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/change-mac-os-app-icon/overriding.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://xenodium.github.io/images/change-mac-os-app-icon/after.png" /&gt;&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 14 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/change-mac-os-app-icon</guid></item><item><title>Chappie</title><link>https://olshansky.info/movie/chappie/</link><description>Olshansky's review of Chappie</description><author>🦉 olshansky 🦁</author><pubDate>Thu, 12 Mar 2015 18:28:43 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/chappie/</guid></item><item><title>My email Server Setup</title><link>https://blog.erethon.com/blog/2015/03/11/my-email-server-setup/</link><description>&lt;p&gt;
Wanting to have more control over my email, I decided to setup my own
mail server. I thought I had a pretty good understanding of how mail
works, considering my &lt;a href="http://blog.erethon.com/blog/2015/02/27/my-mail-setup-using-mutt-slash-offlineimap-slash-imapfilters/"&gt;mutt/offlineimap/imapfilter setup&lt;/a&gt;, but I must
say I was pleasantly surprised while setting everything up.&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Wed, 11 Mar 2015 20:52:37 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2015/03/11/my-email-server-setup/</guid></item><item><title>Hack on Emacs London meetup bookmarks</title><link>https://xenodium.com/hack-on-emacs-meetup</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.european-lisp-symposium.org"&gt;European Lisp Symposium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kai2nenobu/guide-key"&gt;guide-key&lt;/a&gt; displays available key bindings.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/csrhodes/iplayer-el"&gt;iplayer-el&lt;/a&gt; Emacs interface to the BBC's iPlayer.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/csrhodes/swankr"&gt;swankr&lt;/a&gt; REPL (swank protocol for R).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 11 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/hack-on-emacs-meetup</guid></item><item><title>History Text Analysis Over Spreadsheets - A Poker Player and Developer's Road to Agile Project Management</title><link>http://persumi.com/u/fredwu/tech/e/blog/p/history-text-analysis-over-spreadsheets-a-poker-player-and-developers-road-to-agile-project-management</link><description/><author>Fred Wu (@fredwu)</author><pubDate>Mon, 09 Mar 2015 23:50:23 GMT</pubDate><guid isPermaLink="true">http://persumi.com/u/fredwu/tech/e/blog/p/history-text-analysis-over-spreadsheets-a-poker-player-and-developers-road-to-agile-project-management</guid></item><item><title>Working with OS X and Emacs tips</title><link>https://xenodium.com/working-with-os-x-and-emacs-tips</link><description>&lt;p&gt;From &lt;a href="http://emacsblog.org"&gt;M-x all-things-emacs&lt;/a&gt;, Ryan McGeary's OS X/Emacs &lt;a href="http://emacsblog.org/2011/01/04/how-i-work-working-with-os-x-and-emacs/"&gt;workflow&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Frequently used apps:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://agilebits.com/onepassword"&gt;1 password&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.choosyosx.com/"&gt;Choosy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mizage.com/divvy/"&gt;Divvy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.red-sweater.com/fastscripts"&gt;Fastscript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fluidapp.com/"&gt;Fluid&lt;/a&gt; (SSB).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.obdev.at/products/launchbar/index.html"&gt;Launchbar&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://evernote.com/skitch/guide/mac/"&gt;Skitch (screenshots)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://smilesoftware.com/TextExpander/index.html"&gt;te (Text expander)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Dotfiles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rmm5t/dotfiles"&gt;Github&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 09 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/working-with-os-x-and-emacs-tips</guid></item><item><title>Building ycmd</title><link>https://xenodium.com/building-ycmd</link><description>&lt;h2&gt;Build&lt;/h2&gt;
&lt;hr /&gt;
&lt;h2&gt;id: build-3&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ git clone https://github.com/Valloric/ycmd.git
$ cd ycmd
$ git submodule update --init --recursive
$ ./build.sh --clang-completer
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Test&lt;/h2&gt;
&lt;pre&gt;&lt;code class="language-{.bash"&gt;$ python ycmd
  serving on http://127.0.0.1:54265
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;More info&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Valloric/YouCompleteMe/blob/master/README.md"&gt;YouCompleteMe README&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Valloric/ycmd/blob/master/README.md"&gt;ycmd README&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Mon, 09 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/building-ycmd</guid></item><item><title>Decoding Captcha's Presentation</title><link>https://boyter.org/2015/03/decoding-captchas-presentation/</link><description>&lt;p&gt;A few days ago there was a lack of speakers for #SyPy which is the Sydney Python meet-up held most months and sponsored by Atlassian. I had previously put my hand up to help out if this situation ever came up and was mostly ready with a presentation about Decoding Captchas. I did not expect it to be so full that people were standing (largest crowd I had ever seen there). Thankfully it seemed to go over well and while I need to get more practice at public speaking I did enjoy it. A few choice tweets that came out of the end of the event,&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sun, 08 Mar 2015 22:41:13 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/03/decoding-captchas-presentation/</guid></item><item><title>Displaying Kindle clippings for the web</title><link>https://bastian.rieck.me/blog/2015/kindle_clippings/</link><description>&lt;p&gt;Since I got my Kindle, the number of quotes in my quote data base
started to increase exponentially. Clicking &amp;ldquo;Highlight&amp;rdquo; to save an
interesting passage is so tempting. Now, a few months later, I of course
wanted some way to display this treasure trove. I basically wanted a
version of the good old &lt;code&gt;fortune&lt;/code&gt; command, but a bit more
modern—for those Web 2.0 times we are living in.&lt;/p&gt;
&lt;p&gt;Luckily, the clippings format is &lt;em&gt;very&lt;/em&gt; straightforward and only
involves a little bit of text parsing. Below you can find my first
feeble attempt at displaying a random quote from my clippings file. To
use the script, you first need your clippings file. You can usually find
it under the root directory of wherever your Kindle is mounted, for
example &lt;code&gt;Kindle/documents/My Clippings.txt&lt;/code&gt;. Rename the file to
&lt;code&gt;Clippings.txt&lt;/code&gt;. Now place the script below and the clippings file in a
folder that is being served by a web server that enables you to execute
CGI scripts. And you are done.&lt;/p&gt;
&lt;p&gt;Since the script is barely doing anything, I am releasing this version
into the public domain. I would love to provide an example installation
for the script but I am currently migrating between servers, so I do not
want to dabble with any CGI scripts as well. I will write a follow-up
post if the script becomes more polished.&lt;/p&gt;
&lt;p&gt;Happy reading until then.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;cgi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;readClippings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;separator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"=========="&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;blocks&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\ufeff&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Replace broken BOM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;separator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;blocks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;splitClipping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clipping&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;publication&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clipping&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;quote&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;clipping&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;publication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Content-type: text/html; charset=UTF-8"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clippings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;readClippings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Clippings.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clippings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;splitClipping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;clippings&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;clippings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;clippings&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;publication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clippings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'''
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;  &amp;lt;title&amp;gt;Spark: A random quote from Kindle clippings&amp;lt;/title&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;/head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;body&amp;gt;'''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'''
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;  &amp;lt;blockquote&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;  &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;  &amp;lt;/blockquote&amp;gt;  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;/p&amp;gt;'''&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;cgi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'''
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;p style="text-align:right"&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;  &amp;amp;mdash; &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;'''&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;cgi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;publication&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'''
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;/body&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;/html&amp;gt;'''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 08 Mar 2015 21:15:33 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/kindle_clippings/</guid></item><item><title>Regular bookmarks</title><link>https://xenodium.com/regular-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://roadsandkingdoms.com/category/food/"&gt;Roads &amp;amp; Kingdoms (food)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://roadsandkingdoms.com/category/music"&gt;Roads &amp;amp; Kingdoms (music)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://roadsandkingdoms.com/category/travel/"&gt;Roads &amp;amp; Kingdoms (travel)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 08 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/regular-bookmarks</guid></item><item><title>Photography bookmarks</title><link>https://xenodium.com/photography-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.techradar.com/how-to/photography-video-capture/cameras/77-photography-techniques-tips-and-tricks-for-taking-pictures-of-anything-1320768/"&gt;77 photography techniques, tips and tricks for taking pictures of anything&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sites.google.com/site/marclevoylectures/schedule"&gt;Course schedule - Digital Photography&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.qdev.de/?location=mac/exifrenamer"&gt;ExifRenamer: Batch rename photos using exif information&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Jack000/Expose"&gt;Exposé, A simple static site generator for photoessays&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ko-fi.com/s/f7ed5aec56"&gt;Japanese Storefront Reference set - Elora 's Ko-fi Shop - Ko-fi&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://gakuran.com/category/haikyo-ruins/"&gt;Michael Gakuran's Gakuranman&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openmv.io/"&gt;OpenMV (Small - Affordable - Expandable)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/photocritique"&gt;Photo Critique (Subreddit)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 08 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/photography-bookmarks</guid></item><item><title>Paris travel bookmarks</title><link>https://xenodium.com/paris-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.ateliermaitrealbert.com/"&gt;Atelier Maitre Albert (known for its rotisserie chicken)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Au Passage. Small plates in fun atmosphere.&lt;/li&gt;
&lt;li&gt;Berthillon Ice Cream.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.yelp.com/biz/breizh-caf%C3%A9-paris-2"&gt;Breizh Café (traditional gallete, savory buckwheat crepes)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Buvette Gastrotheque. Wine bar with small dishes.&lt;/li&gt;
&lt;li&gt;Cheri Bibi, possibly hipster, underneath Sacre Coeur, good cocktails.&lt;/li&gt;
&lt;li&gt;Creperie Josseline. Worth the queue. Drink Breton cider with crepes.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://holybel.ly"&gt;Holybelly&lt;/a&gt; Canal Saint Martin.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://xdaysiny.com/how-to-spend-a-culinary-weekend-in-paris/"&gt;How To Spend a Culinary Weekend In Paris&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;L'Aller Retour. The place for steak-frites.&lt;/li&gt;
&lt;li&gt;L'Office. Wine bar/bistrot.&lt;/li&gt;
&lt;li&gt;Le Barav'.&lt;/li&gt;
&lt;li&gt;Le Petit Poucet (restaurant next to Place de Clichy, Paris).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lereminet.com"&gt;Le Reminet&lt;/a&gt; (Paris restaurant).&lt;/li&gt;
&lt;li&gt;Marché d'Aligre. Authentic neighbourhood market.&lt;/li&gt;
&lt;li&gt;Marché des Enfants Rouge. Small covered market. Eat at food stalls.&lt;/li&gt;
&lt;li&gt;Mosquee de Paris. City mosque. Drink mint tea at courtyard under olive trees or eat in restaurant inside. North African food.&lt;/li&gt;
&lt;li&gt;Musee d'Orsay.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sprudge.com/paris-a-guide-to-some-of-the-best-cafes-in-canal-st-martin-56068.html"&gt;Paris: A Guide To Some Of The Best Cafes In Canal St. Martin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Pierre Herme. For great pastries and macarons.&lt;/li&gt;
&lt;li&gt;RATP for transport info including the &amp;quot;carnet&amp;quot; of 10 tickets.&lt;/li&gt;
&lt;li&gt;Rodin Museum.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.yelp.com/biz/west-country-girl-paris"&gt;West Country Girl (crepes)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-are-the-best-boulangeries-and-patisseries-in-Paris-for-each-arrondissement"&gt;What are the best boulangeries and patisseries in Paris for each arrondissement? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-are-the-best-places-to-buy-cheese-in-Paris"&gt;What are the best places to buy cheese in Paris? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/Where-are-best-vintage-stores-in-Paris"&gt;Where are best vintage stores in Paris? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/Where-are-the-best-flea-markets-in-Paris"&gt;Where are the best flea markets in Paris? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 08 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/paris-travel-bookmarks</guid></item><item><title>Org mode bookmarks</title><link>https://xenodium.com/org-mode-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.emacslife.com/baby-steps-org.html"&gt;A Baby Steps Guide to Managing Your Tasks with Org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.aaronbieber.com/2016/09/24/an-agenda-for-life-with-org-mode.html"&gt;An Agenda for Life With Org Mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scripter.co/notes/org-table-spreadsheet/"&gt;An Org Table Spreadsheet cheatsheet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/13340616/assign-ids-to-every-entry-in-org-mode"&gt;Assigning ids to entries&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thewanderingcoder.com/2015/03/automating-boilerplate-in-org-mode-journalling/"&gt;Automating boilerplate in org-mode journalling&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/jc4uou/tags_everywhere/"&gt;Beautiful Emacs tags (maybe for org mode?)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zzamboni.org/post/beautifying-org-mode-in-emacs"&gt;Beautifying Org Mode in Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emacs-doctor.com/blogging-from-emacs.html"&gt;Blogging from GNU Emacs/org (with rss example)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sadiqpk.org/blog/2018/08/08/blogging-with-org-mode.html"&gt;Blogging with Emacs org-mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yewtu.be/watch"&gt;Build a second brain&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mullikine.github.io/posts/arbitrary-interpreters-for-babel/"&gt;Compounding Confoundment: arbitrary interpreters for Babel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/sadiq/sadiq.gitlab.io/blob/master/src/blog-atom.sh"&gt;Creating org atom xml feed with blog-atom.sh&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/philipphoman/org-mode-poster"&gt;Creating scientific posters with org-mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/learnbyexample/customizing-pandoc-to-generate-beautiful-pdfs-from-markdown-3lbj"&gt;Customizing pandoc to generate beautiful pdfs from markdown (helpful to tweak org export)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dfeich/org-babel-examples/blob/master/README.org"&gt;dfeich/org-babel-examples (GitHub)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dfeich/org-babel-examples/blob/master/README.org"&gt;Dfeich’s Org-babel, org-exporter, org-table example collection&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/zzamboni/ox-leanpub"&gt;Diego Zamboni / ox-leanpub · GitLab&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://correl.phoenixinquis.net/2015/07/12/git-graphs.html"&gt;Drawing Git Graphs with Graphviz and Org-Mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ergoemacs.org/emacs/elisp_parse_org_mode.html"&gt;Elisp: Parse Org Mode (API examples by Xah Lee)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ehneilsen.net/notebook/orgExamples/org-examples.html"&gt;Emacs org-mode examples and cookbook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jherrlin.github.io/posts/emacs-orgmode-source-code-blocks2/"&gt;Emacs Orgmode Source Code Blocks 2 | jherrlin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emacs.stackexchange.com/questions/51399/org-babel-tangle-with-function-in-header-arguments/51769#51769"&gt;Executing org source blocks when loading file (and defining file-local vars)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nikclayton/ob-html-chrome"&gt;Export Org HTML SRC blocks as PNG files using Chrome&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/ambrevar/ambrevar.gitlab.io/blob/master/feed-builder/feed-builder.el"&gt;feed-builder/feed-builder.el an org/blog rss implementation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://howardism.org/Technical/Emacs/getting-more-boxes-done.html"&gt;Getting Boxes Done, the Code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/DarkBuffalo/ox-report"&gt;GitHub - DarkBuffalo/ox-report: Export your org file to minutes report PDF file&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/misohena/el-easydraw"&gt;GitHub - misohena/el-easydraw: Embedded drawing tool for Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/niklasfasching/go-org"&gt;GitHub - niklasfasching/go-org: Org mode parser with html &amp;amp; pretty printed org rendering&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alphapapa/helm-org-rifle"&gt;helm-org-rifle: Rifle through your Org buffers and acquire your target&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/6mzgkg/how_can_orgbabel_be_configured_to_set_variables/"&gt;How can org-babel be configured to set variables across multiple language? (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://her.esy.fun/posts/0015-how-i-use-org-mode/index.html"&gt;How I use org-mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://orgmode.org/manual/HTML-doctypes.html#HTML-doctypes"&gt;HTML doctypes (The Org Manual)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.miskatonic.org/2016/08/25/image-display-size-in-org/"&gt;Image display size in Org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://karl-voit.at/2021/08/28/pim-lecture-tug-2021/"&gt;Karl Voit's personal information management PIM Lecture at TU Graz&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kelvinh.github.io/wiki/org-mode-manual/"&gt;Kevin's org notes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://howardism.org/Technical/Emacs/literate-devops.html"&gt;Literate DevOps with org source blocks (Howardism)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.howardism.org/Technical/Emacs/literate-devops.html"&gt;Literate DevOps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cachestocaches.com/2018/6/org-literate-programming/"&gt;Literate Programming with Org-mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.offerzen.com/blog/literate-programming-empower-your-writing-with-emacs-org-mode"&gt;Literate Programming: Empower Your Writing with Emacs Org-Mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.newartisans.com/2007/08/using-org-mode-as-a-day-planner/"&gt;Lost in Technopolis (getting things done with org agenda)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://irreal.org/blog/?p=7651"&gt;Making a Poster with Org-mode (Irreal)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://isamert.net/2021/04/21/managing-your-contacts-in-org-mode-and-syncing-them-to-your-phone-android-ios-whatever-.html"&gt;Managing your contacts in org-mode and syncing them to your phone&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bytedude.com/files/managing-your-life-with-org-mode.html"&gt;Managing Your Life With org-mode and Other Tools&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mbork.pl/2018-08-18_Embedding_files_in_Org-mode_revisited"&gt;Marcin Borkowski: 2018-08-18 Embedding files in Org-mode revisited&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fuco1.github.io/2018-12-23-Multiline-fontification-with-org-emphasis-alist.html"&gt;Multiline fontification (ie. bold) with org-emphasis-alist&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joshrollinswrites.com/emacsorg/org-capture-template-1/"&gt;My Org Capture Templates - Part 1 · The Art of Not Asking Why&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joshrollinswrites.com/emacsorg/org-capture-template-3/"&gt;My Org Capture Templates - Part 3 · The Art of Not Asking Why&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/hnf3cw/my_orgmode_agenda_much_better_now_with_category/"&gt;My org-mode agenda, much better now with category icons! : emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://patrickskiba.com/org-mode/2019/05/22/uses-for-org-mode.html"&gt;My Org-mode use cases (Patrick Skiba)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cachestocaches.com/2016/9/my-workflow-org-agenda/"&gt;My Workflow with Org-Agenda&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://christiantietze.de/posts/2019/12/emacs-notifications/"&gt;Native macOS Notifications for Emacs Org Tasks and Appointments&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kitchingroup.cheme.cmu.edu/blog/2016/11/04/New-link-features-in-org-9/"&gt;New link features in org 9&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ndwarshuis/om.el/blob/master/README.md"&gt;om.el/README.md at master · ndwarshuis/om.el · GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dfeich/org-babel-examples"&gt;Org babel examples repo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://org-babel.readthedocs.io/en/latest/"&gt;Org Babel reference card&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/eschulte/babel-dev/master/scraps.org"&gt;org babel scraps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ag91.github.io/blog/2020/08/28/org-crypt-and-logbook-how-they-can-work-together-for-a-secure-agenda/"&gt;Org crypt and LOGBOOK: how they can work together for a secure agenda.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://titan-c.gitlab.io/org-cv/"&gt;Org CV/resume&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.star.bris.ac.uk/bjm/org-basics.html"&gt;Org mode basics&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://writepermission.com/org-blogging-rss-feed.html"&gt;Org mode blogging: RSS feed&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://home.fnal.gov/~neilsen/notebook/orgExamples/org-examples.html"&gt;Org mode examples and cookbook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://home.fnal.gov/~neilsen/notebook/orgExamples/org-examples.html"&gt;Org mode examples&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/9d8i7y/org_mode_habits/"&gt;Org Mode Habits : emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/drj42/1755992"&gt;Org mode reference card&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://orgmode.org/worg/org-tutorials/"&gt;Org tutorials&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alphapapa.github.io/org-almanac/"&gt;org-almanac&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sprig/org-capture-extension/blob/master/README.md"&gt;org-capture-extension (GitHub)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/eschulte/org-ehtml"&gt;org-ehtml: Export Org-mode files as editable web pages&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/theodorewiles/org-mind-map"&gt;org-mind-map: creates graphviz directed graphs from org-mode files&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pragmaticemacs.com/emacs/org-mode-basics-vii-a-todo-list-with-schedules-and-deadlines/"&gt;Org-mode basics VII: A TODO list with schedules and deadlines | Pragmatic Emacs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bzg.fr/en/some-emacs-org-mode-features-you-may-not-know.html/"&gt;Org-mode features You May Not Know · Bastien Guerry - Liberté, informatique&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yiufung.net/post/org-mode-hidden-gems-pt2/"&gt;Org-mode Hidden Gems - 02 Tables&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/flexibeast/org-vcard/"&gt;org-mode support for vCard export and import&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/weirdNox/org-noter"&gt;org-noter: Emacs document annotator, using Org-mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alhassy.github.io/org-special-block-extras/README.html"&gt;org-special-block-extras&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alphapapa/org-web-tools"&gt;org-web-tools: Commands and functions for retrieving web page content and processing it into and displaying it as Org-mode content.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alphapapa/org-web-tools"&gt;org-web-tools: View, capture, and archive Web pages in Org-mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/lyon0xd/uml/blob/master/org/test.org"&gt;org/uml examples&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.zcl.space/tools/organize-you-life-in-org/"&gt;Organize you life in Emacs Org | ZCL.SPACE&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://doc.norang.ca/org-mode.html"&gt;Organize your life in plain text&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLVtKhBrRV_ZkPnBtt_TD1Cs9PJlU0IIdE&amp;amp;app=desktop"&gt;OrgMode tutorial - YouTube channel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://forum.effectivealtruism.org/posts/w4CM7RfTLXxYLDccX/pablo-stafforini-s-forecasting-system-1"&gt;Pablo Stafforini’s Forecasting System - EA Forum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@tasshin/plan-your-day-daily-time-management-with-emacs-org-mode-and-google-calendar-a9162837fdb3"&gt;Plan your day: Daily Time Management with Emacs, Org-Mode, and Google Calendar&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=23130104"&gt;Prettifying Org Mode with CSS | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sandyuraz.com/articles/orgmode-css/"&gt;Prettifying Org Mode with CSS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://puntoblogspot.blogspot.com/2018/12/3-basic-org-agenda-tips-for.html"&gt;puntoblogspot: 3 basic org agenda tips for the fundamentally forgetful&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vxlabs.com/2017/06/03/querying-restful-webservices-into-emacs-orgmode-tables/"&gt;Querying RESTful webservices into Emacs orgmode tables (vxlabs)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLVtKhBrRV_ZkPnBtt_TD1Cs9PJlU0IIdE"&gt;Rainer König's OrgMode YouTube tutorials&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fuco1.github.io/2019-02-10-Refiling-hydra-with-pre-defined-targets.html"&gt;Refiling hydra with pre-defined targets&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.lujun9972.win/emacs-document/blog/2018/10/22/ricing-up-org-mode/index.html"&gt;Ricing up Org Mode - EMACS-DOCUMENT&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lepisma.github.io/2017/10/28/ricing-org-mode/"&gt;Ricing up Org Mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.arcadianvisions.com/blog/#orga597dcf"&gt;Robust Notes with Embedded Code (extensive org babel usage)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://orgmode.org/guide/"&gt;The compact Org-mode Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ag91.github.io/blog/2020/09/04/the-poor-org-user-spaced-repetition/"&gt;The Poor Org-User Spaced Repetition - Where parallels cross&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.flutterbys.com.au/stats/tut/tut16.1.html"&gt;Tutorial 16.1 - Emacs orgmode tables&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://karl-voit.at/2017/08/12/org-rabbit-hole/"&gt;UOMF: Org Mode As a Rabbit Hole: Agenda Tasks Piling Up&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://karl-voit.at/2017/01/15/org-clone-subtree-with-time-shift/"&gt;UOMF: Recurring Events with Org Mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sastibe.de/2018/05/2018-05-11-emacs-org-mode-rest-apis-stocks/"&gt;Use Emacs Org Mode and REST APIs for an up-to-date Stock Portfolio&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cestlaz.github.io/posts/using-emacs-24-capture-2/#.WTtEbXWw5pg"&gt;Using Emacs - 24 - Org Capture 2&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cestlaz.github.io/post/using-emacs-54-org-tables"&gt;Using Emacs 54 Org Tables&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dpitt.me/blog/2020/03/zettelkasten"&gt;Using Emacs's org-mode As Your Zettelkasten&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.diegoberrocal.com/blog/2015/08/19/org-protocol/"&gt;Using org-capture with org-protocol be like - Diego Berrocal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kitchingroup.cheme.cmu.edu/blog/2019/02/12/Using-results-from-one-code-block-in-another-org-mode/"&gt;Using results from one code block in another org-mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ofosos.org/2017/12/04/sudo-org-babel/"&gt;Using sudo in org-babel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/emacs/comments/jof1p3/visit_tangled_file_with_orgopenatpoint/"&gt;Visit tangled file with org-open-at-point (supports tramp/ssh)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pjs64.wordpress.com/2020/12/07/worgsheet-calc-intro/"&gt;WorgSheet Calc Intro – Dj Pj (lots of tips and shortcuts)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://katherine.cox-buday.com/blog/2015/03/14/writing-specs-with-org-mode/"&gt;Writing Specs with Org-mode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch"&gt;YouTube: org introduction&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nobiot/Zero-to-Emacs-and-Org-roam"&gt;Zero to Emacs and Org-roam: a step-by-step guide&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 08 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/org-mode-bookmarks</guid></item><item><title>London food backlog</title><link>https://xenodium.com/london-food-backlog</link><description>&lt;h2&gt;B_acklog&lt;/h2&gt;
&lt;h3&gt;&lt;a href="https://www.saporitaliarestaurant.co.uk"&gt;Saporitalia (Italian/pizza), Notting Hill&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="https://theblacklock.com/menus/"&gt;Menus | Lunch, Dinner, Sunday Roast - Blacklock&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="https://thebarbary.co.uk/food-drink/"&gt;Food &amp;amp; Drink - The Barbary | Covent Garden Restaurant | Neal's Yard | London&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="https://www.pophamsbakery.com/"&gt;Pophams Bakery&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="https://www.timeout.com/london/restaurants/yipin-china"&gt;Yipin China | Restaurants in Islington, London&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="https://m.facebook.com/sundaybarnsbury/"&gt;Sunday (breakfast)&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="https://www.clifton.co.uk/the-quince-tree-cafe-london"&gt;The Quince Tree Cafe London (Cafe), Paddington&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="https://www.bombaybustle.com"&gt;Bombay Bustle (Indian), Mayfair&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="https://www.kyseri.co.uk"&gt;Kyseri (modern turkish), Fitzrovia&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="http://www.pied-a-terre.co.uk/"&gt;Pied a Terre (fine dining), Fitzrovia&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="http://www.theledbury.com/tasting-menu/"&gt;The Ledbury (fine dining), Notting Hill&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="https://www.flourandgrape.com"&gt;Flour and Grape (Pasta), Bermondsey&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="https://www.honipoke.com/"&gt;Honi Pokē (poke), Soho&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;&lt;a href="http://zialucia.com/"&gt;ZIA LUCIA (pizza), Highbury Islington&lt;/a&gt;.&lt;/h3&gt;
&lt;h3&gt;Yeast Bakery.&lt;/h3&gt;
&lt;h3&gt;Pavillion Cafe.&lt;/h3&gt;
&lt;h3&gt;Palm Vaults.&lt;/h3&gt;
&lt;h2&gt;Angel&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.shawarmabar.co.uk/"&gt;Shawarma Bar - Berber and Q&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://bombayburrito.co.uk/"&gt;Bombay Burrito (Indian burrito takeaway &amp;amp; restaurant: Angel, Islington)&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Baker Street&lt;/h2&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://www.anticapizzeriadamichele.co.uk"&gt;L’ANTICA PIZZERIA DA MICHELE (Pizza), Baker Street&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Barbican&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://sushitetsu.co.uk"&gt;Sushi Tetsu (must book, well in advance)&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Barnsbury&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Sunday (breakfast, cafe, working).&lt;/p&gt;
&lt;h2&gt;Battersea&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://tonkotsu.co.uk/"&gt;Tonkotsu (ramen)&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Brick Lane&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.chezellesbistroquet.co.uk"&gt;Chez Elles&lt;/a&gt; (french).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.yelp.com/biz/fika-london-2"&gt;Fika&lt;/a&gt; (Swedish, cinnamon buns, coffee).&lt;/p&gt;
&lt;h2&gt;Bermondsey&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Druid Street market&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;FAT London (Kimchee ).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;amp; Cultured butter.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Bethnal Green&lt;/h2&gt;
&lt;h3&gt;[DONE]{.done .DONE} &lt;a href="https://lahpet.co.uk/"&gt;Lahpet&lt;/a&gt; (Burmese) &amp;lt;2018-12-02 Sun&amp;gt; &amp;lt;2018-12-27 Thu&amp;gt;&lt;/h3&gt;
&lt;hr /&gt;
&lt;h2&gt;id: lahpet-burmese-2018-12-02-sun-2018-12-27-thu&lt;/h2&gt;
&lt;h2&gt;Brixton&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.nanban.co.uk/"&gt;Nanban&lt;/a&gt; (Japanese soul food).&lt;/p&gt;
&lt;h2&gt;Borough&lt;/h2&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://padella.co"&gt;Padella&lt;/a&gt; (great fresh pasta).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://roastingplant.com/"&gt;Roasting Plant: Fresh Roasted Coffee&lt;/a&gt; &amp;lt;2019-01-15 Tue&amp;gt;&lt;/p&gt;
&lt;h2&gt;Camberwell&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://suncamberwell.com"&gt;Sun of Camberwell&lt;/a&gt; (Roast beef, Yorkshire, and sticky toffee pudding).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.timeout.com/london/restaurants/silk-road"&gt;Silk Road (Chinese, Lamb/cumin skewers)&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Canada Water&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.chuckburgerbar.com/#canadawater"&gt;Chuck burger (truck)&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Cannon street&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.theinfatuation.com/london/reviews/brigadiers"&gt;The Brigadiers (Indian)&lt;/a&gt; &amp;lt;2019-01-22 Tue&amp;gt;&lt;/p&gt;
&lt;h2&gt;Chiswick&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.thecoffeetraveller.com/"&gt;The Coffee Traveller&lt;/a&gt; &amp;lt;2019-01-16 Wed&amp;gt;&lt;/p&gt;
&lt;h2&gt;Covent Garden&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.punjab.co.uk/"&gt;Punjab&lt;/a&gt; (Punjabi).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.dintaifung-uk.com/"&gt;鼎泰豐・Din Tai Fung・ディンタイフォン・딘타이펑 (soup dumplings)&lt;/a&gt; &amp;lt;2019-03-12 Tue&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.littlekolkata.co.uk/"&gt;Little Kolkata (London Restaurant - Kolkata Spirits)&lt;/a&gt; &amp;lt;2019-03-12 Tue&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.duendelondon.com/"&gt;Duende&lt;/a&gt; (modern Spanish).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://rockandsoleplaice.com"&gt;Rock &amp;amp; Sole Plaice&lt;/a&gt; (fish and chips).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://tyuk.com"&gt;Timber Yard&lt;/a&gt; (coffee, working).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.chicknsours.co.uk/"&gt;Chicks 'n' Sours&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.jidori.co.uk/"&gt;Jidori&lt;/a&gt; (chicken yakitori) &amp;lt;2018-12-02 Sun&amp;gt;&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} Dishoom (Indian), try Lamb raan.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://www.sagarveg.co.uk"&gt;Sagar&lt;/a&gt; (South Indian): Great food!&lt;/p&gt;
&lt;h2&gt;Clapham&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.joepublicpizza.com"&gt;Joe Public Pizza&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Crouch end&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.the-haberdashery.com"&gt;The Haberdashery&lt;/a&gt; (coffee, working).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.localblend.co.uk/blend-harringay-2"&gt;Blend&lt;/a&gt; (coffee, working).&lt;/p&gt;
&lt;h2&gt;Ealing&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Kiraku (Sushi).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://wacafe.co.uk/"&gt;Wa Cafe (Japanese Patiserie)&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Earls court&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://mamlondon.com"&gt;MAM&lt;/a&gt; (Vietnamese) &amp;lt;2018-12-02 Sun&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.facebook.com/ukjollibee/?utm_source=tripadvisor&amp;amp;utm_medium=referral"&gt;Jollibee UK (filipino fried chicken/fast food)&lt;/a&gt; &amp;lt;2019-03-12 Tue&amp;gt;&lt;/p&gt;
&lt;h2&gt;Edware road&lt;/h2&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://gogi-restaurant.com"&gt;GOGI&lt;/a&gt; (korean): Average. Also, they lied to me and apologized with £10 credit.&lt;/p&gt;
&lt;h2&gt;Euston&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Roti King (Indian/Pakistani/Singaporean): 40, Doric Way, Euston, NW1 1LH.&lt;/p&gt;
&lt;h2&gt;Farringdon&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Quality Chop House.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Daddy Donkey (Mexican).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://jandacafe.com"&gt;J+A&lt;/a&gt; (coffe, working).&lt;/p&gt;
&lt;h2&gt;Fitzrovia&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.indianymca.org/"&gt;Indian YMCA&lt;/a&gt; (inexpensive Indian).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.pastificioaldente.com"&gt;Pastificio al dente (Italian, fresh pasta)&lt;/a&gt; &amp;lt;2019-03-12 Tue&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.houseofho.co.uk/home"&gt;House of Ho&lt;/a&gt; (Vietnamese).&lt;/p&gt;
&lt;h2&gt;Golders Green&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Cafe Japan (Sushi).&lt;/p&gt;
&lt;h2&gt;Hackney&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.pidginlondon.com"&gt;Pidgin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://dabbadrop.co.uk"&gt;DabbaDrop (Indian delivery subscription)&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Hammersmith&lt;/h2&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://indian-zing.co.uk/"&gt;Indian Zing&lt;/a&gt; (Indian): It was OK (not great).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.etfoodvoyage.com/2018/08/24/dragon-cat-cafe/"&gt;Dragon cat cafe&lt;/a&gt; (bubble tea and wheel cake). &amp;lt;2019-07-14 Sun&amp;gt;&lt;/p&gt;
&lt;h2&gt;Hamstead&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.jinkichi.com/"&gt;Jin Kichi&lt;/a&gt; (Japanese).&lt;/p&gt;
&lt;h2&gt;Harrow&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://mazarafghanrestaurant.co.uk/contact/"&gt;Mazar&lt;/a&gt; (Afghan).&lt;/p&gt;
&lt;h2&gt;Hatch End&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.chuckburgerbar.com/"&gt;Chuck Burger&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Holborn&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.prufrockcoffee.com"&gt;Prufrock Café&lt;/a&gt; (coffee, working).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.goodandpropertea.com/find-us"&gt;Good &amp;amp; Proper&lt;/a&gt; (coffee, tea, working).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.theinfatuation.com/london/reviews/noble-rot"&gt;Noble Rot (wine bar/food)&lt;/a&gt; &amp;lt;2019-01-22 Tue&amp;gt;&lt;/p&gt;
&lt;h2&gt;Holloway Road&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Xi'an impression (Xi'an)&lt;/p&gt;
&lt;h2&gt;Islington&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://delhigrill.com"&gt;Delhi Grill&lt;/a&gt; (Indian), try chicken makhani and naan.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.bababoom.london"&gt;BabaBoom&lt;/a&gt; (the kebab makers) &amp;lt;2018-12-02 Sun&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://rootsatn1.com"&gt;Roots N1&lt;/a&gt; (Indian).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.thepigandbutcher.co.uk/"&gt;The pig and butcher&lt;/a&gt; (sunday roast).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://busanbbq.co.uk"&gt;Busan BBQ&lt;/a&gt; (Korean meets American diner/burgers and fried chicken).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://smokehouseislington.co.uk/"&gt;Smokehouse Islington&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.etfoodvoyage.com/2019/02/19/katsute-100/"&gt;Katsuke 100&lt;/a&gt; (Japanese tea/cake room). &amp;lt;2019-07-14 Sun&amp;gt;&lt;/p&gt;
&lt;h2&gt;Kensington&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Clarke's, try the burger.&lt;/p&gt;
&lt;h2&gt;Kensal Green&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.tripadvisor.com/Restaurant_Review-g186338-d3531042-Reviews-Centro_Galego_de_Londres-London_England.html"&gt;Centro Galego de Londres&lt;/a&gt; (Gallician).&lt;/p&gt;
&lt;h2&gt;Kentish town&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.timeout.com/london/restaurants/the-fields-beneath"&gt;The Fields Beneath&lt;/a&gt; (coffee, working).&lt;/p&gt;
&lt;h2&gt;King's Cross&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Itadaki Zen.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.germangymnasium.com/"&gt;German Gymnasium&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://starofkings.co.uk/food-and-drink/"&gt;Yeah! Burger at Star of Kings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.wingwing.co.uk/"&gt;Wing Wing (Korean fried chicken)&lt;/a&gt;s.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.etfoodvoyage.com/2018/08/31/sambal-shiok-has-a-permanent-home"&gt;Sambal Shiok&lt;/a&gt; known for laksa and satai burger. &amp;lt;2019-07-14 Sun&amp;gt;&lt;/p&gt;
&lt;h2&gt;Leicester square&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://ichibanya.uk/"&gt;Curry House Ichibanya UK Japanese Restaurant London WC2H&lt;/a&gt; &amp;lt;2019-03-12 Tue&amp;gt;.&lt;/p&gt;
&lt;h2&gt;Leytonstone&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.singburi.co.uk"&gt;Singburi (Thai)&lt;/a&gt; &amp;lt;2019-05-07 Tue&amp;gt;.&lt;/p&gt;
&lt;h2&gt;Liverpool street&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.gunpowderlondon.com"&gt;Gunpowder&lt;/a&gt; (Indian).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Cinnamon Kitchen (Indian).&lt;/p&gt;
&lt;h2&gt;London Bridge&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.santoremedio.co.uk/"&gt;Santo Remedio&lt;/a&gt; (Mexican).&lt;/p&gt;
&lt;h2&gt;Marylebone&lt;/h2&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://www.timeout.com/london/restaurants/fischers"&gt;Fischer's&lt;/a&gt; (Austrian). Great atmosphere and schnitzel. Not cheap.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Nambutei (Sushi).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.lurra.co.uk/"&gt;Lurra&lt;/a&gt; (Basque).&lt;/p&gt;
&lt;h2&gt;Mayfair&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.mayfairchippy.com"&gt;Mayfair chippy&lt;/a&gt; (Fish and chips).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.ikedarestaurant.com/"&gt;Ikeda&lt;/a&gt; (Japanese).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.the-araki.com/"&gt;THE ARAKI (Sushi) / pricey&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Mornington Crescent&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Asakusa (Japanese).&lt;/p&gt;
&lt;h2&gt;Notting Hill&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.localblend.co.uk/blend-harringay-2"&gt;Blend&lt;/a&gt; (coffee, working).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.thecontinentalpantry.com/"&gt;The continental pantry&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://mamlondon.com"&gt;MAM&lt;/a&gt; (Vietnamese) &amp;lt;2018-12-02 Sun&amp;gt;&lt;/p&gt;
&lt;h2&gt;Old Street&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://sardine.london"&gt;Sardine&lt;/a&gt; (French).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://sasukeramen.co.uk/"&gt;Sasuke&lt;/a&gt; (ramen).&lt;/p&gt;
&lt;h2&gt;Olympia&lt;/h2&gt;
&lt;p&gt;[DONE]{.done .DONE} Aborz (Iranian). &amp;lt;2018-12-27 Thu&amp;gt;&lt;/p&gt;
&lt;h2&gt;Oxford street&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Roti Chai (Indian).&lt;/p&gt;
&lt;h2&gt;Peckham&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.ganapatirestaurant.com"&gt;Ganapati&lt;/a&gt; (South Indian).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://thebeggingbowl.co.uk/"&gt;The Begging Bowl (Thai)&lt;/a&gt; &amp;lt;2019-05-07 Tue&amp;gt;.&lt;/p&gt;
&lt;h2&gt;Piccadilly&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.urbantearooms.com/menus"&gt;Urban tea rooms (coffee/tea/brunch)&lt;/a&gt; &amp;lt;2019-03-12 Tue&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://machi-ya.co.uk/"&gt;Machiya&lt;/a&gt; (Japanese comfort) &amp;lt;2018-12-02 Sun&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://yoriuk.com/"&gt;YORI-Korean Restaurant&lt;/a&gt; &amp;lt;2019-03-12 Tue&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.ica.art/rochelle-canteen"&gt;Rochelle Canteen @ The Institute of Contemporary Arts (ICA)&lt;/a&gt; (Pie and ping Sunday special) &amp;lt;2019-02-12 Tue&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.fortnumandmason.com/products/dark-chocolate-coated-chocolate-pearl"&gt;Dark Chocolate Coated Chocolate Pearl, 190g - Fortnum &amp;amp; Mason&lt;/a&gt; &amp;lt;2020-06-14 Sun&amp;gt;.&lt;/p&gt;
&lt;h2&gt;Putney&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.tripadvisor.co.uk/ShowUserReviews-g186338-d807103-r176708451-Tomoe-London_England.html"&gt;authentic Japanese restaurant in Putney - Tomoe, London Traveller Reviews - TripAdvisor&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Sheppherds bush&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.etfoodvoyage.com/2017/09/03/caco-co/"&gt;Caco &amp;amp; Co&lt;/a&gt; (Portuguese cafe). &amp;lt;2019-07-14 Sun&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.etfoodvoyage.com/2017/03/17/chop-chop-noodle-bar/"&gt;Chop chop&lt;/a&gt; (Noodle bar). &amp;lt;2019-07-14 Sun&amp;gt;&lt;/p&gt;
&lt;h2&gt;Shoreditch&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://mastbrothers.com/pages/london"&gt;Mast Brothers chocolate makers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.sagardi.co.uk/en/"&gt;Sagardi&lt;/a&gt; (basque).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.lookmumnohands.com/"&gt;Look mum no hands&lt;/a&gt; (cofee, working).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://jandacafe.com"&gt;J+A&lt;/a&gt; (coffe, working).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.goodandpropertea.com/find-us"&gt;Good &amp;amp; Proper&lt;/a&gt; (coffee, tea, working).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://smokestak.co.uk"&gt;Smokestak&lt;/a&gt; (BBQ).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://pickyglutton.com/2015/08/17/banh-mi-in-london-review/"&gt;Pho Viet 68&lt;/a&gt; (Banh mi).&lt;/p&gt;
&lt;h2&gt;Sloane Square&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://rasoi-uk.com/"&gt;Rasoi&lt;/a&gt; (Indian).&lt;/p&gt;
&lt;h2&gt;Soho&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.lehanoi.uk/"&gt;Le Hanoi&lt;/a&gt; (Vietnamese) &amp;lt;2018-12-02 Sun&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.thevietnamesekitchen.co.uk/"&gt;Cay Tre&lt;/a&gt; (Vietnamese) &amp;lt;2018-12-02 Sun&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://vietnamfood.co.uk/vietfood"&gt;Viet Food&lt;/a&gt; (Vietnamese) &amp;lt;2018-12-02 Sun&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.taotaoju.co.uk/"&gt;Tao Tao Ju&lt;/a&gt; (Dim sum) &amp;lt;2018-12-02 Sun&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.lokhandwala.co.uk/"&gt;Lokhandwala London (Top Indian Tapas Restaurant &amp;amp; Bar in London)&lt;/a&gt; &amp;lt;2019-01-15 Tue&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://dumlondon.com/"&gt;DUM biryani (Indian)&lt;/a&gt; &amp;lt;2019-01-15 Tue&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://pastaio.london"&gt;Pastaio (Italian, fresh pasta)&lt;/a&gt; &amp;lt;2019-01-15 Tue&amp;gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://bun.house/"&gt;Bun House&lt;/a&gt; (ie. pork buns).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://temperrestaurant.com/"&gt;Temper restaurant&lt;/a&gt; (BBQ/tapas).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.goldenunion.co.uk"&gt;Golden Union&lt;/a&gt; (fish bar).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://meltroom.com/"&gt;Melt Room&lt;/a&gt; (Cheese toasties).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://shotgunbbq.com/"&gt;Shotgun&lt;/a&gt; (BBQ).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://smacklobster.com/"&gt;Smack Lobster&lt;/a&gt; (Lobster rolls).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://pickyglutton.com/2014/11/05/smoking-goat-review/"&gt;Smoking Goat&lt;/a&gt; (Thai), highly recommended.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.atariya.co.uk/restaurants/"&gt;Atari Ya&lt;/a&gt; (Sushi).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Yumi Izakaya (Japanese).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Jugemu (Japanese).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.darjeeling-express.com/"&gt;Darjeeling Express&lt;/a&gt; (Indian).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.hopperslondon.com"&gt;Hoppers&lt;/a&gt; Dosas, Rice, Roast, Kothu &amp;amp; Arrack (Sri Lanka and Tamil Nadu).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://tyuk.com"&gt;Timber Yard&lt;/a&gt; (coffee, working).&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://pizzapilgrims.co.uk/"&gt;Pizza Pilgrims&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://pickyglutton.com/2016/10/14/kiln-review-soho/"&gt;Kiln&lt;/a&gt; (Thai), highly recommended.&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://baolondon.com"&gt;BAO&lt;/a&gt; (Bao buns! enough said).&lt;/p&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="http://said.it/en/london/"&gt;SAID&lt;/a&gt; (italian chocolate shop). Awesome hot chocolate.&lt;/p&gt;
&lt;h2&gt;Southhall&lt;/h2&gt;
&lt;h3&gt;[DONE]{.done .DONE} &lt;a href="http://brilliantrestaurant.com"&gt;Brilliant restaurant&lt;/a&gt; (healthier Indian). &amp;lt;2018-12-27 Thu&amp;gt;&lt;/h3&gt;
&lt;hr /&gt;
&lt;h2&gt;id: brilliant-restaurant-healthier-indian.-2018-12-27-thu&lt;/h2&gt;
&lt;h2&gt;Southbank&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://tonkotsu.co.uk/"&gt;Tonkotsu (ramen)&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;South Kensington&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Hour Glass (Pub restaurant).&lt;/p&gt;
&lt;h2&gt;Smithfield&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://birdofsmithfield.com"&gt;Bird of Smithfield&lt;/a&gt; (Sheppherd's pie, ox cheek, cheesecake).&lt;/p&gt;
&lt;h2&gt;Spitafields&lt;/h2&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://pickyglutton.com/2016/05/02/som-saa-review-spitalfields/"&gt;Som Saa&lt;/a&gt; (Thai), highly recommended. &amp;lt;2018-12-27 Thu&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://lahpet.co.uk/"&gt;Lahpet&lt;/a&gt; (Burmese) &amp;lt;2018-12-02 Sun&amp;gt;&lt;/p&gt;
&lt;h2&gt;Strand&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.strand-continental.co.uk/india-club"&gt;India Club (around for 50 years)&lt;/a&gt; &amp;lt;2019-05-21 Tue&amp;gt;&lt;/p&gt;
&lt;h2&gt;Stoke Newingtom&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.the-haberdashery.com"&gt;The Haberdashery&lt;/a&gt; (coffee, working).&lt;/p&gt;
&lt;h2&gt;Tottenham Court Road.&lt;/h2&gt;
&lt;p&gt;[DONE]{.done .DONE} &lt;a href="https://www.kanada-ya.com/"&gt;Kanada-Ya&lt;/a&gt; (rammen): Not bad.&lt;/p&gt;
&lt;h2&gt;Tower Hill&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.manze.co.uk"&gt;M. Manze&lt;/a&gt; (pie and mash).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.google.co.uk/search?q=maltby+street+market&amp;amp;rlz=1C1FLDB_enGB546GB546&amp;amp;espv=2&amp;amp;biw=1449&amp;amp;bih=913&amp;amp;tbm=isch&amp;amp;tbo=u&amp;amp;source=univ&amp;amp;sa=X&amp;amp;ved=0ahUKEwj1nrGQvYvLAhUF2hoKHeaQDQsQsAQIOg&amp;amp;dpr=1"&gt;Maltby street market&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Tufnell Park&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Monsoon (Indian), try lamb naga.&lt;/p&gt;
&lt;h2&gt;Turnham Green&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Chief Coffee.&lt;/p&gt;
&lt;h2&gt;Victoria&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://dominiqueansellondon.com/"&gt;Dominique Ansel Bakery (Bakery)&lt;/a&gt; &amp;lt;2019-01-22 Tue&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Dominique Ansel Bakery &amp;lt;2018-12-11 Tue&amp;gt;&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://bleeckerburger.co.uk"&gt;Bleeker (burger)&lt;/a&gt; &amp;lt;2019-01-22 Tue&amp;gt;&lt;/p&gt;
&lt;h2&gt;Walthamstow&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://grillstock.co.uk"&gt;Grillstock BBQ&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Waterloo&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://thelaughinggravy.co.uk"&gt;The Laughing Gravy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://zenchina.co.uk"&gt;Zen China&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;West Hamstead&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.timeout.com/london/restaurants/nautilus"&gt;Nautilus&lt;/a&gt; (fish and chips).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/MamacitaNW6/media"&gt;Mamacita&lt;/a&gt; (Mexican).&lt;/p&gt;
&lt;h2&gt;Whitechapel&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Lahore Kebab House, try seekh kebabs with roti.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Sushinoen.&lt;/p&gt;
&lt;h2&gt;Wimbledon&lt;/h2&gt;
&lt;p&gt;[TODO]{.todo .TODO} Dalchini (Indian), try spicy cocunut fish curry.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sun, 08 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/london-food-backlog</guid></item><item><title>Brian Lovin: Host of Design Details</title><link>https://solomon.io/brian-lovin-host-of-design-details/</link><description>Brian Lovin is the host of the Design Details podcast and is a product designer at Buffer. He also runs The Kollection, a music curation blog. Hey everybody.</description><author>Sam Solomon</author><pubDate>Sun, 08 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/brian-lovin-host-of-design-details/</guid></item><item><title>In Defense of the Midwest</title><link>https://ntietz.com/blog/in-defense-of-the-midwest/?utm_source=atom&amp;utm_medium=feed</link><description>&lt;p&gt;As an undergraduate, I always imagined that I would someday move to the SF Bay Area to live in the heart of the software industry. With this in mind, in my final semester at Kent State, I joined a Silicon Valley startup as their third engineer&lt;a href="https://ntietz.com/blog/in-defense-of-the-midwest/#footnote-1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;. The staff at that time was split: one founder and one engineer were in Mountain View, CA; one founder and one engineer were in Ohio; and one engineer was remote. Nearly every month in the first year, I flew out to the Silicon Valley office to work with the engineers out there.&lt;/p&gt;
&lt;p&gt;Since then, we have grown to have a technical staff of about 20 people. We are split pretty evenly between the Silicon Valley office and the Ohio office. I spend most of my time in the Ohio office, but I do commute to the Silicon Valley one occasionally.&lt;/p&gt;
&lt;p&gt;Nearly every time I go out to California, my coworkers ask me the usual question: "so, when are you moving to California?" It seems like for people in the Valley, moving to California is such an obvious choice that it isn't even a question of &lt;em&gt;if&lt;/em&gt; I'll move, but &lt;em&gt;when&lt;/em&gt;. However, I truly love the Midwest and that I want to stay here for as long as I can. It's not for everyone, but it is for me and maybe it is for you.&lt;/p&gt;
&lt;h2 id="it-is-affordable"&gt;It is affordable&lt;/h2&gt;
&lt;p&gt;In San Francisco, the median one-bedroom apartment &lt;a href="http://www.businessinsider.com/san-francisco-neighborhoods-where-one-bedrooms-are-expensive-2014-8"&gt;costs $3,120 / month&lt;/a&gt;. In Kent, Ohio, a &lt;em&gt;really nice&lt;/em&gt; one-bedroom apartment will cost you at most $1000 / month. Salaries are much higher in the Valley than in Ohio, but even a low salary in Ohio can get you a very nice apartment.&lt;/p&gt;
&lt;h2 id="there-is-lots-to-do"&gt;There is lots to do&lt;/h2&gt;
&lt;p&gt;Another argument that's used is that "Ohio is in the middle of nowhere" implying that there is nothing to do here and life is boring, surrounded by cornfields. On the contrary, there is actually a ton to do in Ohio. Here's a tiny sampling of what I like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cleveland gets all the Broadway shows once they go off Broadway, but at about half the cost&lt;/li&gt;
&lt;li&gt;We have great music here, including the world-renowned Cleveland Jazz Orchestra, and tons of bands come through&lt;/li&gt;
&lt;li&gt;We have some great sports teams (hi, OSU) and a ton of great sports fans (hi, Browns fans)&lt;/li&gt;
&lt;li&gt;We have great food at very affordable prices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Actually, I haven't found anything I could do out in the Valley that I could not also do back in Ohio, except maybe get killer sushi.&lt;/p&gt;
&lt;h2 id="midwesterners-are-great-people"&gt;Midwesterners are Great People&lt;/h2&gt;
&lt;p&gt;More than anything else, I love the people in the Midwest. Here's why:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Our people are incredibly polite and caring. Out here, people greet you on the sidewalk even if they don't know you. Neighbors will come help push your car out of the snowbank it got stuck in. Cars will let let you merge when they don't have to.&lt;/li&gt;
&lt;li&gt;Our people are, well, scrappy: even though the Browns continue to lose, year after year, you will find no fans more loyal than the Browns fans&lt;a href="https://ntietz.com/blog/in-defense-of-the-midwest/#footnote-2"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;. This attitude is carried through most things we do: even if you fail over and over, you just keep trying and hoping.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On balance, I haven't found nicer people than in the Midwest.&lt;/p&gt;
&lt;h2 id="the-weather"&gt;The Weather&lt;/h2&gt;
&lt;p&gt;Not many people would claim that Ohio's weather is great, but count me among them. Our winters are fairly harsh and cold, but they make you truly appreciate spring when it comes. All the non-winter seasons are really nice: spring is pleasant and life is blossoming around you; summer is warm and laid-back; and fall is brisk and beautiful, with the leaves all changing colors.&lt;/p&gt;
&lt;h2 id="great-universities"&gt;Great Universities&lt;/h2&gt;
&lt;p&gt;Despite popular opinion, the great universities aren't limited to the two coasts: we have UW-Madison, UIUC, Northwestern, and OSU, to name just a few. (Carnegie Mellon is also nearby, even though it isn't technically in the Midwest.)&lt;/p&gt;
&lt;h2 id="the-pace-of-life"&gt;The Pace of Life&lt;/h2&gt;
&lt;p&gt;On both coasts, the pace of life is really, really high: you just go, go, go and work constantly. If you go to a restaurant or coffee shop, people around you are probably all talking something work related, because people don't slow down very much.&lt;/p&gt;
&lt;p&gt;In the Midwest, though, people take a much more relaxed pace. If you go to a coffee shop, you'll find people talking about real life things, not work. Maybe they're talking about a book they read in their free time!&lt;/p&gt;
&lt;p&gt;This is one of the things I love most about the Midwest - people actually turn off work mode sometimes and go relax. I firmly believe that, even in spite of this, people are not less productive here than in the Valley, because even though we may put in fewer hours, those hours are more energetic and we are more recharged.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The Midwest is a beautiful place filled with beautiful people. Don't write it off just because it isn't the heart of Silicon Valley - there is still a lot of good stuff and good work being done in this part of the country. Come visit, stay for a while.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a id="footnote-1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; My company is in stealth mode and has requested that we not talk about the company publicly at this time. When that changes, I might have more to say about the company. Note: I can talk to individuals one-on-one if anyone is curious.&lt;/p&gt;
&lt;p&gt;&lt;a id="footnote-2"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; We have fans on every continent including &lt;a href="http://www.clevelandbrowns.com/news/article-1/Welcome-Antarctica-Browns-Backers/a0a2e167-7a95-4789-9d48-4ab6a689512a"&gt;Antarctica&lt;/a&gt;.&lt;/p&gt;</description><author>ntietz.com blog - technically a blog</author><pubDate>Sun, 08 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ntietz.com/blog/in-defense-of-the-midwest/?utm_source=atom&amp;utm_medium=feed</guid></item><item><title>Buxton's Rule</title><link>https://captnemo.in/blog/2015/03/08/buxtons-rule/</link><description>&lt;p&gt;I consider myself a UX enthusiast. I consider that term to aptly describe my interest in UX. As I’m deeply involved in many UX and design decisions, I try to be well read on design and UX principles. While reading a discussion about &lt;a href="http://www.cultofmac.com/181782/every-iphone-prototype-apple-ever-made-before-released-the-first-iphone-gallery/" title="Every iPhone Prototype Apple ever made before releasing the first iPhone"&gt;iPhone prototypes&lt;/a&gt; on &lt;a href="https://news.ycombinator.com/item?id=4312460" title="Hacker News Discussion"&gt;HN&lt;/a&gt; in June ‘12, I came across this comment:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Goes to show what it takes to achieve excellence: lots of trial and error. Produce at least 3 alternatives for every design decision (Bill Buxton agrees).&lt;/p&gt;

  &lt;p&gt;— &lt;a href="https://news.ycombinator.com/item?id=4312953"&gt;mstuherl&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It sounded so basic, yet often I see designers trying to defend their first design, because it seems good enough to them. No good design is ever born at the first step. Just like any other process, it takes multiple iterations to perfect it.&lt;/p&gt;

&lt;p&gt;I recently got in touch with Morgan (&lt;a href="https://news.ycombinator.com/user?id=msutherl" title="HN profile"&gt;mstuherl on HN&lt;/a&gt;), and thanked him for his comment. Here’s what he said when I told him I wanted to dub it mstuherl’s rule:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hah! My name’s Morgan, so you can call it Morgan’s Rule if you like, but it comes from Bill, so Buxton’s rule would be more appropriate. His book Sketching User Experience contains yet more wisdom!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So thats what I’m calling it:&lt;/p&gt;

&lt;div&gt;
&lt;center&gt;
&lt;h3&gt;
  BUXTON'S RULE
  &lt;br /&gt;
  Produce at least 3 alternatives for every design decisions.
&lt;/h3&gt;
&lt;/center&gt;
&lt;/div&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.billbuxton.com/iteration.html"&gt;Iteration in the Design of the Human-Computer Interface&lt;/a&gt; - Bill Buxton&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.amazon.com/Sketching-User-Experiences-Interactive-Technologies/dp/0123740371"&gt;Sketching User Experiences&lt;/a&gt; by Bill Buxton&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.sensible.com/dmmt.html"&gt;Don’t Make Me Think&lt;/a&gt; by Steve Krug (My first recommendation to every software dev/designer)&lt;/li&gt;
&lt;/ul&gt;</description><author>Nemo's Home</author><pubDate>Sun, 08 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/03/08/buxtons-rule/</guid></item><item><title>UX bookmarks</title><link>https://xenodium.com/ux-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://99designs.com/designer-blog/2014/01/20/11-kerning-tips/"&gt;10 kerning tips for improving your typography&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nngroup.com/articles/ten-usability-heuristics/"&gt;10 Usability Heuristics for User Interface Design&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://line25.com/inspiration/flat-design-color-palettes"&gt;30 Flat Design Color Palettes That Just Work&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learnui.design/blog/4-rules-intuitive-ux.html"&gt;4 Rules for Intuitive UX&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tympanus.net/Development/AnimatedSVGIcons/"&gt;Animated SVG icons&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/design/tips/"&gt;Apple's UI design Dos and Don'ts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/yuanqinglim/status/1357893783803756544"&gt;Applying white space in UI design: 8 practical tips, with examples.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12711060"&gt;Ask HN: Good books or articles on UI design? (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.behance.net/"&gt;behance (Showcase &amp;amp; Discover Creative Work)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.behance.net/gallery/18006477/California-Magazine"&gt;California magazine&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://capptivate.co"&gt;capptivate.co (features mobile UIs)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lmjabreu.com/post/creating-badass-users/"&gt;Creating badass users&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://deathtothestockphoto.com/stories/"&gt;Death to Stock (stock photos)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.designernews.co/"&gt;Designer News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogs.gnome.org/tbernard/2019/12/30/designing-an-icon-for-your-app/"&gt;Designing an Icon for Your App – Space and Meaning (planet gnome)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.bring.com/blog/ui-tips/"&gt;DIY UI Tips for Backend Developers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://evil-icons.io"&gt;Evil icons&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fontsquirrel.com/"&gt;Font squirrel (free fonts for commercial use)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=27232297"&gt;Freesound just reached 500K Creative Commons sounds | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=13015631"&gt;How to Become a UX Designer (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sketchbook.com/blog/how-to-draw-imagination-using-references/"&gt;How to Draw from Imagination: Beyond References&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=10861521"&gt;Images and Sketch files of popular devices (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://facebook.github.io/design/devices"&gt;Images and Sketch files of popular devices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vimeo.com/137263880"&gt;iOS Typography: Stop Saying “No” to Designers on Vimeo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=24030969"&gt;Laws of UX | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.underconsideration.com/brandnew/archives/logo_modernism.php#.VhRP_HvoVE4"&gt;Logo Modernism (Book)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://makerbook.net/"&gt;Makerbook: A hand-picked directory of the best free resources for creatives&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/google/material-design-icons/releases/tag/1.0.0"&gt;Material Design icons&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mobile-patterns.com/"&gt;mobile-patterns.com (UX mobile patterns)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pttrns.com/"&gt;pttrns.com (mobile UX patterns)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.refactoringui.com/book"&gt;Refactoring UI: The Book&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=20728645"&gt;Rules for Intuitive UX | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uxdesign.cc/selection-controls-ui-component-series-3badc0bdb546"&gt;Selection controls — UI component series | by Taras Bakusevych | UX Collective&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tachyons.io/docs/themes/skins/"&gt;Skins / Themes / Docs / TACHYONS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.swissted.com/"&gt;Swissted (punk rock and Swiss Modernism drawings)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tachyons.io/"&gt;TACHYONS - Css Toolkit (Minimalistic Swiss-inspired)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.typewolf.com/blog/most-popular-fonts-of-2014"&gt;Ten most popular webfonts of 2014&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://inkbotdesign.com/100-best-design-blogs/"&gt;The 100 Best Design Blogs to Follow&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codelitt.com/blog/the-foundations-of-a-good-ui/"&gt;The Foundations of a Good UI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.methodsandtools.com/archive/archive.php?id=126"&gt;The Psycology of UX&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://typographica.org/"&gt;Typographica (type reviews, books, commentary)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12887416"&gt;Unsplash – Beautiful photos free to use under the Unsplash License (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uxplanet.org/"&gt;UX Planet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogs.scientificamerican.com/sa-visual/visualizing-science-illustration-and-beyond"&gt;Visualizing Science: Illustration and Beyond - Scientific American Blog Network&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dribbble.com/"&gt;What are you working on? Dribbble is show and tell for designers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.prototypr.io/why-showing-your-process-is-so-important-1e4129a5f5d2#.7o5bfjwd7"&gt;Why Showing Your Process is So Important!&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 07 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/ux-bookmarks</guid></item><item><title>Recipes</title><link>https://xenodium.com/recipes</link><description>&lt;h2&gt;Jeera rice (cumin rice)&lt;/h2&gt;
&lt;h3&gt;Sizzle spices (40 seconds)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1 tablespoon oil&lt;/li&gt;
&lt;li&gt;1 teaspoon cumin seeds&lt;/li&gt;
&lt;li&gt;4 cloves&lt;/li&gt;
&lt;li&gt;2 black cardamon pods&lt;/li&gt;
&lt;li&gt;1 cinnamon stick&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sautee onion (2 mins or browned/opaque)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1 small yellow onion (chopped)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sautee rice + salt (1 minute)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2 cups of basmati rice&lt;/li&gt;
&lt;li&gt;1.2 teaspoon of salt&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Boil, then partially cover and simmer (8 minutes or water gone)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;4 cups water&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Rest 5 minutes (covered)&lt;/h3&gt;
&lt;h2&gt;Slow-cooked lamb&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Preheat oven: 240°C (no fan) 220°C (fan).&lt;/li&gt;
&lt;li&gt;Lamb face up in tray.&lt;/li&gt;
&lt;li&gt;Cook for 30 mins (or brown).&lt;/li&gt;
&lt;li&gt;Take lamb out.&lt;/li&gt;
&lt;li&gt;Add to tray: broth, onions, rosemary.&lt;/li&gt;
&lt;li&gt;Lamb face down (broth covers 1/3 or 1/4).&lt;/li&gt;
&lt;li&gt;Cover with lid (or baking/parchment paper then 2 layers of foil).&lt;/li&gt;
&lt;li&gt;Bake for 3.5 hours at 180°C (no fan).&lt;/li&gt;
&lt;li&gt;Take out.&lt;/li&gt;
&lt;li&gt;Turn lamb face up (over again). Check if liquid needs top-up.&lt;/li&gt;
&lt;li&gt;Cook for 2 more hours.&lt;/li&gt;
&lt;li&gt;Check if ready. Does meat fall off the bone with fork?&lt;/li&gt;
&lt;li&gt;If not, keep for another 30 mins. Check again.&lt;/li&gt;
&lt;li&gt;You are done ø/.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Tom Kha Gai soup&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Chicken or Prawns&lt;/li&gt;
&lt;li&gt;2 kaffir lime leaves&lt;/li&gt;
&lt;li&gt;1 lemongrass stalk&lt;/li&gt;
&lt;li&gt;1 1/2 cocunut milk&lt;/li&gt;
&lt;li&gt;3/4 sliced fresh galaghal&lt;/li&gt;
&lt;li&gt;1 1/2 chicken stock or water&lt;/li&gt;
&lt;li&gt;1/2 cup mushrooms&lt;/li&gt;
&lt;li&gt;3 1/2 tbsp sugar&lt;/li&gt;
&lt;li&gt;1/2 cup of cilantro&lt;/li&gt;
&lt;li&gt;1-4 thai chillies&lt;/li&gt;
&lt;li&gt;1-2 tbsp chili oil&lt;/li&gt;
&lt;li&gt;1 green onion&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Veg-Fruit juice&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Lime&lt;/li&gt;
&lt;li&gt;Ginger&lt;/li&gt;
&lt;li&gt;Apple&lt;/li&gt;
&lt;li&gt;Chilly&lt;/li&gt;
&lt;li&gt;Celery&lt;/li&gt;
&lt;li&gt;Fig&lt;/li&gt;
&lt;li&gt;Blueberries&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Berry Hempster&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hemp milk&lt;/li&gt;
&lt;li&gt;Hemp protein&lt;/li&gt;
&lt;li&gt;Strawberry&lt;/li&gt;
&lt;li&gt;Blueberry&lt;/li&gt;
&lt;li&gt;Date&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How to cook &lt;a href="https://www.youtube.com/watch?v%3DDaN4ifTG3H0"&gt;Beef Chow Fun&lt;/a&gt;.&lt;/h2&gt;
&lt;h2&gt;&lt;a href="http://www.dailymail.co.uk/home/you/article-2248267/Recipe-Cavolo-nero-anchovies-chilli-garlic.html"&gt;Cavolo nero with anchovies, chilli and garlic&lt;/a&gt;.&lt;/h2&gt;
&lt;h2&gt;Vietnamese Pork Lettuce Wraps (my own versions)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pork Mince.&lt;/li&gt;
&lt;li&gt;Chopped garlic.&lt;/li&gt;
&lt;li&gt;Chopped chillies.&lt;/li&gt;
&lt;li&gt;Chopped ginger.&lt;/li&gt;
&lt;li&gt;4 tablespoons of soy sauce.&lt;/li&gt;
&lt;li&gt;2 tablespoons of apple cider vinegar.&lt;/li&gt;
&lt;li&gt;Sesame oil (for cooking mince).&lt;/li&gt;
&lt;li&gt;Half tablespoon of coconut sugar.&lt;/li&gt;
&lt;li&gt;Lettuces (for wrapping).&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 07 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/recipes</guid></item><item><title>Music backlog</title><link>https://xenodium.com/music-backlog</link><description>&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://zenodo.org/record/4008297"&gt;CatMeows: A Publicly-Available Dataset of Cat Vocalizations | Zenodo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Pay What You Want (bandcamp).&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://twitter.com/cognazor/status/1196464349109530625"&gt;Zontali on Twitter: &amp;quot;Name one of your most emotionally resonant songs, and I …&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://generative.fm/"&gt;Generative.fm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://ivanish.ca/diminished-fifth/"&gt;Diminished Fifth&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://www.archiveofindianmusic.org/"&gt;Archive of Indian music&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Budhaditya Mukherjee.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Debashish Bhattcharya.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Halim Jafar Khan and his Disciples - Sitar Quintet - LP published in India in 1968.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Harjinderpal Singh.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Jayanthi Kumaresh.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v=jMEjPKBvhzE#t=0"&gt;Kayhan Kalhor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="http://youtu.be/qQcKzwSmGy0"&gt;Malaya Chalo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Mehboob Nadeem.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Nirmalya Dey.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://www.youtube.com/watch?v=dPSr3swtLDk"&gt;Zia Mohiuddin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} Music sites&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://3hive.com/"&gt;3hive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://acloserlisten.com/"&gt;A Closer Listen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alfitude.com/"&gt;Alfitude&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://abductionradiation.tumblr.com/"&gt;Abduction Radiation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.weraddicted.com/category/music/"&gt;Addicted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://acidstag.com/category/music/"&gt;Acid Stag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.adhoc.fm/"&gt;ADHOC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.albumoftheyear.org/"&gt;Album of the Year&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americansongwriter.com/news/"&gt;American Songwriter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.anydecentmusic.com/"&gt;Any Decent Music?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aquariumdrunkard.com/"&gt;Aquarium Drunkard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://atwoodmagazine.com/"&gt;Atwood Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.backseatmafia.com/"&gt;Backseat Mafia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.birp.fm/"&gt;Birp!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blackplastic.co.uk/"&gt;Black Plastic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bleep.com/"&gt;Bleep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blindedbythefloodlights.com/"&gt;Blinded by the Floodlights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bloodbuzzed.blogspot.com/"&gt;Bloodbuzzed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://brightonmusicblog.co.uk/"&gt;Brighton Music Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.brooklynvegan.com/"&gt;Brooklyn Vegan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://boaws.org/"&gt;Built on a Weak Spot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buzzbands.la/"&gt;buzzbands.la&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cerealandsounds.com/"&gt;Cereal and Sounds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chillhop.com/blog/"&gt;Chillhop Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://classicsdujour.com/"&gt;Classics Dujour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.classicrockhistory.com/"&gt;Classic Rock History&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloutcloutclout.com/"&gt;Clout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clunkmag.com/?v=7516fd43adaa"&gt;Clunk Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://consequenceofsound.net/category/new-music/"&gt;Consequence of Sound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.coolmusicandthings.co.uk/"&gt;Cool Music and Things&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crackmagazine.net/"&gt;Crack Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.curiousformusic.com/"&gt;Curious for Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://darrensmusicblog.com/category/rock-music/"&gt;Darren’s Music Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pastemagazine.com/daytrotter"&gt;Daytrotter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.desertislandcloud.com/"&gt;Desert Island Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitaltourbus.com/"&gt;Digital Tour Bus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://diffuser.fm/"&gt;Diffuser.fm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://disconaivete.com/"&gt;Disco Naivete’&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.discovernu.co/"&gt;DiscoverNu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discoverymusicscotland.com/"&gt;Discovery Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dinkededition.co.uk/"&gt;Dinked&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://readdork.com/"&gt;Dork&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dragcity.com/"&gt;Drag City&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.drivenfaroff.com/category/videos/"&gt;Driven Far Off&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dmy.co/new-music"&gt;Dummy Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://earmilk.com/"&gt;Earmilk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.eartothegroundmusic.co/"&gt;Ear to the Ground Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eclecticmusiclover.com/"&gt;Eclectic Music Lover&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.elicitmagazine.com/"&gt;Elicit Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://exclaim.ca/music"&gt;Exclaim!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.exposedmagazine.co.uk/category/music/"&gt;Exposed Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.famemagazine.co.uk/"&gt;Fame Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.factmag.com/"&gt;Fact Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fashionably-early.com/"&gt;Fashionably Early&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wunc.org/live-updates/north-carolina-local-music-blog-burns-wunc"&gt;First in Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fluxblog.org/"&gt;Fluxblog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortheloveofbands.com/"&gt;For the Love of Bands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortherabbits.net/"&gt;For the Rabbits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fromthestrait.com/"&gt;From the Strait&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fvmusicblog.com/blog/"&gt;FV Music Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gasmaskmagazine.com/"&gt;Gas Mask Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://giggoer.com/"&gt;Gig Goer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.goldflakepaint.co.uk/posts/"&gt;GoldFlakePaint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.goldenplec.com/"&gt;GoldenPlec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.goldminemag.com/"&gt;Goldmine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gorillavsbear.net/"&gt;Gorilla Vs. Bear&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.godisinthetvzine.co.uk/category/new-music/"&gt;God is in the TV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.grimygoods.com/new-music-2/"&gt;Grimy Goods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hardofhearingmusic.com/"&gt;Hard of Hearing Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hardlyart.com/"&gt;Hardly Art&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hearingthings.co/"&gt;Hearing Things!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://highclouds.org/"&gt;High Clouds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hypem.com/site/highclouds/23232"&gt;Hype Machine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hi54.blog/"&gt;High Five For…&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hotpress.com/music"&gt;Hot Press&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hypem.com/latest"&gt;Hype Machine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hypem.com/list"&gt;hundreds of music sites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hypem.com/"&gt;latest posts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iheartmoosiq.tumblr.com/"&gt;I Herat Moosiq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://imposemagazine.com/"&gt;Impose Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.intunemusic.co.uk/"&gt;In Tune&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://independentmusic.reviews/"&gt;Independent Music Reviews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://indie-tapes.com/"&gt;Indie-Tapes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://indie88.com/"&gt;Indie88&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://indie30.com/"&gt;Indie30&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/channel/UCVoraDictyd89xgZt-J2Frw"&gt;Indie Air&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://indieartistgo.com/category/indie-music/indie-music-interviews/"&gt;Indie Artist Go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.indiecentralmusic.com/"&gt;Indie Central Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.indieisnotagenre.com/"&gt;Indie is not a Genre&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://indiemusicfilter.com/"&gt;Indie Music Filter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://indieobsessive.blogspot.com/"&gt;Indie Obsessive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://indiepulsemusic.com/"&gt;Indie Pulse Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://indierockcafe.com/"&gt;Indie Rock Cafe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://indieunderground.ca/"&gt;Indie Underground&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.indiemuck.com/"&gt;Indiemuck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://indietronica.org/"&gt;Indietronica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://infinitevolumemag.com/"&gt;Infinite Volume Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.isthismusic.com/"&gt;Is This Music?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.itsallindie.com/"&gt;It’s All Indie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.itsindie.co.uk/music"&gt;It’s Indie and We Know it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.iq-mag.net/"&gt;IQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.juno.co.uk/junodaily/category/music-news/"&gt;Juno&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kaput-mag.com/en/"&gt;Kaput Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://keepwalkingmusic.com/"&gt;Keep Walking Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/SEBenAli"&gt;S. Ben Ali&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://larecord.com/"&gt;LA Record&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.largeheartedboy.com/"&gt;Largehearted Boy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lefuturewave.com/"&gt;Lefuturewave&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://littleindieblogs.blogspot.com/"&gt;Little Indie Blogs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lucymccourt.com/"&gt;Lucy McCourt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://madmackerel.org/"&gt;Mad Mackeral&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://melmagazine.com/entertainment/music"&gt;MEL Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mixitallup.com/"&gt;Mix it all Up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/user/MORindie"&gt;MORIndie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.myoldkentuckyblog.com/"&gt;My Old Kentucky Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://musicassent.com/"&gt;Music Assent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://musicauthentic.com/"&gt;Music Authentic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.musicbloggersnetwork.com/"&gt;Music Bloggers Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.musiccrowns.org/"&gt;Music Crowns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://musicforthemisfits.com/"&gt;Music for Misfits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://musicindustryblog.wordpress.com/"&gt;Music Industry Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://musicmachinery.com/"&gt;Music Machinery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://musicmattersgb.com/"&gt;Music Matters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://musicreviewworld.com/"&gt;Music Review World&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.musicsavage.com/"&gt;Music Savage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.musikblog.de/"&gt;Musikblog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.neonfiller.com/wordpress/"&gt;Neon Filler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.neonfiller.com/wordpress/?cat=268"&gt;Top 100 Indie and Alternative Albums list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://neonmusic.co.uk/"&gt;Neon Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://newsoundgeneration.co.uk/"&gt;New Sound Generation UK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://newsoundsmag.co.uk/"&gt;New Sounds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nitestylez.de/"&gt;NiteStylez&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://noctismag.com/"&gt;Noctis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://noiseartists.net/"&gt;Noise Artists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notion.online/"&gt;Notion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nowthenmagazine.com/music"&gt;Now Then Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nme.com/news/music"&gt;NME&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nodepression.com/"&gt;No Depression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/search?q=%23RootsMusic&amp;amp;src=hashtag_click"&gt;#RootsMusic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nordicmusicreview.com/"&gt;Nordic Music Review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nyctaper.com/"&gt;NYCTaper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.obliviouspop.com/"&gt;Oblivious Pop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thegoldentiki.com/"&gt;Golden Tiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.obscuresound.com/"&gt;Obscure Sound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ohmyrockness.com/"&gt;Oh My Rockness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.onegreatsong.co.uk/"&gt;One Great Song&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.1songday.com/"&gt;One Song a Day&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://onestoprecordshop.co.uk/"&gt;One Stop Record Shop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://onequartmagazine.com/music/"&gt;One Quart Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://overblown.co.uk/"&gt;Overblown UK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ovrld.com/"&gt;Ovrld&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pastelwasteland.com/"&gt;Pastel Wasteland&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pilerats.com/music/bands/"&gt;Pilerats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pinkwafer.club/"&gt;Pink Wafer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pitchfork.com/"&gt;Pitchfork&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://plasticmag.co.uk/"&gt;Plastic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pleasepasstheindie.com/"&gt;Please Pass the Indie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://poppedmusic.co.uk/"&gt;Popped Music UK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://prtlsmusic.com/"&gt;Portals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://post-trash.com/"&gt;Post-Trash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://purplemelonmu.com/"&gt;Purple Melon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ravensingstheblues.com/"&gt;Raven Sings the Blues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.recordoftheday.com/track-archive"&gt;Record of the Day&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/indiemusic/"&gt;Reddit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wearerhythmsection.com/"&gt;Rhythm Section&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rightchordmusic.co.uk/"&gt;Right Cord Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rockthepigeon.com/"&gt;Rock the Pigeon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.padraigs.com/"&gt;Padraigs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.scenepointblank.com/"&gt;Scene Point Blank&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://schonmagazine.com/"&gt;Schon!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sos-music.co.uk/"&gt;Scientists of Sound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.scottishmusicnetwork.co.uk/"&gt;Scottish Music Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shebops.net/"&gt;She Bops&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.shindig-magazine.com/"&gt;Shindig!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shoegazeblog.com/"&gt;Shoegaze Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sidekick-music.com/music-news/"&gt;Sidekick Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sinusoidalmusic.com/"&gt;Sinusoidal Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sodwee.com/blog/"&gt;Sodwee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://soyoungmagazine.com/journal/"&gt;So Young Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.somekindofawesome.com/"&gt;Some Kind of Wonderful&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.souldoubtmag.com/"&gt;Sould Doubt Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sgtmt.tumblr.com/"&gt;Sound Good to Me Too&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.spin.com/"&gt;SPIN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spinditty.com/artists-bands/"&gt;Spinditty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.stampthewax.com/"&gt;Stamp The Wax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://staticdive.com/"&gt;Static Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stepkid.com/"&gt;Stepkid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.stereofox.com/"&gt;Stereofox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.stereogum.com/music/"&gt;Stereogum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stereostickman.com/"&gt;Stereo Stickman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.stillinrock.com/"&gt;Still in Rock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://swelltonemusic.com/"&gt;Swell Tone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swimintothesound.com/"&gt;Swim into the Sound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://syncmusicblog.com/"&gt;Sync.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tenementtv.com/"&gt;Tenement TV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://testpressing.org/"&gt;Test Pressing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thatgrapejuice.net/"&gt;That Grape Juice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.getalternative.com/category/music/"&gt;The Alternative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thebopscollective.com/"&gt;The Bops Collective&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thebluewalrus.com/"&gt;The Blue Walrus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.theburningear.com/"&gt;The Burning Ear&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thedailylistening.com/"&gt;The Daily Listening&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thedailymusicreport.com/best-new-music/"&gt;The Daily Music Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thefader.com/"&gt;Fader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thegreyestates.com/"&gt;The Grey Estates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thehoneypop.com/"&gt;The HoneyPop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theindiegrid.co.uk/"&gt;The Indie Grid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theindiescene.co.uk/"&gt;The Indie Scene&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://theindiesound.com/"&gt;The Indie Sound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thelastmixedtape.com/"&gt;The Last Mixed Tape&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thelineofbestfit.com/"&gt;The Line of Best Fit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thelunacollective.co/"&gt;The Luna Collective&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://themusic.com.au/"&gt;The Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://the-music-files.com/single-album-reviews/"&gt;The Music Files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.themusicmanual.co.uk/"&gt;The Music Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.themusicmermaid.com/"&gt;The Music Mermaid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.themusicninja.com/"&gt;The Music Ninja&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thenewlofi.com/"&gt;The New LoFi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theothersidereviews.com/"&gt;The Other Side Reviews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theplayground.co.uk/"&gt;The Playground&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thepitldn.com/guestmixes"&gt;The Pit London&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thepointofeverything.com/"&gt;The Point of Everything&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thequietus.com/"&gt;The Quietus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thereviewsarein.com/"&gt;The Reviews are in&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://therevue.ca/category/music/"&gt;The Revue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thescenestar.typepad.com/"&gt;The Scenestar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thesonicmosquitosoup.wordpress.com/"&gt;The Sonic Mosquito Soup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theskinny.co.uk/music"&gt;The Skinny&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thesoundsniffer.com/"&gt;The Sound Sniffer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://staticdive.com/"&gt;The Static Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thethinair.net/"&gt;The Thin Air&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thewaster.com/"&gt;The Waster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thewonderwhy.wixsite.com/website"&gt;The WonderWhy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thezineuk.co.uk/music/"&gt;The Zine UK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thissongissick.com/"&gt;This Song is Sick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://threeimaginarygirls.com/record_review/"&gt;Three Imaginary Girls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tinymixtapes.com/"&gt;Tiny Mix Tapes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tonedefsound.com/"&gt;Tone Def Sound&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.topshelfrecords.com/words"&gt;Top Shelf Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.turntablekitchen.com/music/"&gt;Turntable Kitchen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://turtletempo.co.uk/"&gt;Turtle Tempo UK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twostorymelody.com/"&gt;Two Story Melody&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.upsetmagazine.com/"&gt;Upset Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://upstreamindie.com/"&gt;Upstream Indie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.undertheradarmag.com/"&gt;Under the Radar Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.uraniumwaves.com/"&gt;Uranium Waves&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://varioussmallflames.co.uk/"&gt;Various Small Flames&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vulture.com/music/"&gt;Vulture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://weallwantsomeone.org/"&gt;We all want someone to shout for&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wepluggoodmusic.com/"&gt;We Plug Good Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wewriteaboutmusic.com/"&gt;We Write About Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whenthehornblows.com/"&gt;When the Horn Blows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wherethemusicmeets.com/"&gt;Where the Music Meets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wolfinasuit.com/"&gt;Wolf in a Suit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wordsformusic.blog/"&gt;Words for Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xsnoize.com/"&gt;ZS Noize&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xunemag.com/"&gt;Xune Mag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xlr8r.com/"&gt;XLR8R&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yourromanfeatures.tumblr.com/"&gt;Your Roman Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.attackmagazine.com/"&gt;Attack Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.audiodrums.com/"&gt;Audiodrums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://boilerroom.tv/"&gt;BoilerRoomTV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://daily-beat.com/"&gt;Daily Beat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dancemusicnw.com/"&gt;Dance Music NW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datatransmission.co/"&gt;Data Transmission&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.deephouseamsterdam.com/"&gt;Deep House Amsterdam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.djgym.co.uk/blog"&gt;DJ Gym&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://djmag.com/"&gt;DJ Mag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://edm.com/"&gt;EDM.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.edmsauce.com/"&gt;EDM Sauce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.edmtunes.com/"&gt;EDMTunes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://edmidentity.com/"&gt;EDM Identity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ekm.co/"&gt;EKM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.electrojams.com/"&gt;Electro Jams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.electrowow.net/"&gt;ElectroWow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.electronicbeats.net/"&gt;Electronic Beats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.emeraldcityedm.com/"&gt;Emerald City EDM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fazemag.de/"&gt;FAZEmag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://beastbarbecue.com/"&gt;of the Beast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dummymag.com/"&gt;Dummy Mag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hammarica.com/category/dj-interviews/"&gt;Hammarica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://inverted-audio.com/"&gt;Inverted Audio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lifesupportmachine.co.uk/"&gt;Life Support Machine UK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.magneticmag.com/"&gt;Magnetic Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://minimalfreaks.co/"&gt;Minimal Freaks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mixing.dj/"&gt;Mixing-DJ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mixmag.net/"&gt;MixMag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pilerats.com/music/electronic/"&gt;Pilerats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plasticmag.co.uk/category/features/"&gt;Plastic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.purplesneakers.com.au/"&gt;Purple Sneakers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raveculture.com/"&gt;Rave Culture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://raverrafting.com/"&gt;Raver Rafting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ra.co/"&gt;Resident Advisor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/electronicmusic/"&gt;r/electronicmusic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.robotdancemusic.com/"&gt;Robot Dance Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://runthetrap.com/"&gt;Run the Trap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.smashtheclub.com/"&gt;Smash the Club&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stoneyroads.com/"&gt;Stoney Roads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.synthtopia.com/"&gt;Synthtopia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thatdrop.com/"&gt;That Drop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theuntz.com/"&gt;The Untz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thissongissick.com/"&gt;this song is sick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thissongslaps.com/"&gt;this song slaps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.traxsource.com/"&gt;Traxsource&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tropicalbass.com/"&gt;Tropical Bass&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://weraveyou.com/"&gt;We Rave You&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whenwedip.com/"&gt;When We Dip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://2dopeboyz.com/"&gt;2DopeBoyz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://24hip-hop.com/category/new-music/"&gt;24Hip-Hop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://albumtalks.com/"&gt;Album Talks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ballerstatus.com/music/"&gt;BallerStatus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://beatroutemedia.com/"&gt;BeatRoute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://beats-rhymes-lists.com/"&gt;Beats, Rhymes and Lists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bignoiseradio.com/"&gt;BigNoiseRadio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bignoiseradio.com/radio"&gt;Radio Stations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bignoiseradio.com/gallery"&gt;Five Elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blackouthiphop.com/"&gt;BlackoutHipHop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://centralsauce.com/"&gt;Central Sauce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.complex.com/pigeons-and-planes/"&gt;Complex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rmc.library.cornell.edu/hiphop/digital_collections.php"&gt;Cornell Hip Hop Collection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.datpiff.com/"&gt;Datpiff&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.desihiphop.com/"&gt;DesiHipHop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://djbooth.net/"&gt;DJ Booth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dummymag.com/genre/rap/"&gt;Dummy Mag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://earmilk.com/category/hiphop/"&gt;Earmilk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fakeshoredrive.com/"&gt;FakeShoreDrive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://genius.com/"&gt;Genius&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grungecake.com/"&gt;Grungecake&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hiphopallaround.com/"&gt;Hip Hop All Around&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hiphopdx.com/news"&gt;HipHopDX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hiphop-n-more.com/"&gt;HipHopnMore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hiphopondeck.com/"&gt;HipHopOnDeck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hiphoppush.com/"&gt;HipHopPush&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hiphopsince1987.com/"&gt;HipHopSince87&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hip-hopvibe.com/"&gt;Hip-HopVibe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hiphopwired.com/"&gt;HipHopWired&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hot97.com/"&gt;Hot97&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hotnewhiphop.com/"&gt;HotNewHipHop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hypebeast.com/"&gt;HypeBeast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thehypemagazine.com/"&gt;HypeMagazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.indiehiphop.net/"&gt;IndieHipHop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.laonlock.com/"&gt;LA on Lock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mrcnnlive.com/category/video/"&gt;MRCNNLIVE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okayplayer.com/"&gt;OkayPlayer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://onsmash.com/"&gt;OnSmash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pilerats.com/music/rap/"&gt;Pilerats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rap-up.com/"&gt;Rap-Up.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rapradar.com/"&gt;RapRadar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rapreviews.com/"&gt;RapReviews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raptology.com/"&gt;Raptology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rapzilla.com/"&gt;Rapzilla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/hiphopheads/"&gt;reddit/r/hiphopheads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.respectmyregion.com/category/music/hip-hop/"&gt;RespectMyRegion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://resultsandnohype.com/"&gt;ResultsandNoHype&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://royalbey.com/"&gt;Royal Bey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.siccness.net/wp/"&gt;Siccness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sohh.com/"&gt;SOHH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.stardom101mag.net/"&gt;Stardom101Mag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://theboombox.com/category/hip-hop-news/"&gt;The BoomBox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thepitldn.com/music"&gt;The Pit London&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thesource.com/"&gt;TheSource&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thizzler.com/"&gt;Thizzler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://undergroundhiphopblog.com/"&gt;UndergoundHipHopBlog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://undergroundunderdogs.com/"&gt;Underground Underdogs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uproxx.com/music/"&gt;UPROXX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://urbanvault.co.uk/category/u-s-music-news/"&gt;Urban Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thewordisbond.com/"&gt;WordisBond&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://worldstarhiphop.com/videos/"&gt;WorldStarHipHop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xxlmag.com/linkinbio/"&gt;XXL Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://1063atl.com/"&gt;106.3 Radio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bettermustcome.blogspot.com/"&gt;Better Must Come&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.blazinreggaevibes.com/%5C"&gt;Blazin Reggae Vibes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.canadianreggaeworld.com/blog"&gt;Canadian Reggae World&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.caribbeandanceradio.com/news"&gt;Caribbean Dance Radio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dancecrasher.co.uk/"&gt;Dancecrasher UK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dancehallmag.com/"&gt;Dancehall Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digestivoreggae.com/"&gt;Digestivo Reggae&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dubvendor.co.uk/"&gt;Dub Vendor UK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jamaicans.com/jamaica/jamaican-music/"&gt;Jamaicans.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jumpuprecords.com/"&gt;Jump Up Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reggaearoundtheworld.wordpress.com/"&gt;Reggae Around the World&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reggaefestivalguide.com/"&gt;Reggae Festival Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reggaefraternityuk.com/"&gt;Reggae Fraternity UK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://reggaenation.com/"&gt;ReggaeNation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reggaemani.wordpress.com/"&gt;ReggaeMani&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reggaeshowtimeradio.com/"&gt;Reggae Showtime Radio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reggae-steady-ska.com/"&gt;Reggae Steady Ska&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reggaereport.com/"&gt;Reggae Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reggaeunite.blogspot.com/"&gt;Reggae Unite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reggaevibe.org/"&gt;ReggaeVibe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reggaeville.com/"&gt;Reggaeville&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://riddimsworld.com/"&gt;Riddims World&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rootsreggaehub.com/"&gt;Roots Reggae Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thepier.org/"&gt;The Pier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.torontoreggae.ca/"&gt;Toronto Reggae&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://trojanrecords.com/playlists/"&gt;Trojan Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://unitedreggae.com/"&gt;United Reggae&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://urbanislandz.com/"&gt;Urban Islandz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vprecords.com/artists/"&gt;VP Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.worldareggae.com/"&gt;World A Reggae&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://yardhype.com/"&gt;YardHype&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://americana-uk.com/"&gt;Americana UK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bluesandrootsradio.com/"&gt;Blues &amp;amp; Roots Radio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nashvillegab.com/"&gt;Nashville Gab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rockingmagpie.wordpress.com/"&gt;Rocking Magpie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tasteofcountry.com/"&gt;Taste of Country&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twangville.com/"&gt;Twangville&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.midwesternhousewives.com/"&gt;Battle of the Midwestern Housewives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://freeskafoundation.blogspot.com/"&gt;Free Ska Foundation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duffguidetoska.blogspot.com/"&gt;The Duff Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rudeboytrain.com/"&gt;Rude Boy Train&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://skabook.com/blog/"&gt;Skabook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://beatroutemedia.com/category/music/"&gt;Beatroute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://muumuse.com/"&gt;MuuMuse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.folkradio.co.uk/"&gt;Folk Radio UK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.loudersound.com/classic-rock"&gt;Classic Rock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.eonmusic.co.uk/"&gt;eon music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lambgoat.com/"&gt;Lambgoat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mojo4music.com/"&gt;MOJO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rockandrollgarage.com/"&gt;Rock And Roll Garage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.talkhouse.com/"&gt;Talkhouse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ultimateclassicrock.com/"&gt;Ultimate Classic Rock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.disposable-america.com/"&gt;Disposable America&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.exitstencil.org/"&gt;Exit Stencil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.explodinginsoundrecords.com/"&gt;Exploding in Sound Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lauren-records.com/"&gt;Lauren Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ghostly.com/"&gt;Ghostly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://longwellrecords.com/blogs/news"&gt;Longwell Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.matadorrecords.com/"&gt;Matador Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mergerecords.com/"&gt;Merge Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.polyvinylrecords.com/"&gt;Polyvinyl Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.postpresentmedium.com/releases.html"&gt;Post Present Medium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.remotecontrolrecords.com.au/"&gt;Remote Control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.slumberlandrecords.com/"&gt;Slumberland Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.subpop.com/"&gt;Sub Pop Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://westernvinyl.com/news/"&gt;Western Vinyl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://player.fm/podcasts/vinyl"&gt;Best Vinyl Podcasts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dice.fm/blog"&gt;Dice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.villagevoice.com/culture/music/"&gt;Village Voice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.loudersound.com/"&gt;Louder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.newreleasesnow.com/"&gt;New Releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.radiok.org/features/weekly-release-spotlight/"&gt;Radio K&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rootsmusicreport.com/"&gt;Roots Music Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theunsignedguide.com/news"&gt;The Unsigned Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://topshelfmusicmag.com/"&gt;Top Shelf Music Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twostorymelody.com/music-promotion-tips/"&gt;Two Story Melody&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vinylmeplease.com/"&gt;Vinyl Me Please&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.palmersbar.net/"&gt;Palmer’s Bar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dittomusic.com/en/blog"&gt;Ditto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rightchordmusic.co.uk/"&gt;Rightcord Music UK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ispytunes.com/blog-made-for-musicians"&gt;ISpyTunes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tellingbeatzz.com/blog-2/"&gt;TellingBeatzz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 07 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/music-backlog</guid></item><item><title>Sam Altman on Machine Intelligence</title><link>https://nicolaiarocci.com/sam-altman-on-machine-intelligence/</link><description>&lt;p&gt;Sam Altman has a great short series on the development of superhuman machine intelligence (SMI). &lt;a href="http://blog.samaltman.com/machine-intelligence-part-1"&gt;Machine intelligence, Part 1&lt;/a&gt; is on why machine intelligence is something that we should be afraid of while &lt;a href="http://blog.samaltman.com/machine-intelligence-part-2"&gt;Part 2&lt;/a&gt; is on what we should do about it. And then there’s &lt;a href="http://blog.samaltman.com/technology-predictions"&gt;Technology predictions&lt;/a&gt;, the perfect closer.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Sat, 07 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/sam-altman-on-machine-intelligence/</guid></item><item><title>Finding Communities of Collaborators in Paul Graham's Essays</title><link>https://faingezicht.com/projects/2015/03/07/pg/</link><description>In the world of startups, few people have a presence as strong as Paul Graham's. An avid computer scientist &lt;a href="http://www.ycombinator.com"&gt;turned venture capitalist&lt;/a&gt;, pg (as he is known on the news aggregator Hacker News) is also famous for his thoughtful essays, which he publishes on a regular basis on &lt;a href="http://www.paulgraham.com"&gt;http://www.paulgraham.com&lt;/a&gt;, and which spawn a wide range of topics.

Almost every single article ever posted by Graham ends with a thank you note to those who discussed the topic with him, read his drafts, or somehow influenced him to write about the subject. Individually, these are just polite acknowledgements, but in aggregate, they offer a window into Graham’s personal network. The underlying assumption I will make here is that when Paul asks two people to read or review a draft of one of his essays, there is an implied relationship between the two collaborators' expertise, and this should be somehow encoded in the data.

In this post I will try to analyze this system, and in the process explain how one can infer community groupings from the link structure in such a &lt;a href="http://en.wikipedia.org/wiki/Collaboration_graph"&gt;collaboration network&lt;/a&gt;.

(TL;DR, &lt;a href="https://cdn.faingezicht.com/pg-essays/pg.svg"&gt;here is the full image&lt;/a&gt; )

### Getting the data
To start the analysis, I wrote a quick &lt;a href="https://github.com/avyfain/pg-essays"&gt;python script&lt;/a&gt; that scrapes all the articles posted on the site, searched for strings starting with "Thanks to " and extracted the names that followed. This quick heuristic outputs a &lt;a href="https://github.com/avyfain/pg-essays/blob/master/essays.csv"&gt;csv file&lt;/a&gt; where each row represents an essay, including its title and the group of collaborators listed. Naturally, the scraper made mistakes. Since Graham's writing doesn’t always follow the exact same format, some manual clean up was required, too. For example, names and nicknames had to be joined by hand (i.e., I had to tell the program that Mike and Michael Arrington are indeed the same guy).

Armed with &lt;a href="https://github.com/avyfain/pg-essays/blob/master/clean_essays.csv"&gt;clean data&lt;/a&gt;, we can continue to the fun stuff. I will do my best to limit the math and the code, and show the concepts behind the algorithms instead.

### Lets build pg's network.
We will start by building a network of essays and collaborators, and then use that network to produce what we are really looking for: a network that links collaborators to each other based on which essays they are co-listed in. The final goal is to find which of pg's collaborators tend to help him in similar essays, inferring "communities" of collaborators.

Generally, networks are expressed as tables, or adjacency matrices, where rows and columns represent nodes. For the uninitiated: the words &lt;em&gt;graph&lt;/em&gt; and &lt;em&gt;network&lt;/em&gt; are used interchangeably to describe the system as a whole, while &lt;em&gt;links&lt;/em&gt; and &lt;em&gt;edges&lt;/em&gt; refer to connections between the nodes.

To build the network, I created a node for each row in the essays data set, and as I iterated over the essays I added nodes and links for the contributors that correspond to each one.

In pseudo-code, this means that:

```text
For Essay in Essays:
    Add Essay to the Network
    For Person in Essay.Contributors:
        Unless Person already in Network:
            Add Person to the Network
        Add link(from: Person, to: Essay) to the Network
```

And that’s it! Now the network links all of the essays to their contributors, but there is one more step, since we want to link contributors to each other. Here is where the dual nature of the network kicks in to help.

### Bipartite matrices and projections
By definition, the network we are studying is an unweighted, undirected &lt;a href="http://en.wikipedia.org/wiki/Bipartite_graph"&gt;bipartite graph&lt;/a&gt;; nodes are either essays or people. A bipartite network is a graph whose nodes can be grouped into two disjoint sets. In this case, essays, which only link to people, and people which only link to essays.

We will exploit a property of this kind of graph that allows us to easily relate pairs of collaborators through the essays they have in common, by *projecting* the network onto the set of collaborators. This can be explained with some fancy math, but basically we count the number of times a pair of collaborators appear together, and we produce a new matrix that bakes this information into the importance of its links.

### Ok, done with the math. Back to pg.
Using a python library called &lt;a href="https://networkx.github.io/"&gt;Networkx&lt;/a&gt; we can quickly compute pg's W matrix, which we then can plug into &lt;a href="http://www.gephi.github.io"&gt;Gephi&lt;/a&gt;, and run its layout algorithm to get this:

![structure](https://cdn.faingezicht.com/pg-essays/structure.png)

We're getting there, but the picture we have so far is not very useful, and the network structure is not telling us anything yet.

### Well, a bit more math...
Remember that the end goal was to find subsets of people who help Paul with his essays before they are published, grouping them by which essays they appear in. We'll need some math to get these groups sorted out.

To accomplish this, we will try to assign groups in such a way that we maximize the graph's &lt;a href="http://en.wikipedia.org/wiki/Modularity_%28networks%29"&gt;modularity&lt;/a&gt;. I won't explain the metric in detail, but basically it amounts to how interconnected the members of each group are to each other. A high modularity shows that there are significantly more links between individuals of the same groups than when compared to a scenario where a node’s links are placed randomly across the network.

Gephi maximizes modularity for us at the press of a button, using a &lt;a href="http://arxiv.org/pdf/0803.0476.pdf"&gt;complicated formula&lt;/a&gt;. I don't find this too intuitive, so I'll show a different way of solving this problem through a randomized process, even if it is not as efficient.

We start at time &lt;em&gt;t=0&lt;/em&gt; with each node assigned to its own group, and compute the current modularity &lt;em&gt;Q&lt;sub&gt;0&lt;/sub&gt;&lt;/em&gt;. We randomly select a node &lt;em&gt;N&lt;/em&gt;, and we randomly update its group. We calculate modularity again, and if &lt;em&gt;Q&lt;sub&gt;1&lt;/sub&gt; &gt; Q&lt;sub&gt;0&lt;/sub&gt;&lt;/em&gt;, we permanently set N's group to its new value. Otherwise, we maintain the previous groupings. This process is repeated a predetermined number of times T, eventually maximizing the value of &lt;em&gt;Q&lt;/em&gt;.

In pseudo-code, this is basically:

```text
Assign each node to its own group
Compute modularity Q_0
Select number of timesteps T
For t in T:
    Select random node N
    Select random group G
    Assign N to G
    Compute modularity Q_t
    If Q_t-1 &gt; Q_t:
        Reset N's group to its previous group
```

We let the algorithm run for a while, and we get groups! Since this algorithm is in the family of &lt;a href="http://en.wikipedia.org/wiki/Hill_climbing"&gt;hill climbing&lt;/a&gt; heuristics, the clusters we find are not necessarily optimal, but only an approximation. Even the final number of groups is random, and can change on each run of the algorithm, but for our purposes this is good enough.

### The Graph
To better understand the graph, we will give each group its own color. Furthermore, we will resize each node in relation to how many other nodes its connected to, a metric known as degree centrality. On this run, I ended up with 4 groups. When running clustering algorithms, it is always hard to tell what each group represents, but here are my guesses:

#### Red: Investors
With plenty of Y Combinator partners, plus Fred Wilson, Marc Andreesen, Ben Horowitz, Chris Dixon, Mike Moritz, among others, this one seems to be pretty clear.
![vc](https://cdn.faingezicht.com/pg-essays/VC.png)

#### Teal: Startup Founders
This one is a little bit trickier. Joe Gebbia, Kevin Hale, John Collison, Jason Freedman, etc. Most people in this cluster are founders of YC startups, but some of them have transitioned and now are part of YC as well. Somehow, Geoff Ralston and Ron Conway trickled in here, but they are clearly closer to the red group.
![founders](https://cdn.faingezicht.com/pg-essays/founders.png)

#### Purple: Early Collaborators/CS Academics
The content of pg's essays have changed over time, and the purple cluster seems to be picking up on his early collaborators: Jessica Livingston, Robert Morris, Trevor Blackwell, and Dan Giffin have been reading Paul's essays all along, and that brings them together in this group. Even his dad is included! Nevertheless, with people like Guido van Rossum, Matz, Steven Wolfram, Peter Norvig, and "several anonymous CS professors," this group definitely has a strong computer science flavor. 
![early](https://cdn.faingezicht.com/pg-essays/early.png)

#### Green: The blip
And here, the experiment breaks down. Most people in this group have not really helped pg in many of his essays, and they are not very well connected to others in the graph. Maybe if we ran the modularity algorithm again this group would not be present, and its nodes absorbed by other.
![random](https://cdn.faingezicht.com/pg-essays/random.png)

### Update: removing nodes that appear once 
After posting my article, and tweeting about it, I got an email from pg saying that at a glance the groupings were ~70% right. Not bad for an unsupervised algorithm! He suggested that I should remove anyone who has only collaborated with him once, and this is the graph that popped out when I did that:

&lt;a href="https://cdn.faingezicht.com/pg-essays/redux.png"&gt;![redux&lt;/a&gt;](https://cdn.faingezicht.com/pg-essays/redux.svg)
&lt;small&gt;&lt;a href="https://cdn.faingezicht.com/pg-essays/redux.svg"&gt;Click for larger size&lt;/a&gt;&lt;/small&gt;

The fact that there are so few data points makes the modularity algorithm too conservative. In my opinion, this a more robust but less interesting visualization.

### Conclusion
Networks are cool. By using this simple modeling tool, we got to pick up a lot of latent information, and by making simple additions we could improve our understanding even more. For example, we could produce the same analysis focusing on topic modeling for the essays, based on this clustering technique but projecting in the opposite dimension.

Alternatively, we could also model the network dynamically, visualizing the network at each time step and seeing it evolve over time. This would allow us to see how the subjects pg focuses on change over time, from computer science and philosophy to business and startups.

As it stands, this analysis is mostly a curiosity, but Paul's close relationship with his wife, Jessica, his protegé, Sam Altman, and his close business partners were all easily inferred with the degree centrality approach seen above. For better or &lt;a href="http://www.leveragedsellout.com/2014/02/the-book-of-graham/"&gt;for worse&lt;/a&gt;, Graham’s brilliant insights into the startup ecosystem (as influenced by the groups of people described above) have gained him an almost cult-like following. After this little project, I am thinking that maybe I am part of the cult too.

Last but not least: Thanks to Hannah Doherty, Max Faingezicht, Jonathan Maduro, Leon Sasson and Paul Graham himself for reading drafts of this, and Mike Leonard for helping with the data cleanup. Also, thanks to Dirk Brockmann for getting me interested in Complex Networks. Most of the math and code above is derived from the notes I took in &lt;a href="http://rocs.northwestern.edu/Courses/F12-395/Home.html"&gt;his course&lt;/a&gt;</description><author>Avy Faingezicht</author><pubDate>Sat, 07 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/projects/2015/03/07/pg/</guid></item><item><title>UX scrapbook bookmarks</title><link>https://xenodium.com/ux-scrapbook-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.vox.com/2015/2/8/7475667/27-fonts-give-or-take-that-explain-your-world"&gt;27 fonts* (give or take) that explain your world&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://timetravel.pixelfika.com/"&gt;5 Years of Design (good for inspiration)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://engineering.flipboard.com/2015/02/mobile-web/"&gt;60 FPS on mobile web (plus layouts)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rix.si/"&gt;Another minilimalistic one-pager&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://exposure.co/"&gt;Another minimalistic gallery&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.behance.net/search?search=ios&amp;amp;utm_source=ios%20dev%20tools&amp;amp;utm_medium=website&amp;amp;utm_campaign=ios%20dev%20tools&amp;amp;at=11lvzs&amp;amp;ct=ios%20dev%20tools"&gt;Behance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stories.uplabs.com/compact-powerful-great-examples-of-floating-action-buttons-in-interfaces-7079b9926cb5#.7ch9p8n82"&gt;Compact &amp;amp; Powerful: Great Examples of Floating Action Buttons in Interfaces&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.flagofplanetearth.com/#intro-shift"&gt;Flag of Planet Earth&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://generative-placeholders.glitch.me/"&gt;Generative Placeholders&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/stroughtonsmith/status/1320966432600006656"&gt;Graphic design from other cultures&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kevin.is/committed-to-github/"&gt;Kevin.is (Simple layout)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mengto.com/img/snoflake-menu.jpg"&gt;Meng To's I Love Food I&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mengto.com/img/exp-menu.jpg"&gt;Meng To's I Love Food II&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lmjabreu.com/"&gt;Minimalistic blog layout&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://antirez.com/latest/0"&gt;Minimalistic blog layout&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.piotrpisarzphotography.com/"&gt;Minimalistic gallery&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://indie.vc"&gt;Minimalistic one-pager&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.wired.com/2015/04/legendary-redesign-helvetica-reborn-30-years"&gt;Neue Haas Unica (reborn)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.monotype.com/libraries/neue-haas-unica/"&gt;Neue Haas Unica&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uxdesign.cc/neumorphism-in-user-interfaces-b47cef3bf3a6"&gt;Neumorphism in user interfaces - UX Collective&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@sgblank/organizational-debt-is-like-technical-debt-but-worse-3c0c86eae3eb"&gt;Organizational Debt is Like Technical debt — But Worse&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://spootnik.org/"&gt;Pierre-Yves Ritschard's minialistic blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fonts2u.com/raleway-heavy.font"&gt;Raleway Font&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nsainsbury.svbtle.com/java-developers"&gt;Svbtle&lt;/a&gt;: A post on java developers. Enjoyed its minimalistic layout.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://whereis-whoishiring-hiring.me/"&gt;whereis-whoishiring-hiring.me (minimalistic categorization)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/ux-scrapbook-bookmarks</guid></item><item><title>Travel bookmarks</title><link>https://xenodium.com/travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.buzzfeed.com/ariannarebolini/totally-breathtaking-trails-to-hike-before-you-die#.chOolMjWA"&gt;21 Totally Breathtaking Trails&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cnnespanol.cnn.com/2015/09/15/5-increibles-escapadas-a-islas-que-quizas-nunca-has-considerado/"&gt;5 increíbles escapadas a islas que quizás nunca has considerado&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=10863990"&gt;52 Places to Go in 2016 (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nytimes.com/interactive/2016/01/07/travel/places-to-visit.html?_r=0"&gt;52 Places to Go in 2016&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/walking-and-trekking/best-of-walking-and-trekking/content/travel-tips-and-articles/a-beginners-guide-to-the-art-of-hiking"&gt;A beginner's guide to the art of hiking&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://abitofculture.net/"&gt;abitofculture.net&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.alexinwanderland.com/"&gt;Alex in wanderland&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://imgur.com/a/m9YjK"&gt;Amazing places around the world&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.backpacksandbunkbeds.co.uk/"&gt;Backpacks and Bunkbeds&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://beyondblighty.com/"&gt;Beyond blighty&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blouinartinfo.com/travel"&gt;BLOUINARTINFO+TRAVEL&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://continentalbreakfasttravel.com/"&gt;Continental Breakfast travel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.girltweetsworld.com/"&gt;Girl tweets world&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.quora.com/How-does-it-feel-to-travel-alone"&gt;How does it feel to travel alone? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/round-the-world-travel/best-of-round-the-world-travel/content/travel-tips-and-articles/how-to-pack-light-tips-from-a-master-packer"&gt;How to pack light: tips from a master packer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fourhourworkweek.com/2013/07/14/how-to-travel-21-contrarian-rules/"&gt;How to travel: 21 Contrarian rules&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.railjournal.com/"&gt;International Railway Journal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://izi.travel/en/app?content_lang=fr&amp;amp;content_uuid=ede5d243-ace6-459c-b1cc-f45744c48a5d"&gt;izi.TRAVEL: A tour guide in your pocket&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://joestrippin.blogspot.co.uk/"&gt;Joe's Trippin' A few tales from the road by a modern day nomad&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.legalnomads.com/"&gt;Legal nomads&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.needanotherholiday.com/"&gt;Need another holiday&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.neverendingfootsteps.com/"&gt;Never ending footsteps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/travel-tips-and-articles/new-in-travel-the-best-new-openings-of-2017-11-to-20"&gt;New in Travel: the best new openings of 2017 (11 to 20)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/travel-tips-and-articles/new-in-travel-the-best-new-openings-of-2017-21-to-35"&gt;New in Travel: the best new openings of 2017 (21 to 35)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/travel-tips-and-articles/new-in-travel-the-best-new-openings-of-2017-one-to-10"&gt;New in Travel: the best new openings of 2017 (one to 10)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ontheluce.com/"&gt;On The Luce&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.spiegel.de/international/paradise-lost-tourists-are-destroying-the-places-they-love-a-1223502.html"&gt;Paradise Lost: Tourists Are Destroying the Places They Love - SPIEGEL ONLINE&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pichette.org/"&gt;pichette.org's travel blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.eliotandme.com/poster"&gt;Posters: Create travel gifts/posters and souvenirs (eliot)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://restlessjo.wordpress.com/"&gt;Restless Jo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.seemytravels.com/"&gt;See my travels&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://upgrd.com/thecrewlounge"&gt;The Crew Lounge&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thegrownupgapyear.wordpress.com/"&gt;The Grown-up gap year&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.thehappytalent.com/"&gt;The Happy Talent. A Travel blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thetravelhack.com/"&gt;The Travel Hack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://thetravelbunny.com/"&gt;The Travelbunny&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://helpstay.com/journal/"&gt;The Volunteer Journal | Swap Skills For Accommodation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/travel-photography/best-of-travel-photography/content/travel-tips-and-articles/the-worlds-best-places-to-see-autumn-colours"&gt;The world's best places to see autumn colours&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/thorntree"&gt;Thorn Tree travel forum (Lonely Planet's)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://travelwithkat.com/"&gt;Travel with Kat&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.traveldudes.org/"&gt;Traveldudes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://travelingspoon.com/"&gt;Traveling Spoon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.travelistly.com/tv"&gt;Travelistly TV (high quality travel content)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lonelyplanet.com/travel-tips-and-articles/tried-and-tested-tips-for-a-trouble-free-road-trip"&gt;Tried and tested tips for a trouble free road trip&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.two-fortheroad.com/"&gt;Two for the road&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/travel-tips-and-articles/ultimate-travel-list-lonely-planets-top-10-sights-in-the-world"&gt;Ultimate travel list: Lonely Planet's top 10 sights in the world&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vagabondbaker.com/"&gt;Vagabond Baker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-are-common-items-that-savvy-travelers-bring-with-them-that-less-savvy-ones-dont"&gt;What are common items that savvy travelers bring with them that less-savvy ones don't? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-are-some-must-eat-dishes-in-your-country"&gt;What are some must-eat dishes in your country? - Quora&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-are-your-top-10-travel-tips"&gt;What are your top 10 travel tips? (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://world.dailysecret.com/world/en"&gt;World daily secret&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plus.google.com/collection/IW-dY"&gt;World food and drink&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.xdaysiny.com/"&gt;X Days in Y&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ytravelblog.com/"&gt;ytravel&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/travel-bookmarks</guid></item><item><title>Startup bookmarks</title><link>https://xenodium.com/startup-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id%3D10101209"&gt;16 Startup Metrics (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://a16z.com/2015/08/21/16-metrics/"&gt;16 Startup Metrics&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sidejobr.com/help/19-amazing-sites-get-free-stock-photos/"&gt;19 Amazing Sites To Get Free Stock Photos&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://moz.com/blog/301-redirection-rules-for-seo"&gt;301 Redirects Rules Change: What You Need to Know for SEO&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.appcues.com/blog/increase-user-engagement"&gt;6 ways to increase user engagement for product-led growth&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://landscape.io"&gt;A Dashboard for your Code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=9923709"&gt;A guide to PR for startups (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.craigkerstiens.com/2015/07/21/An-intro-PR-guide-for-startups/"&gt;A guide to PR for startups&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22895842"&gt;A Guide to Pricing Plans | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22449314"&gt;A two-person startup already uses twenty-eight other tools | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://airtable.com/"&gt;Airtable: cloud DB with a spreadsheet web UI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17899510"&gt;All Things Sales: Mini-lessons for startup founders (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.canva.com/"&gt;Amazingly Simple Graphic Design Software – Canva&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrissacca.com/2018/12/an-email-i-will-never-open"&gt;An email I will never open (Chris Sacca)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/abaraka/RESTClient"&gt;An iOS REST Client that is based on MVVM using ReactiveCocoa&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.raywenderlich.com/55384/ios-7-best-practices-part-1"&gt;An iOS Weather app case study&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hbr.org/2015/04/how-to-launch-your-digital-platform"&gt;Answer these questions about potential digital platform&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aphyr/distsys-class"&gt;aphyr/distsys-class: Class materials for a distributed systems lecture&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=25547716"&gt;API pagination design | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://appfigures.com/"&gt;AppFigures:&lt;/a&gt; App tracking platform.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22328822"&gt;Apple Edge Cache (CDNs) | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=19497788"&gt;Application-Level Logging Best Practices (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AppScale/appscale"&gt;AppScale, The Open Source Implementation of Google App Engine&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arc.io/pricing"&gt;Arc (crowdfunded CDN)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arenzana.org/2019/06/artisanal-web-hosting/"&gt;Artisanal Web Hosting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=14146850"&gt;Ask HN: Best business advice for software developers (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12376596"&gt;Ask HN: How do you handle DDoS attacks? (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=23390966"&gt;Ask HN: How does your company manage its encryption keys? | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=24965115"&gt;Ask HN: How to effectively get feedback from users? | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=9561127"&gt;Ask HN: Simple alternative to Google Analytics&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=9667247"&gt;Ask HN: What tools do you use to build HTML emails?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18236188"&gt;Ask HN: What's your advice for someone who's raising capital for the first time? (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.owasp.org/index.php/Authentication_Cheat_Sheet"&gt;Authentication Cheet Sheet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://business.axdraft.com/en/business"&gt;AXDRAFT (Free legal documents for startups)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/spreadsheet/ccc?key%3D0Al7M8fgKPXoidENFa0M5VnJpb3pMeHQtS0RDcHFvY1E&amp;amp;usp%3Dsharing#gid%3D0"&gt;BaaS comparison&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kinvey.com/images/kinvey_backend-as-a-service_mobileecosystem_2100px.png"&gt;BaaS ecosystem map&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://barnacl.es/"&gt;Barnacles&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=10481507"&gt;Bayesian ranking of items with up and downvotes or 5 star ratings (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://julesjacobs.github.io/2015/08/17/bayesian-scoring-of-ratings.html"&gt;Bayesian ranking of items with up and downvotes or 5 star ratings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bbcsfx.acropolis.org.uk/"&gt;BBC Sound Effects Archive Resource • Research &amp;amp; Education Space&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Bcrypt"&gt;bcrypt: password hashing function alternative to md5 and sha1 (Wikipedia)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hakaselogs.me/2018-12-01/building-small-containers-for-kubernetes"&gt;Building a small container for a golang service for kubernetes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hybridcattt.com/blog/website-essentials/"&gt;Building a Well-Rounded Website: Essentials (wonderful recommendations for your site)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=25180180"&gt;Building Your Color Palette | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://carrd.co/"&gt;Carrd - Simple, free, fully responsive one-page sites for pretty much anything&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wordsafety.com/"&gt;Check for word safety (wordsafety.com)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17920287"&gt;Choosing Your First Marketing Hire (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.clinkhostels.com/london/clink78/"&gt;Clink78 hostel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12396520"&gt;Common Startup Timing Mistakes and How to Avoid Them (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tld-list.com/"&gt;Compare Prices of All Top-Level Domains | TLD List&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rancher.com/comparing-monitoring-options-for-docker-deployments/"&gt;Comparing five monitoring options for docker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.compose.io/"&gt;Compose.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.contentful.com/"&gt;Contentful: Like a CMS — except for the bad parts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://umap.openstreetmap.fr/en/"&gt;Create OpenStreetMaps with uMap&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://curlbuilder.com/"&gt;curl online command line builder&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://danielvassallo.com/"&gt;Daniel Vassallo - (quit Amazon story and advice)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yaronn/blessed-contrib"&gt;Dashborads using ASCII and JS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sag333ar/SRKLocationManager"&gt;Detect iOS Device location in just one line&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://niltalk.com/"&gt;Disposable chats in Go&lt;/a&gt; (more links &lt;a href="https://news.ycombinator.com/item?id%3D9372918"&gt;here&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://paulgraham.com/ds.html"&gt;Do Things that Don't Scale&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/9xyiv7/does_anyone_have_recommendations_for_accounting/"&gt;Does anyone have recommendations for accounting software? : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=14070189"&gt;Does it scale? Who cares (2011) (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.domainsfortherestofus.com/"&gt;Domains for the Rest of Us (domain name generator)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/appltn/done-is-better-than-perfect"&gt;Done is better than perfect&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.eidel.io/2023/07/09/vc-funding/"&gt;Don’t Take VC Funding - It Will Destroy Your Company | Oliver Eidel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/rsms/status/1324142698161303552"&gt;dynamic website/service with Redis leader and follower replicas&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=19154082"&gt;Earnest Capital is live (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fastly.com/"&gt;Edge Cloud Platform (Fastly)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mxb.dev/blog/emergency-website-kit/"&gt;Emergency Website Kit | Max Böck - Frontend Web Developer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://encore.dev"&gt;Encore • APIs made simple&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hackmd.io/EmPIHGhTRh6pDSJ1VEgkkA"&gt;Ethical apps code of conduct - HackMD&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=23851870"&gt;Everything you need to know about OAuth 2.0 | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://usefathom.com/"&gt;Fathom Analytics - Simple, Privacy-focused Web Analytics&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.litscape.com/word_tools/pattern_match.php"&gt;Find words that match your pattern.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rivalseek.com/"&gt;Find your competition&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fiverr.com/"&gt;Fiverr (logos, graphic design, etc)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://flagtheory.com/"&gt;Flag Theory: Freedom, Privacy and Wealth&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://creativemarket.com/"&gt;Fonts, Graphics, Themes and More ~ Creative Market&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://graphicriver.net/"&gt;Fonts, Logos &amp;amp; Icons from GraphicRiver&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17266006"&gt;For Static Sites, There’s No Excuse Not to Use a CDN (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cruip.com/"&gt;Free HTML landing page templates for startups - Cruip&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.shyahi.com/post/62901878131/putting-everything-together-free-tools-for"&gt;Free tools for startups (Shyahi blog)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.freevectors.net/"&gt;Free vectors&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.backa.co/"&gt;Gain valuable, actionable feedback on your startup ideas&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.glyphish.com/"&gt;Glyphish icon collection&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.reddit.com/r/golang/comments/20e2to/cheap_go_hosting_with_postgresql/"&gt;Go hosting (Reddit comments)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.goatcounter.com/"&gt;GoatCounter web analytics&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gofundme.com/"&gt;gofundme&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://getgophish.com/"&gt;Gophish - Open Source Phishing Framework&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/graphql"&gt;GraphQL, a query language and execution engine tied to any backend service&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fullstorydev/grpcui"&gt;grpcui: An interactive web UI for gRPC&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/fullstorydev/grpcurl"&gt;grpcurl: Like cURL, but for gRPC&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gumroad.com"&gt;Gumroad. Helps creators sell, generate digital licenses, grow audiences, etc&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=9865338"&gt;HN: Things to Know When Making a Web Application in 2015&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kukuruku.co/hub/ios/how-i-got-to-the-app-store-top-with-a-simple-currency-app"&gt;How I got to the app store top with a simple currency app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.usejournal.com/how-i-made-8-000-per-month-podcasting-and-why-you-probably-dont-want-to-855966a557aa?gi=58d80835cfc8"&gt;How I Made $8,000 per Month Podcasting, and Why You Probably Don’t Want To&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sentia.com.au/blog/how-much-does-it-cost-to-build-an-app"&gt;How much does it cost to build an app? (Sentia Blog)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://a16z.com/2016/08/24/options-ownership/"&gt;How Startup Options (and Ownership) Works&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18490437"&gt;How to Acquire Your First 100 Customers (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bulgerpartners.com/how-to-be-prepared-for-technical-due-diligence-what-to-anticipate-and-how-to-excel/"&gt;How to Be Prepared for Technical Due Diligence: What to Anticipate and How to Excel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=24780152"&gt;How to Build a Great Series A Pitch and Deck | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clearfounder.com/how-to-diy-a-product-launch-video-with-no-experience-and-for-free/"&gt;How to DIY a Product Launch Video with No Experience, and for Free&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18880043"&gt;How to get your money’s worth from your startup lawyer (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.streamroot.io/how-to-implement-a-multi-cdn-strategy-everything-you-need-to-know/"&gt;How to implement a multi-CDN strategy: everything you need to know&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=21591002"&gt;How to Kickstart and Scale a Marketplace | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crew.co/backstage/blog/the-psychology-of-pricing"&gt;How to price anything: The psychology of why we’ll pay what we pay&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sendwithus.com/resources/guide"&gt;How to Send Email Like a Startup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://startupclass.samaltman.com/"&gt;How to start a startup lectures&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.iconarchive.com/"&gt;Icon archive&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.iconfinder.com"&gt;Icon finder&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://imagetragick.com/"&gt;ImageTragick (ImageMagick vulnerabilities and mitigations)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://irreal.org/blog/"&gt;Irreal: Bad Password Policies (salt + hash with bcrypt)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kaffeine.herokuapp.com/"&gt;Kaffeine pings your Heroku app every 30 minutes so it will never go to sleep&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22871180"&gt;Keycloak: Open-source identity and access management | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=19372623"&gt;Launch HN: Axdraft (YC W19) - Legal documents for startups in minutes (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://launchaco.com/build/"&gt;Launchaco - Name a business&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://layer.com"&gt;Layer, messaging platform&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.legalletters.co/"&gt;Legal Letters—At a fraction of the cost&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.sueraisty.com/lessons-learned-from-co-founding-a-tech-startup/"&gt;Lessons I learned from Co-Founding a startup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=23560823"&gt;Lightweight Alternatives to Google Analytics | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neiesc/ListOfMinimalistFrameworks"&gt;List of Minimal frameworks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hatchful.shopify.com/"&gt;Logo Maker &amp;amp; Logo Creator - Free Logo Generator Online&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.namecheap.com/logo-maker/"&gt;Logo Maker - Create a Free Logo in Minutes - Namecheap&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://logodust.com/"&gt;Logodust: Free Logo Designs For Your Startup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=13065015"&gt;Logojoy: AI-powered logo creator (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.logoshi.com/"&gt;Logoshi: Online Logo Maker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.looker.com"&gt;Looker (Data analysis)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://picsum.photos/"&gt;Lorem Picsum: Lorem Ipsum… but for photos&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lmjabreu.com/"&gt;Luis Abreu, iOS Design/UX Specialist&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=21225223"&gt;Making Instagram.com faster: Part 3 – cache first (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mapbox.com/"&gt;Mapbox. Maps for iOS, Android and Web&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mapsme/omim/blob/master/README.md"&gt;MAPS.ME (open sourced)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jessesquires/JSQMessagesViewController"&gt;Messaging UI for iOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://muratbuffalo.blogspot.com/2019/12/my-distributed-systems-seminars-reading.html"&gt;Metadata: My Distributed Systems Seminar's reading list for Spring 2020&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=23803046"&gt;Migrating Away from Google Analytics | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ldpreload.com/blog/names-to-reserve"&gt;Names to reserve for your own service&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://netflix.github.io/mantis/"&gt;Netflix's Mantis: a platform to build an ecosystem of realtime stream processing applications&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.netlify.com/"&gt;Netlify: All-in-one platform for automating modern web projects.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.netlify.com"&gt;Netlify: Build, deploy, and manage modern web projects&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitalocean.com/community/tools/nginx"&gt;NGINX Config generator | DigitalOcean&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mobilenighthawk.com/"&gt;Nighthawk (Debug iOS apps remotely from your browser)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nim-lang/nimforum"&gt;nimforum: Lightweight alternative to Discourse written in Nim&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.track.tax/"&gt;No more tax surprises - Track&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://officesnapshots.com/"&gt;Office Snapshots&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.fogcreek.com/how-to-onboard-software-engineers-interview-with-kate-heddleston/"&gt;Onboarding engineers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://onesignal.com/"&gt;OneSignal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.crowdcube.com/"&gt;Online investing, equity crowdfunding, business finance : Crowdcube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gusto.com/"&gt;Online Payroll Services, HR, and Benefits | Gusto&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.openhunt.co/"&gt;Open Hunt: an open and community-run alternative to Product Hunt.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://baremetrics.com/open-startups"&gt;Open Startups: companies embracing transparency and openness&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://serverfault.com/questions/219620/which-is-the-best-webserver-for-serving-static-content-and-load-balancing"&gt;Options to serve static content&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@sgblank/organizational-debt-is-like-technical-debt-but-worse-3c0c86eae3eb"&gt;Organizational Debt is Like Technical debt — But Worse&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://facebook.github.io/origami/examples/"&gt;Origami for UI patterns and interactions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.paintcodeapp.com"&gt;PaintCode (drawings into ObjC code)&lt;/a&gt; - &lt;a href="http://bit.ly/PaintCodeRocks"&gt;coupon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eatcodeplay.com/why-we-killed-off-code-reviews/"&gt;Pair programming over code-reviews&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.parse.com"&gt;parse.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://paymentfont.io/"&gt;paymentfont.io (Payment icons)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.benfrederickson.com/distance-metrics/?hn=1"&gt;People Who Like This Also Like&lt;/a&gt;…&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id%3D9453477"&gt;People Who Like This Also Like… (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://permutive.com/"&gt;Permutive (ad-server for sponsored content)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pioneer.app/"&gt;Pioneer - The network for ambitious outsiders&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://porkbun.com/"&gt;porkbun.com | An oddly satisfying experience (domain registry)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=10381584"&gt;Pragmatic app pricing (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.marco.org/2015/10/13/pragmatic-pricing"&gt;Pragmatic app pricing &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mixpanel.com/"&gt;Product and User Behavioral Analytics for Mobile, Web, &amp;amp; More | Mixpanel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.producthunt.com/"&gt;Product Hunt: a curation of the best new products, every day&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.theatlantic.com/business/archive/2015/01/the-psychological-difference-between-1200-and-1167/384993/?single_page=true"&gt;Psychological differences in price&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/bmweis/status/1162738837539426304"&gt;Questions to ask when joining a startup to help you understand the potential value of your equity&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.quora.com/What-are-the-best-productivity-tools-for-entrepreneurs"&gt;Quora: What are the best productivity tools for entrepreneurs&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;&lt;a href="https://get.gaug.es/"&gt;Real Time Web Analytics &amp;amp; Marketing Attribution Tools - Gauges&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18402411"&gt;RemoteMac.io – Dedicated Mac mini (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://responsevault.com/"&gt;ResponseVault - Spreadsheet. Grid Form Builder.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rethinkdb.com/faq/"&gt;RethinkDB FAQ&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=9185338"&gt;RethinkDB HN comments&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://retool.com"&gt;Retool: Build internal tools fast&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=19388489"&gt;Roll Your Own Analytics (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pcmaffey.com/roll-your-own-analytics/"&gt;Roll Your Own Analytics&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spin.atomicobject.com/2019/06/12/ip-software-dev-contract/"&gt;Securing Intellectual Property Rights in a Software Development Contract&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sendwithus.com/resources/guide/"&gt;Send email like a startup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shareasimage.com/"&gt;Share as image&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Show HN: How I made simple Geolocation service which handles 6m+ req/mo for $5.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22441289"&gt;Show HN: Profit Hunt - Get inspired by profitable online projects | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simplescraper.io/"&gt;Simplescraper — Scrape Websites and turn them into APIs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=19457709"&gt;So you want your app/website to work in China&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/spaceuptech/space-cloud"&gt;space-cloud: Open source, high performance web service which provides instant Realtime APIs on the database of your choice.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.splunk.com/"&gt;Splunk: SIEM, AIOps, Application Management, Log Management, Machine Learning, and Compliance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://logo.squarespace.com/"&gt;Squarespace Logo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.samaltman.com/startup-advice-briefly"&gt;Startup advice, briefly&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.defmacro.org/2019/03/26/startup-checklist.html"&gt;Startup idea checklist | defmacro&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/leonar15/startup-checklist"&gt;Startup Incorporation Checklist&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/9nibvw/striking_off_company_am_i_missing_anything"&gt;Striking off company - am I missing anything? : UKPersonalFinance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.firebase.com/docs/android/guide/structuring-data.html"&gt;Structuring JSON data in your Firebase database&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://t.co/5WUoz5BwtT"&gt;Submit.co: Press coverage for your startup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://submit.co/"&gt;submit.co: Where to get press coverage for your startup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://swagger.io/"&gt;Swagger&lt;/a&gt;: Represent REST API.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tailwindui.com/"&gt;Tailwind UI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://taskjuggler.org/"&gt;TaskJuggler - A Free and Open Source Project Management Software - About TaskJuggler&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://technically.dev/posts/what-your-developers-are-using.html"&gt;Technically: what your developers are using (stacks, tools, and beyond)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=11964763"&gt;Telephony, SMS, and MMS APIs (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://textbelt.com/"&gt;TextBelt:&lt;/a&gt; A free, open source API for outgoing texts..&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12448844"&gt;The Correct Way to Validate Email Addresses (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/fluxx-studio-notes/the-first-rule-of-pricing-is-you-do-not-talk-about-pricing-1875caa39b89#.exvbm4vfa"&gt;The first rule of pricing is: you do not talk about pricing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22608106"&gt;The good parts of AWS: a visual summary | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=9501892"&gt;The Psychology of Pricing: A Gigantic List of Strategies (HN comments)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nickkolenda.com/psychological-pricing-strategies"&gt;The Psychology of Pricing: A Gigantic List of Strategies&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thehungryjpeg.com/aff/Madiha/"&gt;TheHungryJPEG.com (Premium Graphic Design Resources)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.venanti.us/web-app-2015/"&gt;Things to Know When Making a Web Application in 2015&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item"&gt;TLDR Stock Options&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/sahilrajput/tools-for-developers-gkp"&gt;Tools for Developers (DEV Community)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/torodb/torodb"&gt;ToroDB&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.hetzner.de/index.php/Traffic/en"&gt;Traffic/en – Hetzner DokuWiki (CDN)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/migueldeicaza/status/1314004192844021765"&gt;Twitter: Cheapest and reliable way of serving data over http&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=24391612"&gt;Understanding OAuth2 and OpenID Connect | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://unsplash.com/"&gt;Unsplash: Beautiful Free Images &amp;amp; Pictures&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/S3Torrent.html"&gt;Using BitTorrent with Amazon S3&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.valvesoftware.com/company/Valve_Handbook_LowRes.pdf"&gt;Valve employee handbook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.waveapps.com/"&gt;Wave Financial: Financial Software for Small Businesses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=23378524"&gt;We ditched Google Analytics | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.workshape.io/we-use-rethinkdb-at-workshapeio/"&gt;We use RethinkDB at Workshape.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clicky.com/"&gt;Web Analytics in Real Time (Clicky)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://statcounter.com"&gt;Web Analytics Made Easy - Statcounter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/"&gt;Web Scraping, Data Extraction and Automation · Apify&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-are-some-of-the-things-VCs-listen-for-when-hearing-pitches-that-instill-confidence-in-them-about-the-startup-founders-pitching/answer/Patrick-Mathieson"&gt;What are some of the things VCs listen for when hearing pitches that instill confidence in them about the startup founders pitching?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17875285"&gt;What does the GDPR actually mean for startups? (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/allison_seboldt/what-hosting-do-you-use--5bmh"&gt;What hosting do you use? - DEV Community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.talkingquickly.co.uk/2015/04/what-id-tell-myself-about-startups/"&gt;What I'd tell myself about startups if I could go back 5 years&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/e1f0tn/what_is_the_best_payment_processor_for_a_sme/"&gt;What is the best &amp;quot;payment processor&amp;quot; for a SME e-commerce company in the UK?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/romanzolotarev/status/1054342116917329921?s=12"&gt;What is your favorite domain registrar? (Twitter)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zerokspot.com/weblog/2020/02/29/mobile-app-subscription-pricing/"&gt;What's a good (mobile) app subscription price? - zerokspot.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/UKPersonalFinance/comments/ehd14k/whats_the_best_financial_package_i_could_offer/"&gt;What's the best financial package I could offer our employees?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=13063842"&gt;What’s the Second Job of a Startup CEO? (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18713844"&gt;Writing copy for landing pages (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ycombinator.com/documents/#sales"&gt;YC Sales agreement&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spin.atomicobject.com/2019/11/14/more-than-rest-for-api-success/"&gt;You Need More than REST for API Success&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/startup-bookmarks</guid></item><item><title>Romania travel bookmarks</title><link>https://xenodium.com/romania-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.abandonedamerica.us/abandoned-romania"&gt;Abandoned Romania&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bran-castle.com/"&gt;Bran Castle&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/romania-travel-bookmarks</guid></item><item><title>Productivity tips backlog</title><link>https://xenodium.com/productivity-tips-backlog</link><description>&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/tonsky/AnyBar"&gt;AnyBar: OS X menubar status indicator (color dot)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;[TODO]{.todo .TODO} &lt;a href="https://github.com/benvan/mercury"&gt;mercury (fuzzy tab search)&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/productivity-tips-backlog</guid></item><item><title>Productivity bookmarks</title><link>https://xenodium.com/productivity-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://10fastfingers.com/"&gt;10 fast fingers&lt;/a&gt; (improve typing skills).&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dayoneapp.com/"&gt;Day One Journal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://yanpritzker.com/2011/11/17/dotfiles-for-ultimate-productivity-in-bash-and-vim/"&gt;Dotfiles for insane productivity in bash, git, and vim&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/EricaJoy/status/1235635291378999296"&gt;EricaJoy on Twitter: &amp;quot;so folks, what are your #1 tools for remote work?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18179972"&gt;How to Get Things Done When You Don't Feel Like It (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=20780939"&gt;How to return to the flow faster (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codejamming.org/2019/how-to-return-to-flow"&gt;How to return to the flow faster | Code Jamming&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://maebert.github.io/jrnl/"&gt;jrnl&lt;/a&gt;: Likely what I've been looking for journaling from command line.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.noisli.com/"&gt;Noisli - Improve Focus and Boost Productivity with Background Noise&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://app.getpocket.com/"&gt;Pocket&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/karaluton/reflecting-on-one-year-of-remote-work-1nkp"&gt;Reflecting On One Year of Remote Work - DEV Community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.todoist.com/2015/11/30/ultimate-guide-personal-productivity-methods/"&gt;The Ultimate Guide to Personal Productivity Methods&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22105229"&gt;Tricks to start working despite not feeling like it | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/skwp/dotfiles"&gt;Yan's dot files&lt;/a&gt;: For peeking.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://yanpritzker.com/2006/10/03/five-ways-to-get-insane-productivity-boosts/"&gt;Yan's productivity tips&lt;/a&gt;: Also to try.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.zotero.org"&gt;Zotero&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/productivity-bookmarks</guid></item><item><title>Privacy bookmarks</title><link>https://xenodium.com/privacy-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.lastpass.com/"&gt;#1 Password Manager, Vault, &amp;amp; Digital Wallet App (LastPass)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.lopp.net/modest-privacy-protection-proposal/"&gt;A Modest Privacy Protection Proposal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.neustadt.fr/essays/against-a-user-hostile-web/"&gt;Against an Increasingly User-Hostile Web - Neustadt.fr&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://restoreprivacy.com/google-alternatives/"&gt;Alternatives to Google Products (Restore Privacy)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amiunique.org/fp"&gt;Am I unique?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17896692"&gt;An Intensive Introduction to Cryptography (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yishilin14/asc-key-to-qr-code-gif"&gt;asc-key-to-qr-code-gif: Convert ASCII-armored PGP keys to animated QR code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=23521399"&gt;Ask HN: A way to adblock “we're using cookies” popups? | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kickball/awesome-selfhosted"&gt;Awesome selfhosted (locally hosting and managing applications instead of renting from SaaS providers)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bellingcat.com/resources/how-tos/2019/12/26/guide-to-using-reverse-image-search-for-investigations/"&gt;bellingcat - Guide To Using Reverse Image Search For Investigations - bellingcat&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nullprogram.com/blog/2018/09/06/"&gt;Brute Force Incognito Browsing « null program&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mullvad.net/en/guides/first-steps-towards-online-privacy/"&gt;Change your online habits - Guides | Mullvad VPN&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://count.ly/"&gt;Countly | Product Analytics for Mobile, Web, Desktop and IoT&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crypt.ee"&gt;Cryptee (Private, Secure, Encrypted Documents &amp;amp; Photos)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cryptpad.fr/"&gt;CryptPad: Collaboration suite, encrypted and open-source&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dbp.io/essays/2013-06-29-hackers-replacement-for-gmail.html"&gt;dbp.io: A Hacker's Replacement for GMail&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nrempel.com/de-googling-my-life/"&gt;De-Googling My Life&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simpleoptout.com/"&gt;Deep links to opt-out of data sharing by 60+ companies – Simple Opt Out&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://degoogle.jmoore.dev/"&gt;degoogle | A huge list of alternatives to Google products.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://digital-era.net/"&gt;Digital Era&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dnsleaktest.com"&gt;DNS leak test&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doesmysiteneedhttps.com/"&gt;Does my site need HTTPS?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18100243"&gt;DuckDuckGo Traffic (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etherpad.org/"&gt;Etherpad (Open Source online editor)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ethical.net/resources/"&gt;Ethical Alternatives &amp;amp; Resources - ethical.net&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://usefathom.com/"&gt;Fathom Analytics - Simple, Privacy-focused Web Analytics&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://miguelmota.com/blog/getting-started-with-wireguard/"&gt;Getting Started with WireGuard » Miguel Mota | Software Developer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AGWA/git-crypt"&gt;git-crypt: Transparent file encryption in git&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tycrek/degoogle"&gt;GitHub - tycrek/degoogle: Repo for the r/privacy &amp;quot;degoogle&amp;quot; megathread&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://markosaric.com/firefox/"&gt;Give Firefox A Chance For A Faster, Calmer And Distraction-Free Internet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.computerworld.com/article/3339618/apple-ios/how-to-stay-as-private-as-possible-on-apples-ipad-and-iphone.html"&gt;How to stay as private as possible on Apple's iPad and iPhone | Computerworld&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ncsc.gov.uk/blog-post/three-random-words-or-thinkrandom-0"&gt;Ian M discusses what makes a good password (NCSC)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prism-break.org/en/categories/ios/"&gt;iOS - Platforms - PRISM Break (more privacy tools)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17737148"&gt;K-anonymity (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Kickball/awesome-selfhosted"&gt;Kickball/awesome-selfhosted: Free Software network services and web applications which can be hosted locally.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kill-the-newsletter.com/"&gt;Kill the Newsletter!&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kolabnow.com/feature/calendar"&gt;Kolab (calendar)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mailbox.org/en/"&gt;mailbox.org (email + calendar host)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18810035"&gt;Migrating from Google Analytics (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mssun/passforios/wiki#importing-ascii-armor-encrypted-key"&gt;mssun/passforios Wiki&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mullvad.net/en/"&gt;Mullvad VPN&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://adi.is/s/cpunk20/#21"&gt;New privacy tools&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://riseup.net/en/security/message-security/openpgp/best-practices"&gt;OpenPGP Best Practices - riseup.net&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nytimes.com/wirecutter/reviews/our-favorite-ad-blockers-and-browser-extensions-to-protect-privacy/"&gt;Our Favorite Ad Blockers and Browser Extensions for Privacy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://panopticlick.eff.org"&gt;Panopticlick (Is your browser safe against tracking?)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mhaffner.github.io/post/pi-hole-troubleshooting/"&gt;Pi-hole troubleshooting: An overview of my recent installation | Matthew Haffner&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=19258717"&gt;Pi-Hole – A black hole for Internet advertisements (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plausible.io/"&gt;Plausible · Simple, open-source web analytics&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.privacytools.io/"&gt;Privacy Tools - Encryption Against Global Mass Surveillance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=27294703"&gt;Privacy – A curated list of services and alternatives that respect privacy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://keyserver.mattrude.com/guides/web-key-directory/"&gt;Publishing A Public Key via Web Key Directory (WKD) - OpenPGP Keyserver&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=27707857"&gt;Purelymail – cheap, no-nonsense email | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.qubes-os.org/"&gt;Qubes OS: A reasonably secure operating system&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runnaroo.com/"&gt;Runaroo (metasearch engine)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runnaroo.com/"&gt;Runnaroo | A Better Private Search Engine&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://searx.space/"&gt;Searx search engine instances&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://abot.app/blog/elk-nginx-logs-setup"&gt;Setup ELK for NGINX logs with Elasticsearch, Logstash, and Kibana (analytics alternative)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simpleanalytics.io"&gt;Simple Analytics - Simple, clean, and privacy-friendly analytics&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://smallstep.com/blog/everything-pki.html"&gt;smallstep - Everything you should know about certificates and PKI but are too afraid to ask&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ssd.eff.org/"&gt;Surveillance Self-Defense | Tips, Tools and How-tos for Safer Online Communications&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/temporary-containers/"&gt;Temporary Containers – Get this Extension for Firefox (en-US)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thatoneprivacysite.net/"&gt;That One Privacy Site&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.remembear.com"&gt;The easiest way to remember passwords | RememBear&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tineye.com/"&gt;TinEye Reverse Image Search&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://riseup.net/en"&gt;Tools for people and groups working on liberatory social change (riseup.net)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://digital-era.net/tor-use-best-practices/"&gt;Tor use - best practices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@ahawkins/trying-to-secure-my-digital-life-b2e5a2876c12"&gt;Trying to Secure My Digital Life – Adam Hawkins – Medium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/namseoknation/status/1268306421197746179"&gt;twitter: YOUR RIGHTS!!! (this is a UK version, but i’m sure some things may apply!! )&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=28410807"&gt;uBlock Origin review | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/VPN/"&gt;Virtual Private Networks (Reddit)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webbkoll.dataskydd.net/en/"&gt;Webbkoll: How privacy-friendly is your site?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://whyprivacymatters.org/"&gt;Why Privacy Matters | Privacy is important. Here are some simple reasons why.&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/privacy-bookmarks</guid></item><item><title>Lifestyle/wellbeing/health bookmarks</title><link>https://xenodium.com/lifestyle-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&amp;quot;Do not spoil what you have by desiring what you have not; what you now have was once among the things you only hoped for.&amp;quot; - Epicurus&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thesleepjudge.com/23-weird-plants-for-your-bedroom-that-will-help-you-sleep-like-a-baby/"&gt;23 Weird Plants For Your Bedroom That Will Help You Sleep Like A Baby&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.theflowstatecollective.com/flow-habits/a-simple-guide-to-meditation"&gt;A simple guide to meditation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/farbodsaraf/status/1067980298040807424?s=12"&gt;Advice I needed when I was young&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.anxietyculture.com/"&gt;Anxiety Culture&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://anxietynomore.co.uk/"&gt;Anxiety No More (Support and Help for a natural anxiety cure)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18837334"&gt;Ask HN: How did you decide what problems to solve in your lifetime? | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://betteretiquette.blogspot.com/"&gt;Better etiquette: Topical Etiquette Tips, Helpful Household Hints, International Travel Tips, Dine Like a Diplomat…&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Blue_Zone"&gt;Blue Zone: Where some claim people live much longer than average&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.brainpickings.org/"&gt;Brain Pickings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Caffeine-induced_anxiety_disorder"&gt;Caffeine-induced anxiety disorder - Wikipedia&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Calisthenics#Common_exercises"&gt;Calisthenics - Wikipedia&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://camdez.com/blog/2010/01/15/lifehacking-expanded/"&gt;Cameron Desautel on lifehacking&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://camdez.com/blog/categories/productivity/"&gt;Cameron Desautel on productivity&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://harryrschwartz.com/2019/11/16/canadian-permanent-residency"&gt;Canadian Permanent Residency&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kdeldycke/awesome-falsehood"&gt;Curated list of falsehoods programmers believe in&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=j2C8MkY7Co8&amp;amp;feature=youtu.be"&gt;Dr. Hamilton Demonstrates &amp;quot;The Hold&amp;quot; - How To Calm A Crying Baby (YouTube)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=23508581"&gt;Dream Homes from the Past Century | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.recipes-news.co.nz/news/2019/11/6/game-changer-or-fame-gainer"&gt;Game Changer or Fame Gainer? — News &amp;amp; Features&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://betterhumans.coach.me/how-to-set-up-your-iphone-for-productivity-focus-and-your-own-longevity-bb27a68cc3d8"&gt;How to Configure Your iPhone to Work for You, Not Against You&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/How-do-I-get-six-pack-abs-in-one-year"&gt;How to get six pack abs in one year - Quora&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/document/d/1j4rj883slFvh1zZLGedqQFM0wqCrHlIEPE62K0LkKak/edit"&gt;ICEBREAKERS, via The Art of Noticing by Rob Walker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-is-the-best-way-to-improve-life/answer/Jon-Brosio"&gt;Jon Brosio's answer to What is the best way to improve life? - Quora&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dezeen.com/2019/05/02/minimod-curucaca-mapa-prefab-house-brazil/"&gt;MAPA hides prefab Minimod Curucaca in Brazilian forest&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17632668"&gt;Melatonin: Much More Than You Wanted to Know (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mindbodygreen.com/"&gt;Mind body green&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=18844791"&gt;Most lives are lived by default (2012) | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mayoclinic.org/diseases-conditions/panic-attacks/symptoms-causes/syc-20376021"&gt;Panic attacks and panic disorder - Symptoms and causes - Mayo Clinic&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17679451"&gt;Periodic fasting starves cisplatin‐resistant cancers to death (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=24050837"&gt;Planning for My Kidnapping | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17231806"&gt;Posing for photos (all about the squinch)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nytimes.com/2015/01/11/fashion/no-37-big-wedding-or-small.html"&gt;Quiz: The 36 Questions That Lead to Love&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.quora.com/What-methods-can-I-use-to-avoid-getting-so-tired-when-I-do-the-same-amount-of-a-work-as-my-peers-who-do-not-get-so-tired"&gt;Quora on increasing energy levels&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=27503597"&gt;Show HN: I made a community sourced fitness routine database | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cdc.gov/handwashing/show-me-the-science-hand-sanitizer.html"&gt;Show Me the Science – When &amp;amp; How to Use Hand Sanitizer in Community Settings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/msdanifernandez/status/1330962637731971073"&gt;Side sleepers with neck problems ONLY (pillow thread)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/s/story/six-years-with-a-distraction-free-iphone-8cf5eb4f97e3"&gt;Six Years With a Distraction-Free iPhone – Member Feature Stories – Medium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/coach-me-app/top-100-habits-to-track-in-2018-4940bf459d5"&gt;The 101 Best Habits to Track in 2018 – Coach.me App – Medium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mydomaine.com/best-indoor-plants-for-clean-air/slide7"&gt;The Best Indoor Plants to Clear the Air, Literally&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.independent.co.uk/life-style/fall-asleep-two-minutes-how-to-military-secret-trick-a8520991.html"&gt;The military secret to falling asleep in two minutes (The Independent)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@JohnLeFevre/the-only-new-years-resolutions-you-ll-ever-need-9246aa419263"&gt;The Only New Year’s Resolutions You’ll Ever Need – John LeFevre – Medium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://joshldavis.com/2013/05/20/the-path-to-dijkstras-handwriting/"&gt;The Path to Dijkstra’s Handwriting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://articles.mercola.com/sites/articles/archive/2011/08/16/dirty-little-secret-orange-juice-is-artificially-flavored-to-taste-like-oranges.aspx"&gt;The Shocking Truth About Freshly Squeezed Orange Juice&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.quora.com/How-does-it-feel-to-travel-alone"&gt;Travelling alone (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://english.emmaclit.com/2017/05/20/you-shouldve-asked/comment-page-9/"&gt;You should’ve asked | Emma&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.zerowastehome.com/"&gt;Zero Waste Home&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/lifestyle-bookmarks</guid></item><item><title>Graphics bookmarks</title><link>https://xenodium.com/graphics-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jnordberg.github.io/gif.js/"&gt;gif.js&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://philogb.github.io/jit/static/v20/Jit/Examples/Icicle/example2.html"&gt;Icicles&lt;/a&gt;: Data viz.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/valerybriz/status/1369449701641248769"&gt;inkpanther2 graphics or logo commissions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/cricut/comments/13b0qkg/list_of_best_websites_for_downloading_free_svgs/"&gt;List of best websites for downloading free SVGs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mbostock.github.io/protovis/"&gt;Protoviz&lt;/a&gt;: Data viz.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.inkscapeforum.com/viewtopic.php?f=22&amp;amp;t=13126"&gt;Svg animation info&lt;/a&gt;: Potentially useful for some ideas in mind.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/14804950/include-one-svg-inside-another"&gt;Svg within svg&lt;/a&gt;: Potentially useful for some ideas in mind.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/cricutcrafting/wiki/svg/"&gt;where to find svgs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/graphics-bookmarks</guid></item><item><title>Nexus Q bookmarks</title><link>https://xenodium.com/nexus-q-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://wiki.cyanogenmod.org/w/Install_CM_for_steelhead"&gt;How to Install CyanogenMod on the Google Nexus Q (&amp;quot;steelhead&amp;quot;)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nexusq.wikidot.com/troubleshooting"&gt;Nexus Q troubleshooting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://forum.xda-developers.com/showthread.php?t%3D2408799"&gt;Unlocking-&amp;gt;insecure boot-&amp;gt;root-&amp;gt;flash cm10 with amplifier support your Q without apk&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/nexus-q-bookmarks</guid></item><item><title>Golang bookmarks</title><link>https://xenodium.com/golang-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://spf13.com/presentation/7-common-mistakes-in-go-2015/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+spf13+%28Steve+Francia%27s+Blog%29"&gt;7 Common mistakes in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mingrammer/commonregex"&gt;A collection of common regular expressions for Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/avelino/awesome-go"&gt;A curated list of awesome Go packages&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/guardrailsio/awesome-golang-security"&gt;A curated list of awesome golang Security related resources&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iosexample.com/a-drawer-implement-on-swiftui/"&gt;A Drawer implement on SwiftUI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/montanaflynn/stats"&gt;A statistics package with common functions that are missing from the Golang standard library&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables"&gt;A whirlwind tour of Go’s runtime environment variables&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/shindakun/attempting-to-learn-go---now-sending-rest-requests-akp"&gt;Attempting to Learn Go - Now Sending GET/POST REST Requests&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/59100973/python-grpc-equivalent-of-golangs-perrpccredentials"&gt;authentication - python gRPC equivalent of golang's PerRPCCredentials&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jerf.org/iri/post/2945"&gt;Avoiding Reflection (And Such) In Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/iangudger/basicGoAPI"&gt;BasicGoAPI (ie. REST)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrislovecnm.com/golang/bazel/bazel-hello-world/"&gt;Bazel Golang Hello World (Kubernetes musings by chrislovecnm)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://beego.me/docs/intro/releases.md"&gt;Beego, platform for web apps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gobuffalo.io/"&gt;Buffalo &amp;amp; Rapid Web Development in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=eTjNtNnVOGY"&gt;Building a RESTful API in Go Using Only the Standard Library (Episode 1)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.wercker.com/2013/08/07/building-an-api-with-golang-rethinkdb-wercker.html"&gt;Building an API with Golang, RethinkDB and wercker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/codehakase/building-small-containers-for-kubernetes-290j"&gt;Building Small Containers for Kubernetes (golang http)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/elliotchance/c2go"&gt;c2go: A tool for transpiling C to Go.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://godoc.org/golang.org/x/tools/cmd/vet"&gt;Command vet (reports suspicious constructs)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kotancode.com/2015/09/10/complex-json-handling-in-go/"&gt;Complex json handling in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/adrianduke/configr"&gt;Configr: abstraction on top of configuration sources&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jen20.com/2015/02/06/configuring-emacs-for-go-part-1.html"&gt;Configuring emacs and evil mode for Go development (Part 1)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.scaledrone.com/blog/posts/creating-an-api-client-in-go"&gt;Creating an API Client in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dave.cheney.net/2015/08/22/cross-compilation-with-go-1-5"&gt;Cross compilation with Go 1.5&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://biasedbit.com/blog/golang-custom-transports/"&gt;Custom transports and timeouts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@deckarep/dancing-with-go-s-mutexes-92407ae927bf#.uixrkc790"&gt;Dancing with Go’s Mutexes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/better-programming/debug-go-like-a-pro-213d4d74e940"&gt;Debug Go Like a Pro - Better Programming - Medium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.gopheracademy.com/advent-2015/debugging-with-delve/"&gt;Debugging Go programs with Delve&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/elcct/defaultproject"&gt;defaultproject (REST/web starter)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.golang.org/defer-panic-and-recover"&gt;Defer, Panic, and Recover&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arenzana.org/2019/01/emacs-go-mode"&gt;Emacs Go Mode (Isma details his Emacs Golang setup)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://words.volant.is/articles/authentication-golang-web-applications/"&gt;End-user authentication for Go web applications&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://entgo.io/"&gt;ent · An entity framework for Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.golang.org/error-handling-and-go"&gt;Error handling in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.darrencoxall.com/golang/executing-commands-in-go/"&gt;Executing commands in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17765413"&gt;Exploring Error Handling Patterns in Go (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.matttproud.com/2015/02/exploring-gos-runtime-how-process.html"&gt;Exploring Go's runtime&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hackernoon.com/face-recognition-with-go-676a555b8a7e"&gt;Face recognition with Go – Hacker Noon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/valyala/fasthttp"&gt;fasthttp: Fast HTTP implementation for Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gorilla/mux"&gt;GitHub - gorilla/mux: A powerful URL router and dispatcher for golang.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/montanaflynn/stats"&gt;GitHub - montanaflynn/stats: A well tested and comprehensive Golang statistics library package with no dependencies.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ndabAP/vue-go-example"&gt;GitHub - ndabAP/vue-go-example: Vue.js and Go example project&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Nerzal/gocloak"&gt;GitHub - Nerzal/gocloak: golang keycloak client&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sethgrid/multibar"&gt;GitHub - sethgrid/multibar: Display multiple progress bars in Go (golang).&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://peter.bourgon.org/go-best-practices-2016/"&gt;Go best practices, six years in&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gobyexample.com/"&gt;Go by Example&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id%3D9399286"&gt;Go Challenge 3 HN comments&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang/go/wiki/CodeReviewComments"&gt;Go Code Review Comments&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gotalks.googleplex.com/codelab/flag.article"&gt;Go command Line Flags&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.golang.org/pipelines"&gt;Go Concurrency Patterns: Pipelines and cancellation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grpc/grpc-go/tree/master/examples/features/authentication"&gt;Go grpc authentication&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://timr.co/go-interfaces-the-tricky-parts"&gt;Go interfaces, the tricky parts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/otium/ytdl"&gt;Go library for downloading YouTube videos&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alecthomas/gometalinter"&gt;Go Meta Linter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gregosuri.com/2015/12/04/go-proverbs-illustrated/"&gt;Go Proverbs Illustrated&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jpalardy.com/posts/go-slice-gotcha/"&gt;Go Slice Gotcha&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://gohugo.io/templates/go-templates"&gt;Go Template Primer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://golang.rakyll.org/go-tool-flags/"&gt;Go tooling essentials (useful flags in tooling)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=uBjoTxosSys"&gt;Go Tooling in Action - YouTube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/go-walkthrough/go-walkthrough-encoding-json-package-9681d1d37a8f#.9rix3aqzg"&gt;Go Walkthrough: encoding/json package&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/go-walkthrough/go-walkthrough-fmt-55a14bbbfc53#.egmp9nwqv"&gt;Go Walkthrough: fmt (formatting strings)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@matzhouse/go-grpc-and-docker-c1fb2ec8e9f0"&gt;Go, gRPC and Docker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://go-bootstrap.io/"&gt;go-bootstrap to generate a lean and mean Go web project&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@dgryski/go-fuzz-github-com-arolek-ase-3c74d5a3150c#.5ybv38lzm"&gt;go-fuzz github.com/arolek/ase tutorial&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cathalgarvey/go-minilock"&gt;Go-miniLock: The Minilock File Encryption System, Ported to Pure Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;go-rename.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emicklei/go-restful"&gt;Go-restful&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jroimartin/gocui/blob/master/README.md"&gt;GOCUI - Go Console User Interface&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://goji.io/"&gt;Goji: A web microframework for Golang&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/luciotato/golang-notes/blob/master/OOP.md"&gt;Golang concepts from an OOP point of view&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=12522652"&gt;Golang landmines&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://golangtoolbox.com/"&gt;Golang toolbox (high quality Go packages)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://xahlee.info/golang/golang_index.html"&gt;Golang Tutorial (Xah Lee's)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://davidsbond.github.io/2019/06/14/creating-grpc-interceptors-in-go.html"&gt;Golang: Creating gRPC interceptors (David Bond)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://xahlee.info/golang/golang_rune.html"&gt;Golang: Rune&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PL2ntRZ1ySWBf-_z-gHCOR2N156Nw930Hm"&gt;GopherCon 2015 videos&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=5v2fqm_8jYI"&gt;GopherCon 2016: Jack Lindamood - Practical Advice for Go Library Authors (YouTube)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=5v2fqm_8jYI"&gt;GopherCon 2016: Jack Lindamood - Practical Advice for Go Library Authors&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://about.sourcegraph.com/go/gophercon-2018-how-to-write-a-parser-in-go/"&gt;GopherCon 2018 - How to Write a Parser in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gopherjs/gopherjs"&gt;Gopherjs: A compiler from Go to JavaScript&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/visualfc/goqt"&gt;GoQt: golang Qt bindings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;gorepl-mode.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/securego/gosec"&gt;gosec - Golang Security Checker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=21603483"&gt;Go’s Features of Last Resort | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eli.thegreenplace.net/2020/graceful-shutdown-of-a-tcp-server-in-go/"&gt;Graceful shutdown of a TCP server in Go - Eli Bendersky's website&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/levigross/grequests"&gt;GRequests: A Go &amp;quot;clone&amp;quot; of the great and famous Requests library&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grpc.io/docs/guides/auth/"&gt;gRPC authentication documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/apps/guardrails"&gt;GuardRails is a GitHub app that provides security feedback in your pull requests&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.alexedwards.net/blog/how-to-hash-and-verify-passwords-with-argon2-in-go"&gt;How to Hash and Verify Passwords With Argon2 in Go - Alex Edwards&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=17061713"&gt;How to start a Go project in 2018 | Hacker News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://golang.org/doc/code.html"&gt;How to Write Go Code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/pantomath/how-we-use-grpc-to-build-a-client-server-system-in-go-dd20045fa1c2"&gt;How we use gRPC to build a client/server system in Go (auth and TLS included)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gohugo.io/"&gt;HUGO: a static website engine in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nathanleclaire.com/blog/2015/10/10/interfaces-and-composition-for-effective-unit-testing-in-golang/"&gt;Interfaces and Composition for Effective Unit Testing in Golang&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kubernetes/kubernetes/blob/master/Godeps/Godeps.json"&gt;Kubernetes godeps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html"&gt;Less is exponentially more (Rob Pike's Go reasoning)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lets-go.alexedwards.net/"&gt;Let's Go! Learn to Build Professional Web Applications With Golang&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dave.cheney.net/2015/11/05/lets-talk-about-logging"&gt;Let's talk about logging&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.alexedwards.net/blog/making-and-using-middleware"&gt;Making and Using HTTP Middleware in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alexflint/go-restructure"&gt;Match regular expressions into struct fields&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bouk.co/blog/monkey-patching-in-go/"&gt;Monkey Patching in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/golang/go/wiki/PanicAndRecover"&gt;PanicAndRecover&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://maciekmm.net/html-golang-stream-processing/"&gt;Parsing HTML with Go using stream processing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sohamkamani.com/blog/2018/02/25/golang-password-authentication-and-storage/"&gt;Password authentication and storage in Go (Golang)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com/Peaceful-Parent-Happy-Kids-Connecting/dp/0399160280/"&gt;Peaceful Parent, Happy Kids: How to Stop Yelling and Start Connecting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://peter.bourgon.org/go-best-practices-2016/"&gt;Peter Bourgon · Go best practices, six years in&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=19218097"&gt;Practical Go: Real-world advice for writing maintainable Go programs (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bradfitz/exp-httpclient/blob/master/problems.md"&gt;Problems with Go net/http Client API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/m3ng9i/ran"&gt;Ran: a simple static web server written in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.gopheracademy.com/advent-2015/reducing-boilerplate-with-go-generate/"&gt;Reducing boilerplate with go generate&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://research.swtch.com/interfaces"&gt;research!rsc: Go Data Structures: Interfaces&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?feature=youtu.be"&gt;RESTful Web API Basics in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.linkedin.com/pulse/restful-webservice-using-golang-sqlite-uttam-gandhi"&gt;Restful webservice using golang with sqlite&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://revel.github.io/"&gt;Revel:&lt;/a&gt; A high-productivity web framework for the Go language.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bazelbuild/rules_go/blob/master/go/core.rst#go_binary"&gt;rules_go/core.rst at master · bazelbuild/rules_go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://golang.org/pkg/runtime/pprof/"&gt;runtime.pprof for profiling&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitbucket.org/seanerussell/sashay"&gt;Sashay Go codegen&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://syslog.ravelin.com/making-something-faster-56dd6b772b83"&gt;Seven steps to 100x faster Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grpc/grpc-go/issues/106"&gt;Simple password authentication example · Issue #106 · grpc/grpc-go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dghubble/sling"&gt;Sling: Go REST client library for creating and sending API requests&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://machiel.me/using-tags-in-go/"&gt;Small introduction to tags in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=13213902"&gt;So you want to expose Go on the Internet (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cockroachlabs.com/blog/rounding-implementations-in-go/"&gt;Survey of Rounding Implementations in Go | Cockroach Labs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yvasiyarov/swagger"&gt;Swagger Go documentation generator&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id%3D9716964"&gt;Ten useful techniques in Go (HN comments)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arslan.io/ten-useful-techniques-in-go"&gt;Ten useful techniques in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gizak/termui"&gt;termui, Go terminal dashboard&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dannypsnl/testing-in-go-35ei"&gt;Testing in Go - DEV Community&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sourcegraph.com/blog/live/gopherconindia/112025389257"&gt;The 5 stages of learning Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dave.cheney.net/2014/03/25/the-empty-struct"&gt;The empty struct (Dave Cheney)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://golangcookbook.com/"&gt;The Go Cookbook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://go-talks.appspot.com/github.com/ChrisHines/talks/structured-logging/structured-logging.slide#1"&gt;The Hunt for a Logger Interface&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dave.cheney.net/2017/04/29/there-is-no-pass-by-reference-in-go"&gt;There is no pass-by-reference in Go | Dave Cheney&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://openmymind.net/Things-I-Wish-Someone-Had-Told-Me-About-Go/"&gt;Things I wish someone told me about Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scripter.co/time-formatting-in-go/"&gt;Time formatting in Go ❚ A Scripter's Notes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=21225401"&gt;Uber Go Style Guide (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://divan.github.io/posts/go_concurrency_visualize/"&gt;Visualizing Concurrency in Go&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://groups.google.com/forum/#!msg/golang-nuts/R7ryo7RdBPY/t7XFNGyRDQAJ"&gt;What's So Bad About Stdlib's Log Package? (Groups discussion)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=YmbbmyxSlcg"&gt;Writing Unit Tests for your net/http Handlers&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/golang-bookmarks</guid></item><item><title>GitHub bookmarks</title><link>https://xenodium.com/github-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://help.github.com/articles/adding-a-cname-file-to-your-repository/"&gt;Adding a CNAME file to your repository&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.github.com/articles/tips-for-configuring-a-cname-record-with-your-dns-provider/"&gt;Tips for configuring a CNAME record with your DNS provider&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.github.com/categories/github-pages-basics/"&gt;Github pages basics&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/23375422/how-to-setup-github-pages-to-redirect-dns-requests-from-subdomain-e-g-www-to"&gt;SO DNS response&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/github-bookmarks</guid></item><item><title>Courses bookmarks</title><link>https://xenodium.com/courses-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.chesscademy.com"&gt;Chessacademy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lagunita.stanford.edu/courses/Engineering/Compilers/Fall2014/about"&gt;Compilers (Stanford Lagunita)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://egghead.io/technologies/angular2"&gt;Egghead.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gravitycircuscentre.com/"&gt;Gravity Circus Centre&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://idler.co.uk/shop/live-courses/"&gt;Idler courses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.coursera.org/learn/learning-how-to-learn?ranMID=40328&amp;amp;ranEAID=4246lDpjhco&amp;amp;ranSiteID=4246lDpjhco-7V8Bq5eW0eb.NabcjrH6FA&amp;amp;siteID=4246lDpjhco-7V8Bq5eW0eb.NabcjrH6FA&amp;amp;utm_content=10&amp;amp;utm_medium=partners&amp;amp;utm_source=linkshare&amp;amp;utm_campaign=4246lDpjhco"&gt;Learning How to Learn: Powerful mental tools to help you master tough subjects (Coursera)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lingua.ly/"&gt;lingua.ly&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.coursera.org/learn/the-science-of-well-being"&gt;The Science of Well-Being (Coursera)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tutsplus.com/"&gt;Tuts+ courses&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/courses-bookmarks</guid></item><item><title>Apple Watch bookmarks</title><link>https://xenodium.com/apple-watch-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://lionet.livejournal.com/137350.html"&gt;Swift, Apple Watch, and Dynamic Graphs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Fri, 06 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/apple-watch-bookmarks</guid></item><item><title>A-Z List of  Software Product Epiphanies Everyone has Every other Second</title><link>https://honestmusings.wordpress.com/2015/03/05/a-z-list-of-software-product-epiphaniesideas-everyone-has-every-other-second/</link><description>You know how we like to stay away from shallow, simplified criticism of ideas, but then in our lowest moments, we descend to it anyways? Well, this is me, descending. Not my first time. So let&amp;#8217;s take software products/ideas as a non-specific-random example: a) App X doesn&amp;#8217;t have minuscule feature Y. But they are fools! Fools! &amp;#8230; &lt;a class="more-link" href="https://honestmusings.wordpress.com/2015/03/05/a-z-list-of-software-product-epiphaniesideas-everyone-has-every-other-second/"&gt;Continue reading &lt;span class="screen-reader-text"&gt;A-Z List of  Software Product Epiphanies Everyone has Every other&amp;#160;Second&lt;/span&gt;&lt;/a&gt;</description><author>Honest Musings</author><pubDate>Thu, 05 Mar 2015 22:23:21 GMT</pubDate><guid isPermaLink="true">https://honestmusings.wordpress.com/2015/03/05/a-z-list-of-software-product-epiphaniesideas-everyone-has-every-other-second/</guid></item><item><title>Using Chromebook for node.js development</title><link>https://danielpecos.com/2015/03/05/using-chromebook-for-node-js-development/</link><description>&lt;p&gt;Every single working day I spend between 2 and 2.5 hours in a train. And I feel pretty lucky about this, mostly because is one single train, no need to pay attention for switch overs or other kind of public transports, and that allows me to invest that time in whatever task I want: podcasts, videos, blogging or even programming. And that&amp;rsquo;s what I want this post to focus in, because there are plenty of posts that explain how to use a Chromebook for day-to-day tasks (even being offline) but not that many that talk about programming in node.js using a Chromebook.&lt;/p&gt;
&lt;p&gt;There are two main challenges we have to figure out when using a Chromebook (CB) for usual programming tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connectivity&lt;/li&gt;
&lt;li&gt;A proper development environment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Connectivity&lt;/em&gt; is a big issue because, despite of there are quite a few web IDEs or even environments that expose a whole virtual machine, they often require a connection in order to work.&lt;/p&gt;
&lt;p&gt;On the other hand, as a developer I want to use the best tools possible in order to achieve my goals, &lt;em&gt;a proper development environment&lt;/em&gt;, and that for me means having:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A linux shell&lt;/li&gt;
&lt;li&gt;tmux (not a must, but really nice to have)&lt;/li&gt;
&lt;li&gt;vim&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;node.js virtual machine (managed with nvm if possible)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It turns out that CB really suck in this point, so my idea when I bought this platform was to create a tiny partition and install a Linux OS there with all this requirements. But I was surprised when I heard about &lt;strong&gt;crouton&lt;/strong&gt;: this amazing tool creates chroot environments within the very ChromeOS (which is a Linux underneath), where you can do whatever (well, almost) you want. All you need is root access (&lt;em&gt;Developer mode&lt;/em&gt; in ChromeOS jargon) and some free space (but really not that much).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not going to explain how to get this chroot environment up and running. There are plenty of posts and tutorials that explain this process. Just a quick spoiler: it&amp;rsquo;s super easy and takes no more than 15 minutes.&lt;/p&gt;
&lt;p&gt;Once you have a chroot with at least crouton cli-extra, getting the rest of the tools up and ready is easy peasy. Use apt-get install to get tmux, vim and git, download nvm and fetch latest node.js binary. Integrate all of this into your bash scripts, so you don&amp;rsquo;t need to setup nvm with every login and you&amp;rsquo;re good to go.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt; self-promotion &amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Last but not least, setup your config files for vim, git, ssh, bash… or use one handy opensource tool (developed in node.js using a ChromeBook) call &lt;strong&gt;dotback&lt;/strong&gt;. Just install it using npm:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install -g dotback
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And setup your configuration definition file.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dotback --action install
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Or if you already have done that and it&amp;rsquo;s available through a git repository, fetch it using:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dotback --action init REPO_URL
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Takes a little bit to tune, but once it&amp;rsquo;s done, you&amp;rsquo;ll see the effort was worth of it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt; / self-promotion &amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s how I got a really portable box, with enough power for node.js development, and really really light, which is good if you have to carry it with you almost all the time 🙂&lt;/p&gt;
&lt;p&gt;I hope you liked my Chromebook &amp;amp; Node.js feedback and that it helped you to decide if you&amp;rsquo;re thinking about getting a Chromebook or not, and as I was, were worried about being able to use it as a developer environment.&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Thu, 05 Mar 2015 16:54:50 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2015/03/05/using-chromebook-for-node-js-development/</guid></item><item><title>YouTube subscriptions via RSS</title><link>https://cmetcalfe.ca/blog/youtube-subscriptions-via-rss.html</link><description>&lt;p&gt;The &lt;a href="https://support.google.com/youtube/answer/4489286"&gt;subscription feature&lt;/a&gt; on &lt;a href="https://www.youtube.com"&gt;Youtube&lt;/a&gt; allows you to keep up to date with content
that people upload to the site.&lt;/p&gt;
&lt;p&gt;Since I use an RSS reader for every other blog or site that I follow, why not do
the same for YouTube subscriptions?&lt;/p&gt;
&lt;div class="admonition update"&gt;
&lt;p class="admonition-title"&gt;Update&lt;/p&gt;
&lt;p&gt;This method no longer works. The YouTube v2 API (which is &lt;a href="https://developers.google.com/youtube/2.0/reference#Subscriptions_Feed"&gt;what this method
was using&lt;/a&gt;) was &lt;a href="http://youtube-eng.blogspot.ca/2014/03/committing-to-youtube-data-api-v3_4.html"&gt;retired on April 20th, 2015&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To work around this, each channel must be subscribed to separately. See the
RSS reader section on &lt;a href="https://support.google.com/youtube/answer/6098135"&gt;this support page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The feed for anyone's subscribed videos is at the URL:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;http://gdata.youtube.com/feeds/base/users/&amp;lt;userID&amp;gt;/newsubscriptionvideos
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Where &lt;code&gt;&amp;lt;userID&amp;gt;&lt;/code&gt; is either your YouTube account name or the long string of
letters and numbers that can be found on the &lt;a href="https://www.youtube.com/account_advanced"&gt;YouTube advanced settings page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Try it out, it makes watching episodic content a breeze!&lt;/p&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Warning&lt;/p&gt;
&lt;p&gt;You'll have to have "Keep all my subscriptions private" unchecked on the
&lt;a href="https://www.youtube.com/account_privacy"&gt;YouTube privacy settings page&lt;/a&gt; for this to work.&lt;/p&gt;
&lt;p&gt;This will allow anyone to access the RSS feed of your subscriptions at the
url above.&lt;/p&gt;
&lt;/div&gt;</description><author>Carey Metcalfe</author><pubDate>Thu, 05 Mar 2015 03:00:00 GMT</pubDate><guid isPermaLink="true">https://cmetcalfe.ca/blog/youtube-subscriptions-via-rss.html</guid></item><item><title>Reload inputrc</title><link>https://xenodium.com/reload-inputrc</link><description>&lt;p&gt;Reload .iputrc from bash prompt: C-x C-r. &lt;a href="http://www.gnu.org/software/bash/manual/bashref.html#Miscellaneous-Commands"&gt;More at bashref manual&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 05 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/reload-inputrc</guid></item><item><title>Learning Emacs lisp</title><link>https://xenodium.com/learning-emacs-lisp</link><description>&lt;ul&gt;
&lt;li&gt;Use nreverse and nconc to operate on lists in-place.&lt;/li&gt;
&lt;li&gt;Set buffer local variables:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(setq-local my-clever-var)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Execute before saving buffer:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(add-hook 'write-file-hooks
          (lambda ()
            (message &amp;quot;about to save!&amp;quot;)))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Possibly use to start processes and send file content:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(make-comint NAME PROGRAM &amp;amp;optional STARTFILE &amp;amp;rest SWITCHES)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Creating markers:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(setq my-marker (copy-marker (point)))
  #&amp;lt;marker at 10251 in *ielm*&amp;gt;

(marker-buffer my-marker)
  #&amp;lt;buffer *ielm*&amp;gt;

(marker-position my-marker)
  10251 (#o24013, #x280b, ?⠋)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Get org heading at point:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(org-get-heading 'no-tags 'no-todo)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Remove string text properties. From manual:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;(substring-no-properties STRING &amp;amp;optional FROM TO)&lt;/p&gt;
&lt;p&gt;Return a substring of STRING, without text properties. It starts at index FROM and ends before TO. TO may be nil or omitted; then the substring runs to the end of STRING. If FROM is nil or omitted, the substring starts at the beginning of STRING. If FROM or TO is negative, it counts from the end.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Skip org entry metadata/drawers:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(org-end-of-meta-data-and-drawers)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Random access to org entry using id (or CUSTOM_ID):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(org-open-link-from-string &amp;quot;[[#%exciting-custom-id]]&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;From &lt;a href="http://endlessparentheses.com/debugging-emacs-lisp-part-1-earn-your-independence.html"&gt;Debugging Elisp Part 1: Earn your independence&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Go to where the function is defined.&lt;/li&gt;
&lt;li&gt;Press C-u C-M-x. Edebug breakpoint for function.&lt;/li&gt;
&lt;li&gt;Invoke function in question.&lt;/li&gt;
&lt;li&gt;n/c will get you around.&lt;/li&gt;
&lt;li&gt;q when done.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Pretty printing objects:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(let ((my-var (list &amp;quot;val1&amp;quot;
                    &amp;quot;val2&amp;quot;
                    &amp;quot;val3&amp;quot;)))
  (pp-to-string my-var))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Search and/or replace in curent buffer:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(re-search-forward &amp;quot;needle&amp;quot;
                   nil t)
(match-beginning 0) ;; Start location of match from last search.
(match-end 0) ;; End location of match from last search.
(replace-match &amp;quot;love&amp;quot;)

;; needle-in-haystack
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Restrict buffer editing to a region:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(narrow-to-region (point)
                  (point-max))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Restore restriction:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(save-restriction (narrow-to-region (point)
                                    (point-max))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Restore point, mark, and current buffer:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(save-excursion (goto-char (point-max))
                (insert &amp;quot;Hello elisp.&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Concatenating strings:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(concat &amp;quot;Hello &amp;quot; &amp;quot;elisp &amp;quot; &amp;quot;world.&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Grabbing thing at point:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(thing-at-point 'word)
(thing-at-point 'symbol)
(thing-at-point 'line)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Unit test with ert.&lt;/li&gt;
&lt;li&gt;Basic iteration with dolist:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(dolist (v '(&amp;quot;a&amp;quot; &amp;quot;b&amp;quot; &amp;quot;c&amp;quot;))
  (print v))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Output to other buffer:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(with-current-buffer (get-buffer-create &amp;quot;*some buffer*&amp;quot;)
  (princ '(some list to print)
         (current-buffer)))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;For a temporary buffer, use with-temp-buffer:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(with-temp-buffer
  (insert &amp;quot;abc&amp;quot;)
  (point))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Cons cells &lt;a href="http://emacslife.com/read-lisp-tweak-emacs/beginner-2-understand-emacs-lisp.html#sec-4-4"&gt;bookmark&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check for substring:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(string-match-p REGEXP STRING &amp;amp;optional START)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Matching substrings and accessing groups:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(setq haystack &amp;quot;Always click [[http://reddit.com/r/emacs][here]].&amp;quot;)
(setq needle-re &amp;quot;\\[\\[\\(.*\\)]\\[\\(.*\\)]]&amp;quot;)
  &amp;quot;\\[\\[\\(.*\\)]\\[\\(.*\\)]]&amp;quot;

(string-match needle-re haystack)
  13 (#o15, #xd, ?\C-m)

(match-string 0 haystack)
  &amp;quot;[[http://reddit.com/r/emacs][here]]&amp;quot;

(match-string 1 haystack)
  &amp;quot;http://reddit.com/r/emacs&amp;quot;

(match-string 2 haystack)
  &amp;quot;here&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Return argument unchanged (noop):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(identity ARG)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Org insert today's timestamp&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(org-insert-time-stamp (current-time))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ergoemacs.org/emacs/elisp_determine_OS_version.html"&gt;OS version in .emacs&lt;/a&gt;: Determine OS in emacs lisp.&lt;/li&gt;
&lt;li&gt;First element&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(car LIST)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;All but first element&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(cdr LIST)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Add NEWELT to front of PLACE&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(push NEWELT PLACE)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Invoke 'FUNCTION for each in SEQUENCE&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(mapcar FUNCTION SEQUENCE)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Search/replace&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-{.commonlisp"&gt;(while (search-forward &amp;quot;Hello&amp;quot;)
  (replace-match &amp;quot;Bonjour&amp;quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Save to kill ring = copy.&lt;/li&gt;
&lt;li&gt;Point = cursor position.&lt;/li&gt;
&lt;li&gt;Mark = a buffer position.&lt;/li&gt;
&lt;li&gt;Kill = cut text.&lt;/li&gt;
&lt;li&gt;Yank = paste.&lt;/li&gt;
&lt;li&gt;Buffer:File = 1:1.&lt;/li&gt;
&lt;li&gt;Window:Buffer = 1:1.&lt;/li&gt;
&lt;li&gt;Frame:Window = 1:many.&lt;/li&gt;
&lt;li&gt;Font lock = syntax highlighting.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 05 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/learning-emacs-lisp</guid></item><item><title>iOS bookmarks</title><link>https://xenodium.com/ios-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/ios-apprentice/11-insanely-great-ios-developers-sites-95686a523ea8"&gt;11 Insanely Great iOS Developers Sites&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/flawless-app-stories/30-great-ui-kits-for-ios-engineers-41b2732896b9"&gt;30 great UI Kits for iOS engineers – Flawless App Stories – Medium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/iosphere/ISHHoverBar"&gt;A floating UIToolBar replacement as seen in the iOS 10 Maps app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://phonegap-tips.com/articles/debugging-ios-phonegap-apps-with-safaris-web-inspector.html"&gt;Access mobile Safari via web inspector&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/DocumentPickerProgrammingGuide/AccessingDocuments/AccessingDocuments.html"&gt;Accessing Documents/Files (iOS)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/technotes/tn2259/_index.html"&gt;Adding in-app purchase&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://furbo.org/2015/05/11/an-import-ant-change-in-xcode/"&gt;An @import-ant Change in Xcode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/mapkit/mkgeojsondecoder"&gt;An object that decodes GeoJSON objects into MapKit types&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/imageio/3333271-cganimateimageaturlwithblock"&gt;Animated Gifs with CGAnimateImageAtURLWithBlock&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/AppID.html"&gt;App IDs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devimages.apple.com.edgekey.net/app-store/review/guidelines/App-Review-Guidelines-The-Comic-Book.pdf"&gt;App review guidelines (comic book)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/Introduction/Introduction.html#//apple_ref/doc/uid/TP40010810-CH1-SW1"&gt;Apple docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282-BCIGIJJF"&gt;Apple's coding guidelines for Cocoa&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.html#//apple_ref/doc/uid/TP40010810-CH6-SW3"&gt;Apple's Concepts in Objective-C programming&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/userexperience/Conceptual/MobileHIG/index.html#//apple_ref/doc/uid/TP40006556"&gt;Apple's mogile HIG guidelines&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/samplecode/PhotoScroller/Introduction/Intro.html"&gt;Apple's PhotoScroller&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/AttributedStrings/AttributedStrings.pdf"&gt;Attributed String Programming Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.knowstack.com/autolayout-visual-format-language-objective-c-sample-code/"&gt;Autolayout Visual Format Language – Objective C Sample Code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/prerelease/ios//documentation/AVFoundation/Reference/AVCaptureSession_Class/index.html"&gt;AVCaptureSession&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVCaptureVideoPreviewLayer_Class/index.html"&gt;AVCaptureVideoPreviewLayer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.raywenderlich.com/22167/beginning-core-image-in-ios-6"&gt;Beginning Core Image in iOS 6&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/TestingYouriOSApp/TestingYouriOSApp.html#//apple_ref/doc/uid/TP40012582-CH8-SW1"&gt;Beta testing your app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.objc.io/issues/23-video/capturing-video/"&gt;Capturing video on iOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/steventroughtonsmith/cartool"&gt;Cartool (Inspect car files)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/clayallsopp/CLAFluxDispatcher"&gt;CLAFluxDispatcher: A port of Facebook's Flux Dispatcher to Objective-C&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://clang.llvm.org/docs/Block-ABI-Apple.html"&gt;Clang 3.7 documentation BLOCK IMPLEMENTATION SPECIFICATION&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/luisobo/clean-architecture"&gt;Clean architecture for iOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cocoacontrols.com/"&gt;Cocoa controls&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cocoadocs.org/"&gt;Cocoadocs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.objc.io/issue-6/cocoapods-under-the-hood.html"&gt;Cocoapods under the hood&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cocoapods.org/"&gt;Cocoapods&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://codepilot.cc"&gt;Code pilot&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.codeschool.com/paths/ios"&gt;Code School iOS courses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.codeschool.com/learn/ios"&gt;Codeschool iOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Color_difference"&gt;Color difference&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://componentkit.org/"&gt;ComponentKit is an Objective-C++ view framework for iOS that is heavily inspired by React&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://componentkit.org/"&gt;ComponentKit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ethanhuang13/NSAttributedStringBuilder"&gt;Composing NSAttributedString with SwiftUI-style syntax&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/foundation/nsdata/3174960-compressed"&gt;Compressing data with Foundation APIs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cakesolutions.net/teamblogs/2014/03/08/cmsamplebufferref-from-cgimageref"&gt;Create a CMSampleBufferRef from CGImageRef&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Chapters/CreatingiTunesConnectRecord.html"&gt;Creating iTunes Connect Record&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/css-layout"&gt;css-layout: Facebook's layout transpiled to C, Java and C#&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/security/password_autofill/customizing_password_autofill_rules"&gt;Customizing Password AutoFill Rules&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.davemark.com/?p=1829"&gt;DaveLots of iOS resources&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://itunes.apple.com/gb/course/developing-ios-7-apps-for/id733644550"&gt;Developing iOS 7 Apps for iPhone and iPad (Standford lectures)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/UsingTextClasses/UsingTextClasses.html"&gt;Displaying Text Content in iOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cocoapods.org/pods/DJKFlipper"&gt;DJKFlipper&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.effectiveobjectivec.com/"&gt;Effective Objective-C&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/j796160836/everything-about-bluetooth-40-central"&gt;Everything about bluetooth central (slideshare)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://spin.atomicobject.com/2016/01/25/ios-memory-leak-xcode/#.VqaGcF_w1AE.hackernews"&gt;Finding iOS memory leaks with Xcode's Instruments&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/sergeyzenchenko/flux-for-ios"&gt;Flux for iOS by Sergey Zenchenko&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/techery/FLUX"&gt;FLUX implementation in Objective-C&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mattt/FormatterKit"&gt;FormatterKit: a collection of well-crafted NSFormatter subclasses for things like units of information, distance, and relative time intervals&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.objc.io/issue-5/getting-to-know-textkit.html"&gt;Getting to know TextKit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kairadiagne.com/2019/04/27/getting-up-to-speed-with-uicollectionviewlayout.html"&gt;Getting up to speed with UICollectionView layouts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://giorgiocalderolla.com/blog.html"&gt;Giorgio Calderolla&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/WeTransfer/WeScan"&gt;GitHub - WeTransfer/WeScan: Document Scanning Made Easy for iOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.emdentec.com/blog/2014/2/25/hacking-uinavigationbar"&gt;Hacking UINavigationBar&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realm.io/news/altconf-conrad-kramer-writing-iOS-sdk/"&gt;How (Not) to Write an iOS SDK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://goshdarnblocksyntax.com/"&gt;How do I declare a block in Objcetive-C?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackingwithswift.com/example-code/uikit/how-to-detect-dark-mode-in-ios"&gt;How to detect dark mode in iOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.appcoda.com/files-app-integration/"&gt;How to Integrate Your App with Files App in iOS 11 | Swift Tutorial&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://easynativeextensions.com/how-to-launch-your-app-from-the-ios-8-share-menu/"&gt;How to launch your app from the iOS 8 Share Menu – updated for iOS 8.4&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/flawless-app-stories/how-to-make-auto-layout-more-convenient-in-ios-df3b42fed37f"&gt;How to make Auto Layout more convenient in iOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://levibostian.com/blog/create-cocoapod/"&gt;I created my first CocoaPods library!&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/IconMatrix.html"&gt;Icon Matrix&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.raywenderlich.com/69855/image-processing-in-ios-part-1-raw-bitmap-modification"&gt;Image Processing in iOS Part 1: Raw Bitmap Modification&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.raywenderlich.com/71151/image-processing-ios-part-2-core-graphics-core-image-gpuimage"&gt;Image Processing in iOS Part 2: Core Graphics, Core Image, and GPUImage&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nshipster.com/image-resizing/"&gt;Image resizing techniques&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/indragiek/INDANCSClient"&gt;INDANCSClient: Objective-C Apple Notification Center Service Implementation (Bluetooth LE)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/TP40009249-SW10"&gt;Info PList key reference&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://injectionforxcode.com"&gt;Injection for Xcode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cocoawithlove.com/blog/introducing-cwlviews.html"&gt;Introducing CwlViews&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.colourphil.co.uk/lab_lch_colour_space.shtml"&gt;Introduction to color spaces&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/videos/play/wwdc2016/413"&gt;Introduction to Xcode (Apple WWDC 2016)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/40904676/how-to-merge-two-video-with-transparency"&gt;ios - how to merge two video with transparency - Stack Overflow&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://puzzles.design/"&gt;iOS 10 UI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.safaribooksonline.com/library/view/ios-6-programming/9781449342746/ch03s03.html"&gt;iOS 6 Programming Cookbook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://shop.oreilly.com/product/0636920044338.do"&gt;iOS 9 programming cookbook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/ios-apprentice/the-valuable-toolset-for-ios-development-ba312d12577d"&gt;iOS Apprentice&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iosdev.tools/"&gt;iOS Dev Tools&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ios.devtools.me"&gt;iOS Dev Tools&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://iosdevweekly.com"&gt;iOS dev weekly&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.appcoda.com/ios-programming-101-send-email-iphone-app/"&gt;iOS Programming 101: How To Send Email in Your iPhone App&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bignerdranch.com/we-write/ios-programming.html"&gt;iOS Programming&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bignerdranch.com/we-write/ios-programming/"&gt;iOS Programming: The Big Nerd Ranch Guide (4th Edition)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bignerdranch.com/we-write/ios-programming/"&gt;iOS Programming: The Big Nerd Ranch Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/stanislaw/iOS-Projects-Catalogue"&gt;iOS projects catalogues&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.html"&gt;iOS ScrollView Example with Paging&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.apple.com/business/site/docs/iOS_Security_Guide.pdf"&gt;iOS Security&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/phonegap/ios-deploy"&gt;ios-deploy: Install and debug iOS apps without using Xcode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ios-goodies.com"&gt;ios-goodies.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://iosdevtips.co"&gt;iosdevtips.co&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boredzo/iso-8601-date-formatter"&gt;iso-8601-date-formatter: A Cocoa NSFormatter subclass converting to and from ISO-8601-formatted strings &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jessedc/JCTiledScrollView"&gt;JCTiledScrollView&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://joppar.com/mobile-app-development-resources-guide/"&gt;joppar.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/krzysztofzablocki/KZFileWatchers"&gt;KZFileWatchers (observer file changes)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Lab_color_space"&gt;Lab color space&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JiriTrecak/Laurine"&gt;Laurine: Localization code generator&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingProfiles/MaintainingProfiles.html"&gt;Maintaining profiles&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://khanlou.com/2016/02/many-controllers/"&gt;Many Controllers Make Light Work (Analytics)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://iphone.meer.li/designs/featured?page=3"&gt;Meerli&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mikeash.com/book.html"&gt;Mike Ash&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sarunw.com/posts/modality-changes-in-ios13/"&gt;Modality changes in iOS13 | Sarun&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/2359media/ios-dev-guide/blob/master/iOS%20Topics%20and%20References.md"&gt;More aggregation of awesomeness on github&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/muccy/MUKContentRedux"&gt;MUKContentRedux: provides a store for immutable data which can be updated only applying actions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nshipster.com/xcode-plugins/"&gt;NSHipster's Xcode plugins post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.hpique.com/2013/12/nsnotificationcenter-part-2/"&gt;NSNotificationCenter part 2: Implementing the observer pattern with notifications&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nsscreencast.com/episodes"&gt;NSScreencasts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/objc-zen/objc-zen-book"&gt;Objc-C Zen book&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.objc.io/"&gt;Objc.io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://oclint.org/"&gt;Objective-C linter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Objective-C-Programming-Ranch-Guide-Guides/dp/032194206X"&gt;Objective-C Programming: The Big Nerd Ranch Guide (Big Nerd Ranch Guides)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.osstatus.com/?utm_campaign=iOS%2BDev%2BWeekly&amp;amp;utm_medium=email&amp;amp;utm_source=iOS_Dev_Weekly_Issue_201"&gt;OSStatus: Lookup Apple API errors fast&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.paintcodeapp.com/"&gt;PaintCode - Turn your drawings into Objective-C or Swift drawing code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://phatblat.com/2016/05/10/uisearchcontroller.html"&gt;phatblat's post on UISearchController&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches"&gt;Preserving Your App's UI Across Launches | Apple Developer Documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sugartin.info/2011/10/13/sending-a-mail-useing-gmail/"&gt;Programatically send an email using CFNetwork and GMail&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mattneub/Programming-iOS-Book-Examples"&gt;Programming iOS Book examples&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tanaschita.com/posts/20191015-quick-guide-on-supporting-dark-mode-on-ios/"&gt;Quick guide on supporting Dark Mode on iOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.raywenderlich.com/tutorials"&gt;Ray Wendelich&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realm.io/addons/"&gt;realm (mobile database), plus map view, search list view, and grid view&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@alexdunn/replace-xcode-with-neovim-c81f89a50a23"&gt;Replace Xcode with Neovim&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ReSwift/ReSwift"&gt;ReSwift Redux-like implementation of the unidirectional data flow architecture in Swift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://revealapp.com"&gt;Reveal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rypress.com/tutorials/objective-c/functions"&gt;Ry’s Objective-C Tutorial: Functions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nalexn.github.io/save-your-next-app/"&gt;Save your next app from rebuilding from scratch - Alexey Naumov&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.alltheflow.com/scrollable-uistackview/"&gt;Scrollable UIStackView&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.frozenfirestudios.com/setting-up-a-cloudkit-project-ca9ac1883511"&gt;Setting up a CloudKit Project – Frozen Fire Studios&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.couchbase.com/sharing-data-ios-app-extensions-sync-capability/"&gt;Share data between iOS Apps &amp;amp; App Extensions across devices&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ShareSDKPlatform/ShareSDK"&gt;ShareSDK is the most comprehensive Social SDK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.atomicbird.com/blog/sharing-with-app-extensions"&gt;Sharing data between iOS apps and app extensions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/Shimmer"&gt;Shimmer: Shimmer is an easy way to add a shimmering effect to any view in your app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/xcblog/simctl-control-ios-simulators-from-command-line-78b9006a20dc"&gt;simctl: Control iOS Simulators from Command Line - XCBlog - Medium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.goposse.com/simpleanimatingwithsnapkit-e38ed2980ac2#.n6gzo6syp"&gt;Simple Animation With SnapKit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jessedc/SliceTool/blob/master/SliceTool.m"&gt;SliceTool&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cimgf.com/2011/03/01/subduing-catiledlayer/"&gt;Subduing CATiledLayer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://subjc.com"&gt;Subjective-C&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/apple-developer-academy-federico-ii/syncing-data-on-ios-devices-with-coredata-and-cloudkit-bed296fc26e0"&gt;Syncing data on iOS devices with CoreData and CloudKit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.invisionapp.com/tethr?utm_source=ios%20dev%20tools&amp;amp;utm_medium=website&amp;amp;utm_campaign=ios%20dev%20tools&amp;amp;at=11lvzs&amp;amp;ct=ios%20dev%20tools"&gt;TETHR&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html"&gt;The Complete Tutorial on iOS/iPhone Custom URL Schemes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://savvyapps.com/blog/ultimate-guide-choosing-objective-c-or-swift"&gt;The Ultimate Guide to Choosing Objective-C or Swift for Your Project&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jlamarche/Tile-Cutter"&gt;Tile-Cutter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://benoitpasquier.com/tools-tips-to-scale-ios-project-and-team/"&gt;Tools and tips to scale your iOS project along with your team&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html"&gt;Transitioning to ARC&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Ekhoo/Translucid"&gt;Translucid: Simple and light weight UIView that animate text with an image&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zh-wang/TwitterGifComposer"&gt;Twitter GIF composer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://masilotti.com/ui-testing-xcode-7/"&gt;UI Testing in Xcode 7&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/uikit/uicollectionviewcompositionallayout"&gt;UICollectionViewCompositionalLayout - UIKit | Apple Developer Documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/14912938/uicolor-cmyk-and-lab-values"&gt;UIColor CMYK and Lab Values?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/twostraws/status/1135639902337478656"&gt;UIImage has a new initializer, UIImage(systemName:) that takes a string and returns one of over 1500 different system icons.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/PaulSolt/UIImage-Conversion"&gt;UIImage-Conversion&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spin.atomicobject.com/2020/03/23/uiscrollview-content-layout-guides/"&gt;UIScrollView with Content Layout Guides&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/smileyborg/status/1115120700493144065"&gt;UITableView and UICollectionView: update your data model &lt;strong&gt;inside&lt;/strong&gt; the batch updates block&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions"&gt;Ultimate guide to resolutions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://itunesconnect.apple.com/docs/UsingApplicationLoader.pdf"&gt;Using Application Loader&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html"&gt;Using Text Kit to Draw and Manage Text&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ColinEberhardt/VCTransitionsLibrary"&gt;VCTransitionsLibrary&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@hacknicity/view-controller-presentation-changes-in-ios-13-ac8c901ebc4e"&gt;View Controller Presentation Changes in iOS 13 - Geoff Hackworth - Medium&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://commandshift.co.uk/blog/2013/01/31/visual-format-language-for-autolayout/"&gt;Visual Format laguange for Auto Layout&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/VisualFormatLanguage.html"&gt;Visual Format Language (Apple reference)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nsscreencast.com"&gt;Weekly bite-sized screencasts on iOS dev&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/649454/what-is-the-best-way-to-average-two-colors-that-define-a-linear-gradient"&gt;What's the best way to average two colors that define a linear gradient?&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/qa/qa1713/_index.html"&gt;When to use App ID wildcards&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html"&gt;Working with blocks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/videos/wwdc/2012/"&gt;WWDC 2012 Xcode tips&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/videos/wwdc/2014/"&gt;WWDC 2014&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ohoachuck/wwdc-downloader"&gt;WWDC 2015, 2014, 2013 and Tech-talks 2013 (videos and pdf downloader)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/reference/xctest"&gt;XCTest documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/KonradCLAPP/YawImageViewer"&gt;YawImageViewer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bpoplauschi.wordpress.com"&gt;Yet another iOS Blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/YouXianMing/Animations"&gt;YouXianMing's animation collection&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cloudcity.io/blog/2015/10/15/developing-ios-app-using-ble-standard/"&gt;Zero to BLE on iOS – Part Two&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zhhlmr/ZHPopupView"&gt;ZHPopupView&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 05 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/ios-bookmarks</guid></item><item><title>Kerala travel bookmarks</title><link>https://xenodium.com/kerala-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;Bagel Shop, 30 Pali Mala Road, off Carter Road, Bandra (W) (+91 22 2605-0178). Daily 9.00AM-10.00PM. Meal for two R500-R800.&lt;/li&gt;
&lt;li&gt;Hotel Natraj, 22-24 City Station Road, Udaipur (near Bapu Bazaar), +91-294-2487488, +91-94147-57893,&lt;/li&gt;
&lt;li&gt;Kala Ghoda Café,10 Ropewalk Lane, Kala Ghoda (+91 22 2263-3866). Daily 8.30AM-11.30PM. Meal for two R600.&lt;/li&gt;
&lt;li&gt;Kochin (Fort Kochin) - old port town with Chinese, Portuguese, Dutch, British and Jewish heritage.&lt;/li&gt;
&lt;li&gt;Munnar - hill station and centre of tea, coffee and spice growing. Great hiking and spectacular views.&lt;/li&gt;
&lt;li&gt;Periyar Wildlife Sanctuary.&lt;/li&gt;
&lt;li&gt;Suzette, Atlanta Building, Nariman Point (+91 22 2288-0055). Daily 9.00AM-11.00PM. Also at Bandra. Meal for two R600-R1,000.&lt;/li&gt;
&lt;li&gt;Varkala - chilled out beach resort.&lt;/li&gt;
&lt;li&gt;Yoga House, 53 Chimbai Road, behind St Andrew's Church, off Hill Road, Bandra (W)(+91 22 6554- 5001). Daily 7.00AM-10.30PM.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 05 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/kerala-travel-bookmarks</guid></item><item><title>India travel bookmarks</title><link>https://xenodium.com/india-travel-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=13119986"&gt;A Guide to the Breads of India (Hacker News)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A route: blore - pune - mumbai - ahmedabad - mt abu - udaipur - jaipur - amritsar - chandigarh - jammu - srinagar - kargil - leh.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.abandonedamerica.us/abandoned-bhangarh-fort-india-grounds"&gt;Abandoned Bhangarh Fort, India | Grounds View&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.abandonedamerica.us/abandoned-bhangarh-fort-india-temple"&gt;Abandoned Bhangarh Fort, India | Temple Detail&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.abandonedamerica.us/abandoned-bundi-palace-india-grand"&gt;Abandoned Bundi Palace, India | Grand Wedge&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.abandonedamerica.us/abandoned-cannon-factory-india-elephant"&gt;Abandoned Cannon Factory, India | Elephant Columns&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.abandonedamerica.us/abandoned-cannon-factory-india-interior"&gt;Abandoned Cannon Factory, India | Interior Room&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.abandonedamerica.us/abandoned-jahangir-mahal-palace-orchha"&gt;Abandoned Jahangir Mahal Palace, Orchha India | Lovely Symmetry&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.abandonedamerica.us/abandoned-laxminarayan-temple-orchha-india"&gt;Abandoned Laxminarayan Temple, Orchha India | Hallway View&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.abandonedamerica.us/abandoned-raniji-ki-baori-stepwell"&gt;Abandoned Raniji Ki Baori Stepwell, Bundi India | Columns&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Akshardham_%28Delhi%29"&gt;Akshardham (Delhi)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/culturalinstitute/browse/?f.media_type=museumview&amp;amp;q.8129907598665562501=139704082&amp;amp;q.openid=media_type"&gt;Archeological survey of india sites&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=belur+mysore&amp;amp;t=ffab&amp;amp;iax=images&amp;amp;ia=images"&gt;Belur temple mysore&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/bhaja_caves"&gt;Bhaja caves, pune, maharashtra&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/bhang"&gt;Bhang&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/bodh_gaya"&gt;Bodh gaya&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://joegoauk.blogspot.co.uk/2013/07/budbudyanchi-tali-bubbling-pond-at.html"&gt;Budbudyanchi tali (bubbling pond) at netravali, sanguem, goa&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/chand_baori"&gt;Chand baori (Wikipedia)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amusingplanet.com/2012/10/chand-baori-step-well-in-rajasthan-india.html"&gt;Chand baori&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Chandipur Beach.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=Chittorgarh&amp;amp;t=ffab&amp;amp;ia=images"&gt;Chittorgarh&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tripsavvy.com/how-to-travel-on-the-darjeeling-himalayan-railway-toy-train-1539631"&gt;Darjeeling Himalayan Railway Toy Train: Essential Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Daulatabad,_Maharashtra"&gt;Daulatabad fort&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/travel/comments/5cmc8e/girlfriend_and_i_traveled_around_asia_and_europe/"&gt;dawnoflife07's India trip/pictures&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Descent_of_the_Ganges_(Mahabalipuram)"&gt;Descent of the Ganges (Mahabalipuram)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.odditycentral.com/pics/dining-with-the-dead-at-indias-new-lucky-restaurant.html"&gt;Dining with the Dead at the New Lucky Restaurant&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.bdlmuseum.org/"&gt;Dr. Bhau Daji Lad museum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Emergencies: +1-650-253-5555.&lt;/li&gt;
&lt;li&gt;Gaya, Bihar.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Gwalior"&gt;Gwalior&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=halibid+temple&amp;amp;t=ffab&amp;amp;iax=images&amp;amp;ia=images"&gt;Halibid temple&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Hampi"&gt;Hampi&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://india.zeef.com/gautam.garg"&gt;India on zeef&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/articles/india-best-step-wells-to-visit"&gt;India's most beautiful stepwells and how to visit them - Lonely Planet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.irctctourism.com/"&gt;IRCTC Tourism (A government of India enterprise)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.m.wikipedia.org/wiki/Jil_jil_jigarthanda"&gt;Jil jil jigarthanda&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=Jodhpur&amp;amp;t=ffsb&amp;amp;ia=images"&gt;Jodhpur&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/GiriShikhara/status/605754976959275011/photo/1"&gt;Kalyani/Pushkarini at Hulikere near Halebeedu,KA built by Hoysalas&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Karni_Mata"&gt;Karni Mata (rats temple)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=Khajuraho&amp;amp;t=ffab&amp;amp;ia=images"&gt;Khajuraho&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Khandala.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/wrathofgnon/status/1268080568387817472"&gt;Khotachi Wadi&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=kovalam+beach&amp;amp;t=ffab&amp;amp;iax=1&amp;amp;ia=images"&gt;Kovalam beach&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Lonavala.&lt;/li&gt;
&lt;li&gt;Mahabaleshwar.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Mahabalipuram"&gt;Mahabalipuram&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/india/himachal-pradesh/manali"&gt;Manali travel | India, Asia - Lonely Planet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Manali,_Himachal_Pradesh"&gt;Manali, Himachal Pradesh&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Manali,_Himachal_Pradesh"&gt;Manali&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Mumbai - Bademita: chicken tikka.&lt;/li&gt;
&lt;li&gt;Mumbai - Bagdadi restaurant.&lt;/li&gt;
&lt;li&gt;Mumbai - Banaganga lake (Banganga cross lane).&lt;/li&gt;
&lt;li&gt;Mumbai - Bhel puri (find in stalls).&lt;/li&gt;
&lt;li&gt;Mumbai - Cafe Britannia (Kumtha St or Adi Murzaban Path with Shahid Bhaghat Singh Rd).&lt;/li&gt;
&lt;li&gt;Mumbai - Crawford market: revivat Indian thali.&lt;/li&gt;
&lt;li&gt;Mumbai - &lt;a href="http://www.lonelyplanet.com/india/mumbai-bombay/travel-tips-and-articles/eat-mumbai-make-the-most-of-indias-foodie-capital"&gt;Eat Mumbai – make the most of India's foodie capital&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Mumbai - Elephanta caves.&lt;/li&gt;
&lt;li&gt;Mumbai - &lt;a href="http://www.finelychopped.net/2011/09/colours-of-bandras-pali-market-lallu.html"&gt;Pali Market&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Mumbai - The times of India: masala dosa.&lt;/li&gt;
&lt;li&gt;Mumbai - University of Mumbai.&lt;/li&gt;
&lt;li&gt;Mumbai - Vada pav (find in stalls).&lt;/li&gt;
&lt;li&gt;Mumbai - Victoria station: chai.&lt;/li&gt;
&lt;li&gt;Mumbai- &lt;a href="http://www.theguardian.com/travel/2012/mar/01/10-best-street-food-mumbai-india"&gt;10 of the best food in Mumbai&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hippie-inheels.com/india-travel-bucket-list/"&gt;My India travel Bucket List&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Nagpur.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tripadvisor.co.uk/Restaurant_Review-g297630-d5326840-Reviews-New_Taj_Mahal_Cafe-Mangalore_Dakshina_Kannada_District_Karnataka.html"&gt;New Taj Mahal cafe, Mangalore Buns (banana)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q=Orchha&amp;amp;t=ffab&amp;amp;ia=images"&gt;Orchha&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Panchgani.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/pandavleni_caves"&gt;Pandavleni caves, nashik, maharashtra&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/havelock_island"&gt;Radhanagar beach&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.m.wikipedia.org/wiki/Rishikesh"&gt;Rishikesh&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Sabarmati_Ashram"&gt;Sabarmati Ashram&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://satyagrahabali.org/Satyagraha_brochure_email_English.pdf"&gt;Satyagraha Ashram&lt;/a&gt; (founded by Gandhi).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/india/himachal-pradesh/shimla"&gt;Shimla (forest/trees) - Lonely Planet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-are-the-best-places-in-Pune-for-couples-to-spend-whole-day"&gt;Things to do in Pune (Quora)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lonelyplanet.com/india/uttarakhand-uttaranchal"&gt;Uttarakhand travel | India, Asia - Lonely Planet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Varanasi.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/archpics/status/1016803768413949952"&gt;Vijaya Nagara, India Centuries-old temples and statues surround Hampi, in southwest India, making up what’s left of the once-powerful city.&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://duckduckgo.com/?q%3dvipassana%2bpagoda&amp;amp;iax%3d1&amp;amp;ia%3dimages"&gt;Vipassana pagoda&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ajantaali.blogspot.com/"&gt;Welcome Ajanta, India (Shishu's site)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Western_Ghats"&gt;Western Ghats&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 05 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/india-travel-bookmarks</guid></item><item><title>Git bookmarks</title><link>https://xenodium.com/git-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://citizen428.net/10-common-git-problems-and-how-to-fix-them-e8d809299f08"&gt;10 Common Git Problems and How to Fix Them – citizen428.blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wildlyinaccurate.com/a-hackers-guide-to-git"&gt;a hackers guide to git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.scottnonnenberg.com/better-git-configuration/"&gt;Better Git configuration | Scott Nonnenberg&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nakkaya.com/2009/09/24/git-delete-last-commit/"&gt;delete last commit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone/"&gt;Get up to speed with partial clone and shallow clone - The GitHub Blog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jr0cket.co.uk/slides/getting-started-with-git.html#/"&gt;Getting Started with Git &amp;amp; Github&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://easyengine.io/tutorials/git/git-resolve-merge-conflicts/"&gt;Git - Quickest Way to Resolve Most Merge Conflicts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://commonflow.org/"&gt;Git Common-Flow&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.git-tower.com/learn/?utm_source=tower+blog&amp;amp;utm_medium=sidebar&amp;amp;utm_campaign=learn-git"&gt;git course&lt;/a&gt;: another git online tutorial, by git-tower folks.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jwiegley.github.io/git-from-the-bottom-up/"&gt;Git from the Bottom Up&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codewords.recurse.com/issues/two/git-from-the-inside-out"&gt;Git from the inside out&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ochronus.com/git-tips-from-the-trenches/"&gt;git from the trenches&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spin.atomicobject.com/2019/01/10/git-merging-vs-rebasing/?utm_source=feedblitz&amp;amp;utm_medium=FeedBlitzRss&amp;amp;utm_campaign=atomicspin"&gt;Git Merging vs. Git Rebasing: The Beginner's Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://caspervonb.com/tools/git-recipes-for-the-common-mistakes-and-mishaps/"&gt;git recipes for common mistakes and mishaps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kevinkuszyk.com/2018/12/10/git-tips-6-using-git-with-multiple-email-addresses/"&gt;Git Tips #6 - Using Git with Multiple Email Addresses&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/k88hudson/git-flight-rules"&gt;GitHub - k88hudson/git-flight-rules: Flight rules for git&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/susam/gitpr"&gt;GitHub - susam/gitpr: A quick reference guide on fork and pull request workflow&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://about.gitlab.com/2015/02/17/gitlab-annex-solves-the-problem-of-versioning-large-binaries-with-git/"&gt;GitLab Annex solves the problem of versioning large binaries with git&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moxio.com/blog/43/ignoring-bulk-change-commits-with-git-blame"&gt;Ignoring bulk change commits with git blame - Moxio&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git.wiki.kernel.org/index.php/git_faq"&gt;kernel's git faq&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html"&gt;model git commit message&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/blog/2042-git-2-5-including-multiple-worktrees-and-triangular-workflows"&gt;Multiple worktrees and triangular workflows (multiple branches checked out)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ndpsoftware.com/git-cheatsheet.html"&gt;ndp software's git cheatsheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ohshitgit.com/"&gt;Oh, shit, git!&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://harryrschwartz.com/2020/06/11/renaming-your-default-git-branch"&gt;Renaming Your Default Git Branch (Harry R. Schwartz)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://git-scm.com/blog/2010/03/08/rerere.html"&gt;rerere: reuse recorded resolution&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.matheuslima.com/things-you-didnt-know-about-git"&gt;things you didn't know about git&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/dmartincy/status/1188604333430104064"&gt;TIL about git-subline-merge&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sbf5.com/~cduan/technical/git/"&gt;Understanding Git Conceptually&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://upcase.com/mastering-git"&gt;Upcase's mastering Git course&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://willschenk.com/articles/2020/using_askgit/"&gt;Using Askgit (sql interface to your git repository)&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Thu, 05 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/git-bookmarks</guid></item><item><title>Django, uWSGI, Nginx on Freebsd</title><link>https://srijan.ch/django-uwsgi-nginx-on-freebsd</link><description>Setting up Django on Freebsd using uWSGI and Nginx</description><author>Srijan Choudhary, all posts</author><pubDate>Thu, 05 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://srijan.ch/django-uwsgi-nginx-on-freebsd</guid></item><item><title>Language learning bookmarks</title><link>https://xenodium.com/language-learning-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.hackingchinese.com/about/practical-guide-to-learning-mandarin/"&gt;Hacking Chinese: A Practical Guide to Learning Mandarin (Hacking Chinese)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;HN's comments on &lt;a href="https://news.ycombinator.com/item?id%3d8806678"&gt;learning laguages&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.michelthomas.com/how-it-works.php"&gt;How it Works - Language Learning with The Michel Thomas Method&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fourhourworkweek.com/2007/11/07/how-to-learn-but-not-master-any-language-in-1-hour-plus-a-favor/"&gt;How to learn (But Not Master) Any Language in 1 Hour (Plus: A Favor)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reader.manabi.io/"&gt;Manabi Reader – Learn Japanese by Reading on iOS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://woodypianoshack.com/"&gt;Welcome - Woody Piano Shack&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 04 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/language-learning-bookmarks</guid></item><item><title>I wrote a thing about New Microsoft</title><link>https://nicolaiarocci.com/i-wrote-a-thing-about-new-microsoft/</link><description>&lt;p&gt;I have a guest post up at the official Italian &lt;a href="http://blogs.msdn.com/b/italy/archive/2015/03/03/guest-post-una-giornata-all-azure-open-day-in-compagnia-di-una-nuova-microsoft.aspx"&gt;MSDN Team Blog&lt;/a&gt;. It’s about the new Microsoft I met last Wednesday at the Azure Open Day in Milan.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 04 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/i-wrote-a-thing-about-new-microsoft/</guid></item><item><title>Selected Ambient Works 85–92</title><link>https://huphtur.nl/selected-ambient-works/</link><description>&lt;p&gt;One of my all time top favorite music albums is “&lt;a href="http://www.amazon.com/gp/product/B00DF2AF96?ie=UTF8&amp;amp;camp=213733&amp;amp;creative=393177&amp;amp;creativeASIN=B00DF2AF96&amp;amp;linkCode=shr&amp;amp;tag=thhocr02-20&amp;amp;linkId=OLB7NVA3DYPZXTEF"&gt;Selected Ambient Works 85-92&lt;/a&gt;” by the enigmatic Aphex Twin. I purchased it right after it came out (1992) at a small record store in Amsterdam. Had no idea who or what the record was about, I purely bought it for the cover art.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cover art of the Select Ambient Works 85 - 92 album." src="https://huphtur.nl/images/selected-ambient-works-95-92.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Apparently the Aphex Twin logo was &lt;a href="http://pictograms.blogspot.nl/2007/11/logo-111-aphex-twin.html"&gt;designed by&lt;/a&gt; a guy named Paul &lt;a href="http://www.terratag.com/"&gt;’Terratag’&lt;/a&gt; Nicholson. It was first used on the cover of Aphex Twin’s “Xylem Tube” release.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Aphex Twin’s Xylem Tube album art." src="https://huphtur.nl/images/xylem-tube.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;This Terratag guy also did artwork for a small skate clothing company called &lt;a href="https://en.wikipedia.org/wiki/Anarchic_Adjustment"&gt;Anarachic Adjustment&lt;/a&gt;. Some of the earlier photography for the brand was shot by &lt;a href="http://www.imdb.com/name/nm0005069/"&gt;Spike Jonze&lt;/a&gt;. I remember seeing some of their ads in Thrasher and RAD skate magazine.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Anarachic Adjustment advertisements in some old skate magazines." src="https://huphtur.nl/images/anarchicadjustment-ads.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Terratag was super into Aliens, which shows in this Anarachic Adjustment promo video. It includes some pretty good tunes (unfortunately no Aphex Twin) and has a very &lt;a href="http://www.alienworkshop.com/"&gt;Alien Workshop&lt;/a&gt; kind of vibe to it.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/EHs0Z2yI83E"&gt;https://youtu.be/EHs0Z2yI83E&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some of the few samples used on “Selected Ambient Works 85-92” can be heard on the “We Are the Music Makers” track. The sample is from the 1971 movie “Willy Wonka &amp;amp; the Chocolate Factory”.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/1M0eMkcc91E"&gt;https://youtu.be/1M0eMkcc91E&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;They are the first lines of “&lt;a href="https://en.wikipedia.org/wiki/Ode_%28poem%29"&gt;Ode&lt;/a&gt;”, a poem by &lt;a href="https://en.wikipedia.org/wiki/Arthur_O%27Shaughnessy"&gt;Arthur O’Shaughnessy&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We are the music makers,&lt;br /&gt;
And we are the dreamers of dreams,&lt;br /&gt;
Wandering by lone sea-breakers,&lt;br /&gt;
And sitting by desolate streams;—&lt;br /&gt;
World-losers and world-forsakers,&lt;br /&gt;
On whom the pale moon gleams:&lt;br /&gt;
Yet we are the movers and shakers&lt;br /&gt;
Of the world for ever, it seems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mark Gonzales used the exact same clip in the intro to his &lt;em&gt;Blind Video Days&lt;/em&gt; part, undoubtedly the best skateboard video ever (directed by Spike Jonze).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://youtu.be/gizM-PuVnY0"&gt;https://youtu.be/gizM-PuVnY0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Internet’s biggest forum for electronic music is appropriately called &lt;a href="http://watmm.com/"&gt;We Are The Music Makers&lt;/a&gt;. The forum was the first to break the fact that Aphex Twin was &lt;a href="http://www.theguardian.com/music/musicblog/2015/jan/29/aphex-twin-soundcloud-dump-shock-and-delight"&gt;dumping&lt;/a&gt; an enormous amount of unreleased tracks &lt;a href="https://soundcloud.com/user18081971"&gt;on SoundCloud&lt;/a&gt;. Some of the uploaded songs bring me right back to the era the SAW album came out.&lt;/p&gt;
&lt;p&gt;DJ Food produced a Solid Steel podcast of Aphex Twin songs mixed in with some vintage interview clips.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://soundcloud.com/ninja-tune/solid-steel-radio-show-1322015-part-1-2-dj-food"&gt;https://soundcloud.com/ninja-tune/solid-steel-radio-show-1322015-part-1-2-dj-food&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It’s amazing how an album, that I purchased back in 1992, can still bring so much value to my life. It truly is a timeless masterpiece.&lt;/p&gt;</description><author>huphtur</author><pubDate>Wed, 04 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://huphtur.nl/selected-ambient-works/</guid></item><item><title>Annual report number 9 + 10: My Success</title><link>https://www.jimwestergren.com/annual-report-number-9-10-my-success</link><description>Back in December of 2004 I started a new life from zero. I was 22 years old without any money, education or connections. I borrowed my mothers computer and started to learn HTML and internet marketing. That is now little more than 10 years ago and each year I publish an annual report. Earlier reports &amp;#91;...&amp;#93;</description><author>Jim Westergren</author><pubDate>Tue, 03 Mar 2015 16:29:00 GMT</pubDate><guid isPermaLink="true">https://www.jimwestergren.com/annual-report-number-9-10-my-success</guid></item><item><title>Designing the Apple Watch UI – a quick guide</title><link>https://nitinnain.com/quick-guide-to-designing-apple-watch-interface/</link><description>The Apple Watch is releasing in a month! Here&amp;#8217;s a list of important things you need to know, if you&amp;#8217;re interested in designing or developing an Apple Watch App: 1. Layout and Screen Sizes 38mm: 340 pixels x 272 pixels 42mm: 390 pixels x 312 pixels That’s an aspect ratio of 4:5. &amp;#160; 2. Icon [&amp;#8230;]</description><author>Nitin Nain</author><pubDate>Mon, 02 Mar 2015 07:56:53 GMT</pubDate><guid isPermaLink="true">https://nitinnain.com/quick-guide-to-designing-apple-watch-interface/</guid></item><item><title>Transformieren und Validieren von JSON Requests in Play2</title><link>https://manuel.kiessling.net/2015/03/01/transformieren-und-validieren-von-json-requests-in-play2/</link><description>Dies ist ein Crosspost vom Galeria Kaufhof Technology Blog.
Als Anfänger in der Arbeit mit Scala stehe ich aktuell vor der Aufgabe, eine einfache Webservice API in Play2 zu realisieren.
Der Webservice hat einen Endpunkt /api/experiments, über den via POST ein A/B Test (bzw. Experiment) mit 2 oder mehr Varianten angelegt werden kann.
Der Body eines solchen Requests ist eine JSON Struktur, die den A/B Test beschreibt:
{ "name": "Checkout page buttons"</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Sun, 01 Mar 2015 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2015/03/01/transformieren-und-validieren-von-json-requests-in-play2/</guid></item><item><title>The Mythical Man-Month</title><link>https://june.kim/mythical-man-month/</link><author>june.kim</author><pubDate>Sun, 01 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/mythical-man-month/</guid></item><item><title>Trust Me</title><link>https://www.craigpardey.com/post/2015-03-01-trust-me/</link><description>&lt;p&gt;The question of location comes up a lot in software consulting.  Will the work be done on the client&amp;rsquo;s premises, or the consultant&amp;rsquo;s?  There&amp;rsquo;s no right answer.  Some clients don&amp;rsquo;t have the office space to accommodate an entire development team.  Others already have a large IT department and want the consultancy&amp;rsquo;s team co-located with their existing staff.&lt;/p&gt;
&lt;p&gt;Working at the consultancy&amp;rsquo;s office may afford certain perks like a relaxed dress code and flexible hours (are there still inflexible hours?).  At the client&amp;rsquo;s site, the developers will have greater access to the people they need to talk to.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Sun, 01 Mar 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2015-03-01-trust-me/</guid></item><item><title>Read only root on Linux</title><link>https://srijan.ch/read-only-root-on-linux</link><description>Setting up a read-only root filesystem on Linux</description><author>Srijan Choudhary, all posts</author><pubDate>Sat, 28 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://srijan.ch/read-only-root-on-linux</guid></item><item><title>Screenshot Saturday 213</title><link>https://etodd.io/2015/02/27/screenshot-saturday-213/</link><description>&lt;p&gt;
It's the end of February and this game is supposed to be content-complete. In a
sense, it actually is. All the levels are done. Twenty in all. I thought this
month would never end!
&lt;/p&gt;
&lt;a href="https://etodd.io/assets/fxPzauy.jpg"&gt;&lt;img src="https://etodd.io/assets/fxPzauyl.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;
Just so you know, there are sixty of those lights and I had to hook up each one
individually. It fell just barely beneath the
&lt;a href="https://xkcd.com/1205/"&gt;"worth it to automate" threshold&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Don't look too closely at this next one, it's a bit spoilery.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 27 Feb 2015 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/02/27/screenshot-saturday-213/</guid></item><item><title>My mail setup using Mutt/OfflineIMAP/imapfilter</title><link>https://blog.erethon.com/blog/2015/02/27/my-mail-setup-using-mutt/offlineimap/imapfilter/</link><description>&lt;p&gt;
&lt;code class="verbatim"&gt;Update 17/03/2015:&lt;/code&gt; I'm also using NotMuch now, for more info check
out &lt;a href="http://blog.erethon.com/blog/2015/03/17/notmuch-is-awesome/"&gt;this post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;code class="verbatim"&gt;Update 2/6/2015:&lt;/code&gt; I've added msmtp to the mix, check out &lt;a href="http://blog.erethon.com/blog/2015/06/02/using-msmtp-to-handle-mail-delivery"&gt;my new post
about it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
This is part of a series of posts where I describe my workflow and OS
setup.&lt;/p&gt;</description><author>Erethon's Corner</author><pubDate>Fri, 27 Feb 2015 19:46:52 GMT</pubDate><guid isPermaLink="true">https://blog.erethon.com/blog/2015/02/27/my-mail-setup-using-mutt/offlineimap/imapfilter/</guid></item><item><title>HTPC automatic workflow for Movies and TV Shows</title><link>https://danielpecos.com/2015/02/27/htpc-automatic-workflow-for-movies-and-tv-shows/</link><description>&lt;p&gt;Watching Movies and TV Shows from online streaming sources is a pain, as you depend on the availability of the your ISP network and current status of the stream provider. Furthermore, you don’t always have an internet connection available when you want to spend some time in front of the TV. So downloading it it’s a much better way to go in order to avoid this issues (giving that you have to anticipate a little bit to get downloads finished).&lt;/p&gt;
&lt;p&gt;BTW, PopCorn Time is a recent solution that works pretty neat: it streams video directly fetched from torrent sources. I recommend giving it a try.&lt;/p&gt;
&lt;p&gt;But looking for latest TV shows episodes or movies using torrent search providers is also a pain, because it requires a certain time and dedication you could spend in some other task.&lt;/p&gt;
&lt;p&gt;But we’re computer engineers and we love automating things, and this specific problem we’re describing has to be more common than unusual, so I started googling about this matter and I found these pretty cool tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://couchpota.to/"&gt;CouchPotato&lt;/a&gt;: tool that looks for movies in different torrent providers, fetching the appropriate torrent based on your quality requirements as soon is ready. It integrates with IMDB via a browser plugin, so you can queue upcoming movies without even opening its interface.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://flexget.com/"&gt;flexget&lt;/a&gt;: really powerful tool that keeps track of your latest downloaded TV show episodes and fetches new ones (well, their torrents) as soon they’re available and meeting your quality requirements&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.filebot.net"&gt;filebot&lt;/a&gt;: renames, organizes and downloads subtitles for video archives based on their metadata and search results on internet video databases.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pushbullet.com"&gt;PushBullet&lt;/a&gt;: get notifications from other applications directly into your mobile device.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kodi.tv"&gt;Kodi / XBMC&lt;/a&gt;: one of the best HTPC platforms, with lots of plugins and features.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tvshowtime.com"&gt;TV Show Time&lt;/a&gt;: really nice social network and episode tracking site.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s wire it all together! This is how they interact with each other in my current workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Movies&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;I look for movies in IMDB and when I find any of interest, I queue that one into CouchPotato using its browser plugin (available for Chrome and Firefox).&lt;/li&gt;
&lt;li&gt;CouchPotato keeps looking for torrent sources for queued movies and whenever one is available, it queues it to the download list and I get a notification in my cell phone.&lt;/li&gt;
&lt;li&gt;Once the file is ready, filebot attaches proper metadata &amp;amp; subtitles and moves / renames that file to its final destination and tells Kodi to refresh its library.&lt;/li&gt;
&lt;li&gt;Kodi (previously known as XBMC) reloads a set of preconfigured directories (where filebot places files) from time to time and gets new videos stored into its database, fetching art work and IMDB / TV Shows DB info if required.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;TV Shows&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Flexget keeps looking for existing / returning TV shows I’m interested in (and previously configured in its config file), getting notified as when they’re in the torrent download queue&lt;/li&gt;
&lt;li&gt;Rest of the steps for this workflow are exactly the same as for movies.&lt;/li&gt;
&lt;li&gt;One difference but, is that once I finish watching that episode, Kodi automatically marks it as watched in my TV Show Time account.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So after expending some time setting this workflow up and integrating these tools into my HTPC, I got a totally automated TV Show / Movies box. I totally recommend that you expend some time with these tools. Once running you can almost forget about looking for torrents ever more.&lt;/p&gt;
&lt;p&gt;Awesome!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: Here you can find a nice tutorial on &lt;a href="https://www.cloudwards.net/how-to-use-kodi/"&gt;How to Use Kodi: What You Need to Know&lt;/a&gt;&lt;/p&gt;</description><author>GeekWare - Daniel Pecos Martínez</author><pubDate>Fri, 27 Feb 2015 07:40:51 GMT</pubDate><guid isPermaLink="true">https://danielpecos.com/2015/02/27/htpc-automatic-workflow-for-movies-and-tv-shows/</guid></item><item><title>Dynamic DNS client for Namecheap using bash &amp;amp; cron</title><link>https://cmetcalfe.ca/blog/dynamic-dns-client-for-namecheap.html</link><description>&lt;p&gt;In addition to running this website, I also run a home server. For convenience,
I point a subdomain of &lt;code&gt;cmetcalfe.ca&lt;/code&gt; at it so even though it's connected using
a dynamic IP (and actually seems to change fairly frequently), I can get access
to it from anywhere.&lt;/p&gt;
&lt;p&gt;As a bit of background, the domain for this website is registered and managed
through &lt;a href="http://namecheap.com"&gt;Namecheap&lt;/a&gt;. While they do provide a &lt;a href="https://www.namecheap.com/support/knowledgebase/article.aspx/28"&gt;recommended DDNS client&lt;/a&gt; for
keeping a domain's DNS updated, it only runs on Windows.&lt;/p&gt;
&lt;p&gt;Instead, after &lt;a href="https://www.namecheap.com/support/knowledgebase/article.aspx/595"&gt;enabling DDNS for the domain&lt;/a&gt; and reading &lt;a href="https://www.namecheap.com/support/knowledgebase/article.aspx/29"&gt;Namecheap's article
on using the browser to update DDNS&lt;/a&gt; I came up with the following &lt;code&gt;dns-update&lt;/code&gt;
script.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="c1"&gt;# Abort if anything goes wrong (negates the need for error-checking)&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e

&lt;span class="c1"&gt;# Uses drill instead of dig&lt;/span&gt;
resolve&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;#dig &amp;quot;$1&amp;quot; @resolver1.opendns.com +short 2&amp;gt; /dev/null&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;drill&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;@resolver1.opendns.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/dev/null&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sed&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'/;;.*$/d;/^\s*$/d'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;head&lt;span class="w"&gt; &lt;/span&gt;-1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-f5
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;dns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;resolve&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;subdomain&amp;gt;.cmetcalfe.ca&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;curr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;resolve&lt;span class="w"&gt; &lt;/span&gt;myip.opendns.com&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$dns&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$curr&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://dynamicdns.park-your-domain.com/update?host=&amp;lt;subdomain&amp;gt;&amp;amp;domain=cmetcalfe.ca&amp;amp;password=&amp;lt;my passkey&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;ErrCount&amp;gt;0&amp;lt;/ErrCount&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Server DNS record updated (&lt;/span&gt;&lt;span class="nv"&gt;$dns&lt;/span&gt;&lt;span class="s2"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$curr&lt;/span&gt;&lt;span class="s2"&gt;)&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Server DNS record update FAILED (tried &lt;/span&gt;&lt;span class="nv"&gt;$dns&lt;/span&gt;&lt;span class="s2"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$curr&lt;/span&gt;&lt;span class="s2"&gt;)&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It basically checks if the IP returned by a DNS query for the subdomain matches
the current IP of the server (as reported by an &lt;a href="https://en.wikipedia.org/wiki/OpenDNS"&gt;OpenDNS&lt;/a&gt; resolver) and if it
doesn't, sends a request to update the DNS. The &lt;code&gt;echo&lt;/code&gt; commands are there just
to output some record of the IP changing. Maybe I'll do some analysis of it at
some point.&lt;/p&gt;
&lt;p&gt;To run the script every 30 minutes and redirect any output from it to the
syslog, the following &lt;a href="http://en.wikipedia.org/wiki/Cron"&gt;crontab&lt;/a&gt; entry can be used:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;*/30&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;*&lt;span class="w"&gt; &lt;/span&gt;/path/to/dns-update&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/logger&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;dns-update
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;With the script automatically running every 30 minutes I can now be confident
that my subdomain will always be pointing at my home server whenever I need
access to it.&lt;/p&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;A previous version of this article used &lt;code&gt;curl -sf http://curlmyip.com&lt;/code&gt; to
find the server's current IP address. However, after curlmyip went down for
a few days, I decided to take the advice in &lt;a href="http://unix.stackexchange.com/a/81699"&gt;this StackExchange answer&lt;/a&gt;
and use &lt;a href="https://en.wikipedia.org/wiki/OpenDNS"&gt;OpenDNS&lt;/a&gt; instead.&lt;/p&gt;
&lt;/div&gt;</description><author>Carey Metcalfe</author><pubDate>Fri, 27 Feb 2015 06:21:00 GMT</pubDate><guid isPermaLink="true">https://cmetcalfe.ca/blog/dynamic-dns-client-for-namecheap.html</guid></item><item><title>Flower Vase Renders</title><link>https://blog.yiningkarlli.com/2015/02/flower-vase-render.html</link><description>&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/flowers.cam2.png"&gt;&lt;img alt="Rendered in Takua a0.5 using BDPT. Nearly a quarter of a billion triangles." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/flowers.cam2.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to test Takua a0.5, I’ve been using my renderer on some quick little “pretty picture” projects. I recently ran across a fantastic flower vase model by artist &lt;a href="https://www.behance.net/andi_mix"&gt;Andrei Mikhalenko&lt;/a&gt; and used Andrei’s model as the basis for a shading exercise. The above and following images are rendered entirely in Takua a0.5 using bidirectional pathtracing. I textured and shaded everything using Takua a0.5’s layered material system, and also made some small modifications to the model (moved some flowers around, extended the stems to the bottom of the vase, and thickened the bottom of the vase). Additionally, I further subdivided the flower petals to gain additional detail and smoothness, meaning the final rendered model weighs in at nearly a quarter of a billion triangles. Obviously using such heavy models is not practical for a single prop in real world production, but I wanted to push the amount of geometry my renderer can handle. Overall, total memory usage for each of these renders hovered around 10.5 GB. All images were rendered at 1920x1080 resolution; click on each image to see the full resolution renders.&lt;/p&gt;

&lt;p&gt;For the flowers, I split all of the flowers into five randomly distributed groups and assigned each group a different flower material. Each material is a two-sided material with a different BSDF assigned to each side, with side determined by the surface normal direction. For each flower, the outside BSDF has a slightly darker reflectance than the inner BSDF, which efficiently approximates the subsurface scattering effect real flowers have, but without actually having to use subsurface scattering. In this case, using a two-sided material to fake the effect of subsurface scattering is desirable since the model is so complex and heavy. Also, the stems and branches are all bump mapped.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/flowers.cam0.png"&gt;&lt;img alt="Rendered in Takua a0.5 using BDPT. Note the complex caustics from the vase and water." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/flowers.cam0.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This set of renders was a good test for bidirectional pathtracing because of the complex nature of the caustics in the vase and water; note that the branches inside of the vase and water cannot be efficiently rendered by unidirectional pathtracing since they are in glass and therefore cannot directly sample the light sources. The scene is lit by a pair of rectlights, one warmer and one cooler in temperature. This lighting setup, combined with the thick glass and water volume at the bottom of the vase, produces some interesting caustic on the ground beneath the vase.&lt;/p&gt;

&lt;p&gt;The combination of the complex caustics and the complex geometry in the bouquet itself meant that a fairly deep maximum ray path length was required (16 bounces). Using BDPT helped immensely with resolving the complex bounce lighting inside of the bouquet, but the caustics proved to be difficult for BDPT; in all of these renders, everything except for the caustics converged within about 30 minutes on a quad-core Intel Core i7 machine, but the caustics took a few hours to converge in the top image, and a day to converge for the second image. I’ll discuss caustic performance in BDPT compared to PPM and VCM in some upcoming posts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/flowers.cam1.png"&gt;&lt;img alt="Rendered in Takua a0.5 using BDPT. Depth of field and circular bokeh entirely in-camera." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/flowers.cam1.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All depth of field is completely in-camera and in-renderer as well. No post processed depth of field whatsoever! For the time being, Takua a0.5 only supports circular apertures and therefore only circular bokeh, but I plan on adding custom aperture shapes after I finish my thesis work. In general, I think that testing my own renderer with plausibly real-world production quality scenes is very important. After all, having just a toy renderer with pictures of spheres is not very fun… the whole point of a renderer is to generate some really pretty pictures! For my next couple of posts, I’m planning on showing some more complex material/scene tests, and then moving onto discussing the PPM and VCM integrators in Takua.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id="addendum-2015-03-03"&gt;Addendum 2015-03-03&lt;/h2&gt;

&lt;p&gt;I should comment on the memory usage a bit more, since some folks have expressed interest in what I’m doing there. By default, the geometry actually weighs in closer to 30 GB in memory usage, so I had to implement some hackery to get this scene to fit in memory on a 16 GB machine. The hack is really simple: I added an optional half-float mode for geometry storage. In practice, using half-floats for geometry is usually not advisable due to precision loss, but in this particular scene, that precision loss becomes more acceptable due to a combination of depth of field hiding most alignment issues closer to camera, and sheer visual complexity making other alignment issues hard to spot without looking too closely. Additionally, for the flowers I also threw away all of the normals and recompute them on the fly at render-time. Recomputing normals on the fly results in a small performance hit, but it vastly preferable to going out of core.&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Fri, 27 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2015/02/flower-vase-render.html</guid></item><item><title>scytheCTF and Updates</title><link>https://captnemo.in/blog/2015/02/27/scythe-ctf-updates/</link><description>&lt;p&gt;February has been an interesting month for me. I haven’t been programming a lot, but have definitely been writing a lot. I have got a few more upcoming projects as well, which I’d love to announce soon.&lt;/p&gt;

&lt;p&gt;We recently held a short 8-hour CTF (scytheCTF) on Backdoor. I made two challenges for the CTF:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="https://backdoor.sdslabs.co/challenges/SHITTY-OTP"&gt;SHITTY-OTP&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://backdoor.sdslabs.co/challenges/LOST-FOUND"&gt;LOST-FOUND&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both of these problems were rush jobs because of several reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We didn’t have much time to set the problems.&lt;/li&gt;
  &lt;li&gt;We didn’t expect much participation in scytheCTF.&lt;/li&gt;
  &lt;li&gt;scytheCTF was a test CTF, just to figure out any issues with the internet launch of Backdoor.&lt;/li&gt;
  &lt;li&gt;scythe is also supposed to be beginner friendly, unlike our annual BackdoorCTF, which will include much harder problems.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I had a lot of fun with &lt;a href="https://twitter.com/kandoiabhi"&gt;@kandoiabhi&lt;/a&gt; in setting the problems. It was also great seeing &lt;a href="https://twitter.com/DefConUA"&gt;@DefConUA&lt;/a&gt; participate in such a small-scale contest.&lt;/p&gt;

&lt;p&gt;Other than scythe, we recently had our annual SDSLabs trip to Rishikesh, which I enjoyed a lot. I also wrote a small post on &lt;a href="/setup/"&gt;my work setup&lt;/a&gt;.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Fri, 27 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/02/27/scythe-ctf-updates/</guid></item><item><title>Ember, Azure, and Authentication</title><link>https://98.codes/ember-azure-and-authentication/</link><description>&lt;!--kg-card-begin: markdown--&gt;&lt;p&gt;Chances are, sooner or later, you&amp;apos;re going to want to be able to let someone log into an application you&amp;apos;re writing. Here in the Microsoft space where I still spend a majority of my time, authenticating against &lt;a href="http://azure.microsoft.com/en-us/services/active-directory/?ref=98.codes"&gt;Azure Active Directory&lt;/a&gt; is always a consideration in any&lt;/p&gt;</description><author>Text(Greg);</author><pubDate>Thu, 26 Feb 2015 18:38:50 GMT</pubDate><guid isPermaLink="true">https://98.codes/ember-azure-and-authentication/</guid></item><item><title>Xen Orchestra Docker Image</title><link>https://smcleod.net/2015/02/xen-orchestra-docker-image/</link><description>&lt;p&gt;Docker config to setup XO which is a web interface to visualize and administrate your XenServer (or XAPI enabled) hosts&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/sammcj/docker-xen-orchestra"&gt;Github: sammcj/docker-xen-orchestra&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="running-the-app"&gt;Running the app&lt;/h2&gt;
&lt;p&gt;Updates are pushed to the Docker Hub&amp;rsquo;s automated build service:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://registry.hub.docker.com/u/sammcj/docker-xen-orchestra"&gt;https://registry.hub.docker.com/u/sammcj/docker-xen-orchestra&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="from-docker-hub"&gt;From Docker Hub&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull sammcj/docker-xen-orchestra
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -p 8000:80 sammcj/docker-xen-orchestra
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="building"&gt;Building&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/sammcj/docker-xen-orchestra.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; docker-xen-orchestra
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Edit whatever config you want to change&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build -t xen-orchestra .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See &lt;a href="https://xen-orchestra.com"&gt;https://xen-orchestra.com&lt;/a&gt; for information on Xen Orchestra&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Thu, 26 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/xen-orchestra-docker-image/</guid></item><item><title>The Entrepreneurship Network</title><link>https://faingezicht.com/projects/2015/02/25/entrepreneurship-network/</link><description>&lt;small&gt;Although it might look like abstract art, this image was procedurally generated by extracting information from venture capital investments.&lt;/small&gt;

During the fall quarter of my sophomore year (late 2012) I took &lt;a href="http://rocs.northwestern.edu/Courses/F12-395/Home.html"&gt;Introduction to Complex Networks&lt;/a&gt;, a survey course in applied mathematics taught by professor Dirk Brockmann. Through his teaching, I learned about various network models and their applications. The class discussed graph theory and stochastic models, applying them to the analysis and simulation of real world network phenomena in a wide range of domains, including biology, physics, transportation, and others. When he started discussing &lt;a href="http://en.wikipedia.org/wiki/Preferential_attachment"&gt;preferential attachment processes&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Scale-free_network"&gt;scale-free networks&lt;/a&gt;, my mind started running.

A few days later, at the end of one of his lectures, I shared an idea with my professor: the preferential attachment models we discussed in class probably applied to venture capital funding processes, and data on startup investing was publicly available online, waiting to be analyzed. Dirk was intrigued. In a matter of days I convinced my friend Leon Sasson to join me in an independent research project under Brockmann’s guidance, and we got to work. Over a six-month period, we scoped our project, used the Crunchbase API to gather data, and developed software to analyze and visualize the underlying patterns.

![scale free](https://cdn.faingezicht.com/entrep_net/Scale-free.png)
&lt;small&gt;"&lt;a href="http://commons.wikimedia.org/wiki/File:Scale-free_network_sample.png#mediaviewer/File:Scale-free_network_sample.png"&gt;Scale-free network sample&lt;/a&gt;". Licensed under &lt;a href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;CC BY-SA 3.0&lt;/a&gt; via &lt;a href="//commons.wikimedia.org/wiki/"&gt;Wikimedia Commons&lt;/a&gt;.&lt;/small&gt;

The Internet itself is probably the most common example of a scale-free network: many large hubs connect users to the smaller, lesser-known websites. The startup world, with its epicenter at Silicon Valley, seems to be a good example of this dynamic too. Our analysis provided some insight into this idea.

When we downloaded the data from Crunchbase (back in Q1 2013), there were around 30,000 funding rounds and over 280,000 profiles which included startups, employees, investors (both individual and institutional). Obviously, the technology world has evolved, and today Crunchbase holds more than twice that number of profiles and funding rounds, so the specifics in our results would probably differ significantly if the analysis were repeated with today's data. Nevertheless, I believe our results are still interesting, and the patterns should still hold. I will summarize some key findings here.

We built separate networks for startups and investors. On the startup side, two companies were connected if they had a common investor, while investors were connected if they had funded a common company. These were basically the projections of a bipartite network onto its disjoint sets. Some basic quantities that describe the networks, such as N (number of nodes), L (number of edges), σ (network connectivity), dT and φ (network diameters), cc (clustering coefficient) and  (average degree), are shown in the table below.

&lt;table class="table centered"&gt;
  &lt;tr&gt;
    &lt;th class="centered"&gt;&lt;/th&gt;
    &lt;th class="centered"&gt;N&lt;/th&gt;
    &lt;th class="centered"&gt;L&lt;/th&gt;
    &lt;th class="centered"&gt;σ&lt;/th&gt;
    &lt;th class="centered"&gt;dT&lt;/th&gt;
    &lt;th class="centered"&gt;φ&lt;/th&gt;
    &lt;th class="centered"&gt;cc&lt;/th&gt;
    &lt;th class="centered"&gt;&amp;lt;k&amp;gt;&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th class="centered"&gt;Companies&lt;/th&gt;
    &lt;td&gt;&lt;small&gt;109,044&lt;/small&gt;&lt;/td&gt;
    &lt;td&gt;&lt;small&gt;739,054&lt;/small&gt;&lt;/td&gt;
    &lt;td&gt;&lt;small&gt;3.99x10&lt;sup&gt;-7&lt;/sup&gt;&lt;/small&gt;&lt;/td&gt;
    &lt;td&gt;&lt;small&gt;3.63&lt;/small&gt;&lt;/td&gt;
    &lt;td&gt;&lt;small&gt;17&lt;/small&gt;&lt;/td&gt;
    &lt;td&gt;&lt;small&gt;0.082&lt;/small&gt;&lt;/td&gt;
    &lt;td&gt;&lt;small&gt;13&lt;/small&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th class="centered"&gt;Financial Organizations&lt;/th&gt;
    &lt;td&gt;&lt;small&gt;8,635&lt;/small&gt;&lt;/td&gt;
    &lt;td&gt;&lt;small&gt;46,111&lt;/small&gt;&lt;/td&gt;
    &lt;td&gt;&lt;small&gt;8.12x10&lt;sup&gt;-6&lt;/sup&gt;&lt;/small&gt;&lt;/td&gt;
    &lt;td&gt;&lt;small&gt;3.51&lt;/small&gt;&lt;/td&gt;
    &lt;td&gt;&lt;small&gt;10&lt;/small&gt;&lt;/td&gt;
    &lt;td&gt;&lt;small&gt;0.366&lt;/small&gt;&lt;/td&gt;
    &lt;td&gt;&lt;small&gt;10&lt;/small&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

The main takeaway from these numbers is that for such large and sparse networks, the diameters are very small. In layman’s terms, the diameter of a network is the maximum number of steps it would take to get from a given node to any other, as in the notion of &lt;a href="http://en.wikipedia.org/wiki/Six_degrees_of_separation"&gt;six degrees of separation&lt;/a&gt;. These features mean that although both networks have many nodes and links between them, and they are not very well connected, a few large hubs connect the network as a whole. This is what we would expect from networks built through preferential attachment, following a power law that leads to a scale-free pattern.

The numbers were useful in describing the networks, but we used data visualizations to help us understand the structure to a different extent. By using a technique called k-core decomposition, we showed that indeed, as we disentangled the hierarchical structure of the investor network, and progressively focused on the most connected funds at the central core, we ended up with the big names. Sequoia, KPBC, Intel Capital and others who have the resources to invest in many deals over several rounds form the big red ball found at the center of this image. Notice that this is an objective measurement of quantity of deals, not their quality. The VC world is usually characterized as an old boy’s club, and this picture seems to confirm it.

![FO](https://cdn.faingezicht.com/entrep_net/FOs.png)
&lt;small&gt;K-Core decomposition of Financial Organizations&lt;/small&gt;

Furthermore, we also found that companies with a high number of neighbors tend to be connected with other highly connected startups. This phenomenon, called assortative mixing, suggests that startups backed by many investors tend to get funded by those investors who fund many companies.  Nevertheless, this could also be an artifact arising from the fact that, in general, larger funds get their hands on many more deals, another important dynamic in startup land.

![KK Boxplot](https://cdn.faingezicht.com/entrep_net/kk_k_boxplot.png)
&lt;small&gt;k vs. &amp;lt;kk&amp;gt; is a measure of how well-connected a startup is, compared to how well-connected its neighbors are.&lt;/small&gt;

After six months of working on this project we were finally getting interesting results. When we presented our results to Dirk, he was very excited with our findings, and suggested that we should develop our work into a paper to submit to scientific journals, but neither me nor Leon were interested at the time. Soon after, Professor Brockmann went on to greener pastures at the Humboldt Universität Berlin, while we decided to move on to new projects.

Perhaps Leon and I will revive our analysis at some point in the future.</description><author>Avy Faingezicht</author><pubDate>Wed, 25 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/projects/2015/02/25/entrepreneurship-network/</guid></item><item><title>Where to go after 'Learn You a Haskell For Great Good'?</title><link>https://gilmi.me/post/2015/02/25/after-lyah</link><description>A list of Haskell resources.</description><author>λm.me</author><pubDate>Wed, 25 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://gilmi.me/post/2015/02/25/after-lyah</guid></item><item><title>So Why Exactly Is HTTP/2 So Cool?</title><link>https://nicolaiarocci.com/so-why-exactly-is-http2-so-cool/</link><description>&lt;p&gt;Today must read is &lt;a href="https://www.mnot.net/blog/2014/01/30/http2_expectations"&gt;Nine Things to Expect from HTTP/2&lt;/a&gt;, brewed for us by one of the HTTP/2 core designers, Mark Nottingham. Ten well spent minutes of your time.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 24 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/so-why-exactly-is-http2-so-cool/</guid></item><item><title>Building RHEL Vagrant Boxes with Vagrant-Builder</title><link>https://purpleidea.com/blog/2015/02/23/building-rhel-vagrant-boxes-with-vagrant-builder/</link><description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Vagrant_%28software%29"&gt;Vagrant&lt;/a&gt; is a great tool for development, but &lt;a href="https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux"&gt;Red Hat Enterprise Linux&lt;/a&gt; (RHEL) customers have typically been left out, because it has been impossible to get RHEL boxes! It would be extremely elegant if hackers could quickly test and prototype their code on the same OS as they&amp;rsquo;re running in production.&lt;/p&gt;
&lt;p&gt;Secondly, when hacking on projects that have a long initial setup phase (eg: a long rpm install) it would be excellent if hackers could roll their own modified base boxes, so that certain common operations could be re-factored out into the base image.&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Tue, 24 Feb 2015 00:48:39 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/02/23/building-rhel-vagrant-boxes-with-vagrant-builder/</guid></item><item><title>Eve 0.5.2 ‘Giulia’ is Out</title><link>https://nicolaiarocci.com/eve-0-5-2-giulia-is-out/</link><description>&lt;p&gt;&lt;a href="https://pypi.python.org/pypi/Eve"&gt;Eve 0.5.2&lt;/a&gt; has just been released with a bunch of interesting fixes and documentation updates. See the &lt;a href="http://python-eve.org/changelog#version-0-5-2"&gt;changelog&lt;/a&gt; for details.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 23 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/eve-0-5-2-giulia-is-out/</guid></item><item><title>Delete Government-Linked Certificate Authorities in OSX</title><link>https://smcleod.net/2015/02/delete-government-linked-certificate-authorities-in-osx/</link><description>&lt;p&gt;&lt;a href="http://zitseng.com/archives/7489"&gt;Inspired by http://zitseng.com/archives/7489&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/sammcj/delete-unknown-root-ca"&gt;Source (Github)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;WARNINGS&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do not run unless you understand what this is doing&lt;/li&gt;
&lt;li&gt;The CA system is broken by design - This is not a fix for that&lt;/li&gt;
&lt;li&gt;This is merely a band-aid for those interested or concerned about these root CAs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x delete_gov_roots.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./delete_gov_roots.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll be prompted for your password as root access is required to delete system-wide root certs.&lt;/p&gt;
&lt;p&gt;&lt;img alt="sha1" src="https://cloud.githubusercontent.com/assets/862951/6326428/a261ae24-bba5-11e4-9f69-5aeb36257077.png" /&gt;&lt;/p&gt;
&lt;h2 id="see-also"&gt;See Also&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://convergence.io"&gt;http://convergence.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/certificate-patrol/"&gt;https://addons.mozilla.org/en-US/firefox/addon/certificate-patrol/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kirei/catt"&gt;https://github.com/kirei/catt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.eff.org/observatory"&gt;https://www.eff.org/observatory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=478418"&gt;https://bugzilla.mozilla.org/show_bug.cgi?id=478418&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://support.apple.com/en-us/HT202858"&gt;http://support.apple.com/en-us/HT202858&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning"&gt;https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>smcleod.net</author><pubDate>Mon, 23 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/delete-government-linked-certificate-authorities-in-osx/</guid></item><item><title>On your mark, get set, crawl!</title><link>https://liza.io/on-your-mark-get-set-crawl/</link><description>&lt;p&gt;In my previous post I wrote about rethinking racing (aka ripping out the existing racing system).&lt;/p&gt;
&lt;p&gt;Today I got most of the work done on that. There is a lot left to do, but as of right now:&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Mon, 23 Feb 2015 01:02:36 GMT</pubDate><guid isPermaLink="true">https://liza.io/on-your-mark-get-set-crawl/</guid></item><item><title>Return value optimization in C++</title><link>https://bastian.rieck.me/blog/2015/return_value_optimization/</link><description>&lt;p&gt;It is very common—not only in object-oriented programming—to have functions that
generate a potentially complicated object (based on the input parameters) or modify a given one
without changing the original object. For example, suppose we have a class &lt;code&gt;Foo&lt;/code&gt; that stores
integers and want to construct a new &lt;code&gt;Foo&lt;/code&gt; object for storing a given number. There are two ways for
writing such a method:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 1st way
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Usage: Foo foo = f(42);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 2nd way
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Usage:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//   Foo foo;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//   g(foo, 42);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, to be honest, I always cringe when I see the second way implemented. It just looks
unnatural—why should I modify a given object when I essentially want a new one to be stored?
The way &lt;code&gt;g()&lt;/code&gt; is implemented seems to rather clumsy. Ostensibly, this implementation is faster
because it does not involve creating a new &lt;code&gt;Foo&lt;/code&gt; instance, setting its values, and copying it into a
new object. Is this really true, though? Let&amp;rsquo;s find out:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;__PRETTY_FUNCTION__&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;__PRETTY_FUNCTION__&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;": "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;__PRETTY_FUNCTION__&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;__PRETTY_FUNCTION__&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;": "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"f:"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"g: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Using gcc 4.9.2, this produces the following output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;f:
        Foo::Foo(unsigned int): 42
g: 
        Foo::Foo()
        void Foo::set(unsigned int): 42
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Darn. The copy constructor is not called. What manner of sorcery is this? This procedure is known as
&lt;em&gt;return value optimization&lt;/em&gt;. The compiler &lt;em&gt;may&lt;/em&gt;, in certain situations, omit a copy operation of
classes. This is one such situation. The object created within &lt;code&gt;f()&lt;/code&gt; is a temporary and will not be
required afterwards. A stupid compiler would create the object (one constructor call), return it,
and call the copy operator of the second object (another constructor call). However, since the
object within &lt;code&gt;f()&lt;/code&gt; is not used afterwards, a smarter compiler can skip the whole shebang and simply
create &lt;em&gt;one&lt;/em&gt; object with the appropriate constructor call.&lt;/p&gt;
&lt;p&gt;For the curious, we can disable this behaviour by setting the gcc flag &lt;code&gt;-fno-elide-constructors&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ g++ -fno-elide-constructors rvo.cc
$ ./a.out
f:
        Foo::Foo(unsigned int): 42
        Foo::Foo(const Foo&amp;amp;)
        Foo::Foo(const Foo&amp;amp;)
g: 
        Foo::Foo()
        void Foo::set(unsigned int): 42
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yikes! This is terrible, but at least the expected behaviour. Does this &lt;em&gt;always&lt;/em&gt; work? As it turns
out, no. It very much depends on the compiler you are using. For example, a standard example in
which the return value optimization &lt;em&gt;might&lt;/em&gt; not work is when multiple execution paths are present,
like in this example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;However, my tests with gcc 4.9.2 indicate that at least this very simple example does &lt;em&gt;not&lt;/em&gt; yet fool
the compiler. Thus, I can only conclude that we should give the compiler more credit instead of
assuming that a certain idiom &amp;ldquo;naturally&amp;rdquo; results in better performance (as the proponents of the
second way are wont to do). In the words of &lt;a href="https://mitpress.mit.edu/sicp/front/node3.html"&gt;Abelson and Sussman&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[&amp;hellip;] Thus, programs must be written for people to read, and only incidentally for machines to
execute.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In C++11, there is an additional optimization available in the form of &lt;em&gt;move constructors&lt;/em&gt; (and
&lt;em&gt;move assignment operators&lt;/em&gt;, which I will not cover):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;__PRETTY_FUNCTION__&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;": "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The move constructor is called for rvalue references. When disabling return value optimization, we
can see that this constructor is called instead of the usual copy constructor:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ g++ -fno-elide-constructors -std=c++11 rvo.cc
$ ./a.out
f:
Foo::Foo(unsigned int): 42
Foo::Foo(Foo&amp;amp;&amp;amp;): 42
Foo::Foo(Foo&amp;amp;&amp;amp;): 42
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Thus, the moral of the story is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Do not worry about the return values.&lt;/li&gt;
&lt;li&gt;If your implementation permits it, use move constructors to achieve a better performance when the
compiler is unable to use return value optimization.&lt;/li&gt;
&lt;li&gt;Measure whether a purported optimization really has an effect.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In C++17, this construction got another intriguing update. The situation
described above deals with a so-called &lt;code&gt;prvalue&lt;/code&gt;, i.e. a &amp;lsquo;pure&amp;rsquo;
&lt;code&gt;rvalue&lt;/code&gt;. The standard was amended as follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In C++17, copy elision was made &lt;strong&gt;mandatory&lt;/strong&gt; in some situations, and that
required separation of prvalue expressions from the temporary objects
initialized by them, resulting in the system we have today. Note that,
in contrast with the C++11 scheme, &lt;strong&gt;prvalues are no longer moved from&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hence, if you run this code with C++17, you will get the following output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ g++ -fno-elide-constructors -std=c++17 rvo.cc
f:
    Foo::Foo(unsigned int): 42
    Foo::Foo(Foo&amp;amp;&amp;amp;): 42
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Even with constructor elision, you have only a single move operation,
namely the one induced by creating an object in &lt;code&gt;f&lt;/code&gt; and returning it
afterwards. If you were to return the object directly, the new standard
would enforce that &lt;em&gt;no&lt;/em&gt; copy would be created. I am always amazed how
C++ continues to move forward. The Times they are a-changin&amp;rsquo;&amp;hellip;&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 22 Feb 2015 20:57:43 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/return_value_optimization/</guid></item><item><title>The Boxtrolls</title><link>https://olshansky.info/movie/the_boxtrolls/</link><description>Olshansky's review of The Boxtrolls</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 22 Feb 2015 18:28:14 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_boxtrolls/</guid></item><item><title>Snowpiercer</title><link>https://olshansky.info/movie/snowpiercer/</link><description>Olshansky's review of Snowpiercer</description><author>🦉 olshansky 🦁</author><pubDate>Sun, 22 Feb 2015 18:27:26 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/snowpiercer/</guid></item><item><title>Information equals matter</title><link>http://dimitarsimeonov.com/2015/02/22/information-equals-matter</link><description>&lt;p&gt;As humans, we pride ourselves of being able to pass information and culture to the future generations. We think, that since we invented written words, the printing press, and the internet, we have invented information. We haven’t. Many other animals successfully transfer information in their communities, over multiple generations. Take the example of a young leopard learning to hunt from his mother. Initially, the hunting skill and information exists in the mother’s head, in form of neuron connections and electrical impulses. Part of it exists in the shape of the leopard’s body, its agility and strength. Later, the mother is hunting, photons reflect from her body, and hit the eye of the son, exciting receptors in the eye, and then creating neural impulses to the son’s brain. He attempts hunting on his own, getting more photons from missed targets, taste particles from successful ones and ends up with a modified version of the original information, encoded by the particles in his brain, and the shape of his body.
All the steps in the process of information transfer are physical and happen in our physical reality, and not in some imaginary world. Information, at any part of the process, not only can be represented as positions and states of various physical particles, it &lt;em&gt;is&lt;/em&gt; the positions and states of the physical particles.&lt;/p&gt;

&lt;p&gt;Information wasn’t always physical. At least from my point of view. I grew up as math and computers nerd, thinking abstractly about many things, including information. Information was even more special to me as it was so universal, able to represent virtually anything. I regarded it as something transcendental, even divine. But considering the hunting leopards example, made me consider information as something less transcendental. I started imagining more examples, and in all of them information was fully physical. When we talk, the sound waves travel physically by moving air particles. Sound doesn’t exist in vacuum because there is no physical matter in it to carry the sound. Information in computers is the physical state of the electrons in the RAM or the hard disk. The story about Bilbo the hobbit began as a set of neural impulses in JRR Tolkien’s head, then developed itself into ink on paper in a specific shape to become a famous book. Later, it became electrically encoded into the head of a script-writer, who created a movie script, typing on a computer, change memory as electric impulses, which pushed other electric impulses and travelled as an optic signal to a remote computer where it got transformed again as physical computer memory and then photons emitted from the displays of the actors and staff in the movie. The actors then acted, creating photons, which affected the physical state of the atoms in the camera’s receptors. Then after another computer-screen-eye cycle, the information got in our eyes as we watched the movie.&lt;/p&gt;

&lt;p&gt;The visceral realization that information is very physical and tangible changed two beliefs in my head. The first major change, is to remove information from its imaginary pedestal. Realizing that I can fully represent all information as something physical  made me address information less as something imaginary and pristine and more as something that is a part of our dirty, messy and imperfect physical world.  The second major change, reversely, emancipated the physical reality. Considering information at the same level as the tangible reality, gives a lot of meaning to all kinds of physical objects, as carriers of rich information.&lt;/p&gt;

&lt;p&gt;I look at a chair in front of me. Its shape, color and materials encode a lot of information about the person and company who made it. The chair is made of hollow metal tubes, some larger and others smaller. The larger ones are used to create structural support, while the smaller ones are used to provide comfort for the reclining back, at a lower price. The seating area is cushioned. It is the area that is most often in use of the chair so most resources have gone into increasing its quality than in the rest of the chair. The chair has four legs. Each front leg is connected with the corresponding back leg via metal pipe to increase structural strength. This allows the person seating on the chair to bring their legs back under the chair if they want to… There is so much information encoded in the mundane objects around us, in a non-obvious way.&lt;/p&gt;</description><author>D13V</author><pubDate>Sun, 22 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2015/02/22/information-equals-matter</guid></item><item><title>How Cryptology Can Fix Identity Theft</title><link>https://ntietz.com/blog/how-cryptology-can-fix-identity-theft/?utm_source=atom&amp;utm_medium=feed</link><description>&lt;p&gt;Identity theft is a huge problem, costing Americans more than &lt;a href="https://www.fas.org/sgp/crs/misc/R40599.pdf"&gt;$4.5 billion in 2012&lt;/a&gt;. Identity theft victims frequently lose time and money and undergo significant mental hardships while dealing with the fallout. It can happen a few different ways, but one large attack vector is through the identity verification process.&lt;/p&gt;
&lt;p&gt;Every time your identity is verified, one of the following mechanisms is probably used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an array of challenge questions ("what were your last two addresses?")&lt;/li&gt;
&lt;li&gt;submitting a copy of a physical document (passport or id card)&lt;/li&gt;
&lt;li&gt;providing your Social Security number (SSN)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of these come with problems. They are subject to two main attack vectors: social engineering, where a bad actor may trick you into giving up this information to them directly; or bad actors within a legitimate organization that you have to provide the information to. The second attack vector is far more insidious, since you cannot do anything to prevent it. If you submit your SSN with a form at your local community college and an employee handling the form copies it down, it is lost -- but you had no choice and &lt;em&gt;had&lt;/em&gt; to include the SSN.&lt;/p&gt;
&lt;p&gt;Let's back up. What's the big problem here? Why are these mechanisms weak?&lt;/p&gt;
&lt;p&gt;There are two classical problems in secure communications: authentication and encryption. &lt;em&gt;Authentication&lt;/em&gt; is proving your identity. &lt;em&gt;Encryption&lt;/em&gt; is protecting a message from all but the intended recipients. Together, these let you send messages which cannot be intercepted and can be demonstrated to be from you, not an impostor.&lt;/p&gt;
&lt;p&gt;Traditional identity verification mechanisms are just means of &lt;em&gt;authenticating&lt;/em&gt; your requests. These are based on shared information. Essentially, both Alice and Bob must have the same information to verify that Alice really is who she claims to be. Here's the problem: that means that Bob can then go to Mark and say "Hi, I'm Alice, here's proof!" and Mark would be fooled.&lt;/p&gt;
&lt;p&gt;Solving this problem requires switching to an asymmetric information system. This is the same way that your bank's website proves that it is legitimate. A central authority, called the certificate authority (CA), issues a certificate to the bank. The bank holds private information it can use to sign a message (their private key), and then your browser checks the signature using the public certificate from the CA. No one else can impersonate the bank, because no one else has the bank's private key.&lt;/p&gt;
&lt;p&gt;We can do the same thing for identity verification for people. With a central "Personal Identity Authority" (such a name evokes some dystopian imagery), we could issue every person a private and public key. The public keys would all be recorded so that anyone could see everyone else's public keys, but private keys would be held only be each individual. Then, identity proof would be done by a simple process. Imagine that Bob wants to verify Alice's identity:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Bob would send Alice a short message (randomly generated, and unique each time).&lt;/li&gt;
&lt;li&gt;Alice would encrypt this message using her private key and send it back to Bob.&lt;/li&gt;
&lt;li&gt;Bob would retrieve Alice's public key and use it to decrypt Alice's message.&lt;/li&gt;
&lt;li&gt;If the received message matches the original one, then Alice is who she claims to be.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This system would be technically sound and would result in both far more secure identities and much higher confidence identity verification. However, it comes with problems of its own.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Software systems would be necessary to implement the system. People can't encrypt random messages with large keys by hand. These systems are not awfully difficult to make (in fact, they already exist) but getting them integrated into everyone's phone, laptop, browser, and all the services they use, would be a significantly challenging endeavor.&lt;/li&gt;
&lt;li&gt;People would lose their private keys. If someone breaks their laptop or phone and their private key is lost, how would a new one be reissued? If you can use an old technique, like your SSN, to get a new key, then what would stop an attacker from simply pretending to be you and getting a new public/private key pair associated with your identity?&lt;/li&gt;
&lt;li&gt;People can have their private keys stolen. This could happen through security holes in their laptops and phones, or through social engineering to convince people to give up their private keys voluntarily.&lt;/li&gt;
&lt;li&gt;A great deal of trust is now placed in one central authority. This authority must be trusted not just to manage your identity, but also to be responsible with a lot of information. All requests for your public key would be signals that you are authenticating in different places (Facebook wants your public key? That is a signal that you just used Facebook.), so the central authority would have a new wealth of tracking data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope that within my lifetime, I can see symmetric information stop being used for identity verification. However, I also hope that these issues can be solved well &lt;em&gt;before&lt;/em&gt; we implement any such system.&lt;/p&gt;</description><author>ntietz.com blog - technically a blog</author><pubDate>Sun, 22 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ntietz.com/blog/how-cryptology-can-fix-identity-theft/?utm_source=atom&amp;utm_medium=feed</guid></item><item><title>The Beginning of Something</title><link>https://ntietz.com/blog/the-beginning-of-something/?utm_source=atom&amp;utm_medium=feed</link><description>&lt;p&gt;It seems like everyone in the software industry goes through a blogging phase. This is the beginning of mine.&lt;/p&gt;
&lt;p&gt;I have started this blog time and time again over the last three years. My original inspiration for having a technical blog came from one of my &lt;a href="http://caseystella.com"&gt;mentors&lt;/a&gt; at my internship. The continued inspiration is from people telling me that I sometimes make insightful comments.&lt;/p&gt;
&lt;p&gt;This blog is not fully formed in my head yet, but I have some very broad topics that I want to address over time: data privacy, mental health, education, ethics, and life. I also intend to cover a smattering of technical topics. What I cover will certainly deviate from this, but it's somewhere to start.&lt;/p&gt;</description><author>ntietz.com blog - technically a blog</author><pubDate>Sun, 22 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ntietz.com/blog/the-beginning-of-something/?utm_source=atom&amp;utm_medium=feed</guid></item><item><title>Run a website on the Raspberry Pi using Middleman</title><link>https://blog.tafkas.net/2015/02/22/run-a-website-on-the-raspberry-pi-using-middleman/</link><description>Once you have set-up a web server like Apache or nginx running on the Raspberry Pi it is time to create a website. From here there a several options: A CMS that relies on a database, some purely manual crafted pages or a static pages generated by a script. I chose the latter for some reasons.
Static sites have a lot of advantages:
 no database to slow requests down offer greater security, as they do not contain dynamic content, so are immune to the most common attacks flat, text files, makes them ideal to be used with version control systems, such as Git low footprint on the server as serving raw html files  But there also some limitations:</description><author>Tafkas Blog</author><pubDate>Sun, 22 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tafkas.net/2015/02/22/run-a-website-on-the-raspberry-pi-using-middleman/</guid></item><item><title>Rethinking racing. Also cool snail art!</title><link>https://liza.io/rethinking-racing.-also-cool-snail-art/</link><description>&lt;p&gt;Racing in Gastorpoda has been implemented for months in its most basic state, but has never really gotten the attention it needs. So things like jars, in-jar positioning, and movement ended up evolving past the stage of the racing and making the current racing system kind of an outdated one.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Sat, 21 Feb 2015 11:45:53 GMT</pubDate><guid isPermaLink="true">https://liza.io/rethinking-racing.-also-cool-snail-art/</guid></item><item><title>Foxcatcher</title><link>https://olshansky.info/movie/foxcatcher/</link><description>Olshansky's review of Foxcatcher</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 21 Feb 2015 07:32:17 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/foxcatcher/</guid></item><item><title>My To-Do List Framework</title><link>https://solomon.io/todo-list-framework/</link><description>When I joined Red Square in 2013 the office used different pieces of software to keep track of daily tasks.</description><author>Sam Solomon</author><pubDate>Sat, 21 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/todo-list-framework/</guid></item><item><title>C# XML Cleaner Regex</title><link>https://boyter.org/2015/02/c-xml-cleaner-regex/</link><description>&lt;p&gt;One of the most annoying things I deal with is XML documents with invalid characters inside them. Usually caused by copy pasting from MS Word it ends up with invisible characters that you cannot easily find and cause XML parsers to choke. I have encountered this problem enough that I thought a quick blog post would be worth the effort.&lt;/p&gt;
&lt;p&gt;As such here mostly for my own reference is a regular expression for C# .NET that will clean invalid XML characters from any XML file.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Fri, 20 Feb 2015 00:41:47 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/02/c-xml-cleaner-regex/</guid></item><item><title>The Poor Man's Voxel Engine</title><link>https://etodd.io/2015/02/18/the-poor-mans-voxel-engine/</link><description>&lt;p&gt;
This is not a tutorial. It's a story. A Voxel Odyssey.
&lt;/p&gt;
&lt;p&gt;
The story starts with 19 year old me in a dorm room next to the Ohio State
stadium. I don't have the repo from this stage of development (SVN at the
time), but I remember the process clearly.
&lt;/p&gt;
&lt;figure&gt;
	&lt;a href="https://etodd.io/assets/9Ob8Tla.jpg"&gt;&lt;img src="https://etodd.io/assets/9Ob8Tlal.jpg" /&gt;&lt;/a&gt;
	&lt;figcaption&gt;&lt;a href="http://www.osu.edu/imageoftheday/index.php?pick=2009-04-13"&gt;Photo by Kristen Sutton&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;
XNA 4 comes out in
&lt;a href="http://blogs.msdn.com/b/shawnhar/archive/2010/09/18/10063476.aspx"&gt;September 2010&lt;/a&gt;.
I immediately dive in. This turns out to be a poor life decision.
&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Wed, 18 Feb 2015 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/02/18/the-poor-mans-voxel-engine/</guid></item><item><title>A product management blueprint</title><link>/2015/02/18/A-product-management-blueprint/</link><description>&lt;p&gt;I find myself having more conversations with startups – both small and large – about product management. I&amp;rsquo;ve blogged about some of &lt;a href="http://www.craigkerstiens.com/2013/03/13/planning-and-prioritizing/"&gt;the tools&lt;/a&gt; in my chest here but I haven&amp;rsquo;t talked much about my “blueprint” for product management, which I find myself laying out in many conversations over coffee. What follows is this process I’ve used a few times over with new teams to get product and engineering moving together, shipping in a predictable manner, and tackling bigger and more strategic projects.&lt;/p&gt;
&lt;h3 id="trust"&gt;
&lt;div&gt;
Trust
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;I need to know how to work with my team, what their working styles are, and how we interact. This starts by simply interacting – specifically, outside of the office. I heard a similar opinion recently from Chris Fry (who ran engineering at Salesforce and Twitter) when he remarked something to the effect of: “you can tell a good PM from a bad one based on if he goes to drinks with his team.” Without getting hung up on whether it’s beers or coffee, it’s more about socialization with your team and time outside the office. My personal approach: expect a dinner invite over to my place when I take on running product for a new team.&lt;/p&gt;
&lt;h3 id="velocity"&gt;
&lt;div&gt;
Velocity
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Once you&amp;rsquo;ve started to build some rapport, it&amp;rsquo;s time to get down to business. If being able to quickly commit and ship something isn’t a problem for you, then it’s easy to just assume this is working. In reality most teams I encounter that need PM support don’t have shipping nailed down. You probably already know if you fall into that category of feeling like you can commit and ship vs. not, so if you’re not able to do that a few tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There’s some projects that everyone wants to ship that’s been tried over and over, &lt;strong&gt;don’t tackle that first&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Shipping something is better than nothing. It doesn&amp;rsquo;t have to be the right thing.&lt;/li&gt;
&lt;li&gt;Sometimes you don&amp;rsquo;t have to ship something to get velocity, you can launch things you already have&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Kill scope&lt;/del&gt; Test things earlier and more iteratively, the more you can validate or try something without requiring a large investment the more everyone feels better about the direction you’re heading.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key here is to commit to projects, deliver, and move on. Your velocity depends solely on delivery, not tasks, not sprints, not projects, etc. If you haven’t shipped anything in a year, then your velocity for the year is zero. At a later point you should move from the focus on shipping anything to shipping the right things, it’s more important to ship 1 thing that moves the needle than 10 that don’t, but that’s a later concern.&lt;/p&gt;
&lt;h3 id="killing-things"&gt;
&lt;div&gt;
Killing things
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;On the note of killing scope&amp;hellip; I&amp;rsquo;ve heard it articulated at times, that some engineers are happy when certain PMs show up because it means less work for them. When you go over to an engineer’s desk are you creating more or less work? The answer should be less some large percentage of the time. If you can find a way to accomplish your goals with less effort, it&amp;rsquo;s always a win. Every project everywhere always needs more time or money, what’s more innovative is how you can help a project to ship without one of those two.&lt;/p&gt;
&lt;p&gt;At a broader perspective than just scope – one of the biggest ways product can help engineering is by pushing harder for killing off features and the scope of a product. There&amp;rsquo;s a good test on if something is ready to ship: if you &lt;a href="http://www.craigkerstiens.com/2014/08/13/when-to-ship-when-to-kill/"&gt;tell beta users you&amp;rsquo;re killing it&lt;/a&gt; and they yell at you that you shouldn’t kill it, then it’s ready to ship.&lt;/p&gt;
&lt;p&gt;If you’ve already shipped things, but they’re not delivering value or not being used, kill them. It’s that simple, it may have been a great idea at the time, but either invest in making sure it’s used or kill it so you don’t have to maintain it.&lt;/p&gt;
&lt;h3 id="roadmap-planning"&gt;
&lt;div&gt;
Roadmap planning
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;Usually getting velocity and killing things takes 3-6 months to really take full effect. At this point a team feels like they&amp;rsquo;re not under a pile of technical debt, and they can commit to shipping projects. This is the point when product and engineering are melding and you can really start to have fun about where you&amp;rsquo;re headed. At this point I&amp;rsquo;ve seen a huge mix of where engineers are more actively or less actively engaged in this process. And the reality is this is everyone’s job to be thinking about where you&amp;rsquo;re headed as a company – at least that&amp;rsquo;s the case for any company that classifies itself as a startup.&lt;/p&gt;
&lt;p&gt;My favorite tool for this is a team gridding exercise, you can read more about this &lt;a href="http://www.craigkerstiens.com/2013/03/13/planning-and-prioritizing/"&gt;here&lt;/a&gt; and &lt;a href="http://www.craigkerstiens.com/2013/08/13/rule-of-thirds/"&gt;here&lt;/a&gt;. This is often best conducted at an off-site where you have an opportunity for casual conversation which can foster broader thinking beyond the obvious bug fixes or smaller product improvements.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;One item of note I&amp;rsquo;ve heard from teams that have done this or similar exercises is they still have trouble deciding what to do after the fact. The role of product is to get to that decision. The most important part is getting to a decision and not the perfect one, gather data, decide, revisit as you go along. All of this isn’t to say that it’s an arbitrary decision, customers, data all inform that as well as the effort to impact matrix exercise, but in the end a clear direction isn’t executed on consensus.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="in-conclusion"&gt;
&lt;div&gt;
In conclusion
&lt;/div&gt;
&lt;/h3&gt;
&lt;p&gt;There’s really no end or done when it comes to the role and the work.&lt;/p&gt;
&lt;p&gt;There’s always another milestone and the market is always moving around you. But once you’re able to execute predictably and think in an ordered sense about your roadmap, you’re in a position to be able to monitor and adapt to the market, and even more so experiment and shape the market yourself. At that point you have to keep doing it and then the hard part becomes finding ways of keeping a fresh perspective &lt;em&gt;protip: customers are an important part of that equation&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Have tips/tricks/practices that I completely missed here or that you disagree with? I’m always happy to talk with others so drop me a note &lt;a href="mailto:craig.kerstiens@gmail.com"&gt;craig.kerstiens@gmail.com&lt;/a&gt;.&lt;/p&gt;</description><author>CRAIG KERSTIENS</author><pubDate>Wed, 18 Feb 2015 22:55:56 GMT</pubDate><guid isPermaLink="true">/2015/02/18/A-product-management-blueprint/</guid></item><item><title>Programming languages in a nutshell</title><link>https://honza.pokorny.ca/2015/02/programming-languages-in-a-nutshell/</link><description>&lt;h2 id="python-ruby"&gt;Python, Ruby&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;concurrency lol&lt;/li&gt;
&lt;li&gt;packaging lol&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="golang"&gt;Golang&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;lol if you don&amp;rsquo;t like typing &lt;code&gt;err :=&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;y u no generics&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lol imports&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="haskell"&gt;Haskell&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;need PhD&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;will never be mainstream&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="idris"&gt;Idris&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;only for concating lists&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="erlang"&gt;Erlang&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;lol syntax&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="javascript"&gt;Javascript&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;javascript&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="rust"&gt;Rust&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;how do I do x this week?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="clojure"&gt;Clojure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;let me know when the program has started running&lt;/li&gt;
&lt;li&gt;lol if you want to build a secure thing on the web&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="scala"&gt;Scala&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;lol if you think this actually improves java&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="php"&gt;PHP&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;which of these 10 fns should I use?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ocaml"&gt;OCaml&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;haskell without the awesome&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="prolog"&gt;Prolog&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mucho problemo&lt;/li&gt;
&lt;/ul&gt;</description><author>Honza Pokorný</author><pubDate>Wed, 18 Feb 2015 16:34:00 GMT</pubDate><guid isPermaLink="true">https://honza.pokorny.ca/2015/02/programming-languages-in-a-nutshell/</guid></item><item><title>Markdown editors are an anti-pattern</title><link>https://honza.pokorny.ca/2015/02/markdown-editors-are-an-anti-pattern/</link><description>&lt;p&gt;In the last year or so, there seems to have been an explosion of markdown
editors and markdown previewers.  A quick Google search reveals &lt;a href="http://dillinger.io/"&gt;so&lt;/a&gt;, &lt;a href="https://stackedit.io/"&gt;many&lt;/a&gt;
of &lt;a href="http://jbt.github.io/markdown-editor/"&gt;them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The App Store is also full of these kinds of apps, promising you unrivaled
productivity and writing bliss.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://honza.pokorny.ca/images/app-store-markdown.png" /&gt;But, I would submit to you that all of these apps miss the point of markdown.
From the &lt;a href="http://daringfireball.net/projects/markdown/"&gt;markdown project page&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The overriding design goal for Markdown&amp;rsquo;s formatting syntax is to make it
as readable as possible. The idea is that a Markdown-formatted document
should be publishable as-is, as plain text, without looking like it&amp;rsquo;s been
marked up with tags or formatting instructions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The syntax (or lack thereof) of the markdown format is so simple that there is
no need to &amp;ldquo;preview&amp;rdquo; the result.  A heading looks like a heading.  A list looks
like a list.&lt;/p&gt;
&lt;p&gt;This is a prime example of creating a solution to a problem that doesn&amp;rsquo;t exist.
The reason why these apps are popular and people buy them has less to do with
the need to preview markdown and more with the hisperized culture of writing
for the web.&lt;/p&gt;</description><author>Honza Pokorný</author><pubDate>Wed, 18 Feb 2015 16:08:00 GMT</pubDate><guid isPermaLink="true">https://honza.pokorny.ca/2015/02/markdown-editors-are-an-anti-pattern/</guid></item><item><title>Git conflict resolution déjà vu?</title><link>https://xenodium.com/git-conflict-resolution-deja-vu</link><description>&lt;p&gt;use git &lt;a href="http://git-scm.com/blog/2010/03/08/rerere.html"&gt;rerere&lt;/a&gt;. here's a &lt;a href="https://medium.com/@porteneuve/fix-conflicts-only-once-with-git-rerere-7d116b2cec67"&gt;post&lt;/a&gt;.&lt;/p&gt;</description><author>xenodium.com @alvaro</author><pubDate>Wed, 18 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/git-conflict-resolution-deja-vu</guid></item><item><title>Snail brain semi-stable and reviewing visual traits set during breeding</title><link>https://liza.io/snail-brain-semi-stable-and-reviewing-visual-traits-set-during-breeding/</link><description>&lt;p&gt;The snail brain, while still very basic, seems somewhat stable now. By &amp;ldquo;stable&amp;rdquo; I mean a snail can survive and reproduce without human intervention if it has a steady supply of food.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Tue, 17 Feb 2015 01:00:17 GMT</pubDate><guid isPermaLink="true">https://liza.io/snail-brain-semi-stable-and-reviewing-visual-traits-set-during-breeding/</guid></item><item><title>Wikitropolis: The Link Structure of Wikipedia</title><link>https://faingezicht.com/projects/2015/02/16/wikitropolis/</link><description>This past fall I had the chance to take a course called **Data as Art**, which paired up Northwestern University engineering students with artists from the School of the Art Institute of Chicago (SAIC) to pursue a data-driven art project. I saw the class as an opportunity to work on an interdisciplinary team and tackle a subject generally experienced in the abstract digital world, but expressing it in a physical form instead. The course did not only accomplish this, but in the process it also allowed me to better understand and overcome the obstacles that appear when bringing people from diverse academic backgrounds together for a common goal.

During one of the first class sessions, the faculty members told us about their research, and suggested data sets we could work with. We were given ideas to play with at the intersections of computer science with &lt;a href="http://music.cs.northwestern.edu/research.php'"&gt;music&lt;/a&gt;, &lt;a href="http://collablab.northwestern.edu/"&gt;communication&lt;/a&gt;, but the projects we would work on were completely open ended, and students were allowed to form groups based on their interests. I knew I wanted to work with Wikipedia data, and those interested in the subject gravitated towards each other as we brainstormed: how can you visualize this huge system? It had been tried &lt;a href="'http://seealso.org/"&gt;many&lt;/a&gt; &lt;a href="http://infodisiac.com/Wikimedia/Visualizations/"&gt;times&lt;/a&gt; before, and we wanted to do something different.

My group was particularly interested in the structure of Wikipedia, and how by using only the network formed by its hyperlinks, we could derive a proxy to explain the underlying content, and how its readers experienced it. At first, the task seemed daunting. To ground the concept in a way that most observers could relate to it, we decided to focus on the idea of the city, **as represented in Wikipedia**. Specifically, we decided to study global cities, and show what was unique about each one, as inferred by a computer algorithm from their articles' hyperlinks. The choice was arbitrary, as the same procedure could give us insights across domains if applied to different data sets (i.e., the same algorithm could have revealed patterns in any other category: books, animals, universities, etc.)

Once we established our end goal, we scraped the Wikipedia articles for over fifty global cities ranked in the "alpha" and "beta" categories of the &lt;a href="http://en.wikipedia.org/wiki/Global_city#Studies"&gt;Globalization and World Cities Research Network Study&lt;/a&gt;, and developed software to analyze them. The full article text was fed to our program, which extracted the hyperlinks in each article, and processed each one by giving them a numeric *relatedness* value, utilizing an information retrieval method called &lt;a href="http://en.wikipedia.org/wiki/Tf%E2%80%93idf"&gt;tf-idf weighting&lt;/a&gt; (term-frequency/inverse-document-frequency).

With these scores in hand, we quickly honed in on a visual that would allow us to communicate the importance of each hyperlink to its parent article: screenshots of the Wikipedia articles for each of the selected cities, but with the text whited out, and its images blurred, putting all the attention on the links. To accentuate the idea of uniqueness, we mapped each link’s score to a palette of blue hues in the printout. Darker colors meant higher tf-idf values. For example "Millenium Park" or "The L" are uniquely relevant to Chicago, so they are dark blue, but the links to "Park" or "Transportation System" appear in many different cities, and they would appear in the lighter colored blue tones.

![tokyo](https://cdn.faingezicht.com/wikitropolis/tokyo.png)
&lt;small&gt;Partial renderings of the prints for the Tokyo tower.&lt;/small&gt;

With the visual representation of the data defined, we had to decide on the form in which we would present it, and the team was set on the idea of having very well defined physical objects. Our final result was a collection of **four-sided pillars**, with printouts of the whited-out Wikipedia articles for **New York, Chicago, London, Tokyo and Paris** attached on their front and back, and a different layout on their two sides, showing the links sorted by their scores, and forming a color gradient, which provided a non-didactic explanation of the content of our pieces. The skyline shape of the towers inspired the project's name: **Wikitropolis**.

![ford](https://cdn.faingezicht.com/wikitropolis/ford.jpg)
&lt;small&gt;The exhibit opening at the Ford Engineering Design Center.&lt;/small&gt;

For someone who is used to working in the digital medium, building the pillars was quite a challenge. The cost of iteration when working in the digital world is minimal (you refresh your browser and things have changed) but this was not the case for the physical towers we built. Everything, from choosing the materials, deciding on sizes, and even printing the designs, required tremendous attention to detail. Even though we had ups and downs, as we learned to measure twice and cut once during the design process, our project was a success and our piece caught a lot of attention.

Our artwork, together with the other three teams' pieces, was exhibited at a gallery at SAIC for two weeks at the beginning of December, and this Friday marks the end of its month long stint at the Ford Engineering Design Center at Northwestern. I couldn’t be more proud of my team’s achievement.

&lt;img src="https://cdn.faingezicht.com/wikitropolis/team.jpg" /&gt;
&lt;small&gt;The team at the SAIC exhibit. From left to rigth: Kevin, Leon, myself, Paola and Ryan.&lt;/small&gt;

The projects were covered by the McCormick School of Engineering's magazine, &lt;a href="http://www.mccormick.northwestern.edu/news/articles/2014/12/schools-collaborate-to-turn-information-into-art.html"&gt;here&lt;/a&gt;. The high resolution prints can be downloaded &lt;a href="https://www.dropbox.com/sh/zaiq6fsl2xpgiw1/AACh95rF_ChOx0scBIb7uhcpa?lst"&gt;here&lt;/a&gt;.</description><author>Avy Faingezicht</author><pubDate>Mon, 16 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://faingezicht.com/projects/2015/02/16/wikitropolis/</guid></item><item><title>Building a high performance SSD SAN - Part 1</title><link>https://smcleod.net/2015/02/building-a-high-performance-ssd-san-part-1/</link><description>&lt;p&gt;&lt;img src="https://smcleod.net//img/san/graphs.png" /&gt;&lt;/p&gt;
&lt;p&gt;Over the coming month I will be architecting, building and testing a modular, high performance SSD-only storage solution.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll be documenting my progress / findings along the way and open sourcing all the information as a public guide.&lt;/p&gt;
&lt;p&gt;With recent price drops and durability improvements in solid state storage now is better time than any to ditch those old magnets.&lt;/p&gt;
&lt;p&gt;Modular server manufacturers such as SuperMicro have spent large on R&amp;amp;D thanks to the ever growing requirements from cloud vendors that utilise their hardware.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Mon, 16 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/building-a-high-performance-ssd-san-part-1/</guid></item><item><title>Regular Expressions are Fast, Until they Aren't</title><link>https://boyter.org/2015/02/regular-expressions-fast/</link><description>&lt;p&gt;TL/DR: Regular expressions are fast, until they aren&amp;rsquo;t. How I got a 20x performance by switching to string functions.&lt;/p&gt;
&lt;p&gt;With the new version of searchcode.com one of the main things I wanted to address was performance. The previous version had all sorts of performance issues which were not limited to the usual suspects such as the database or search index.&lt;/p&gt;
&lt;p&gt;When developing the new version one of the tasks listed in my queue was to profile search operations for anything slowing things down. Sadly I have since lost the profile output but observed that one of the main speed culprits is the format_results function inside the code model. For most queries I tried while it was the slowest operation it wasn&amp;rsquo;t worth optimising simply because its impact was so low. I did however keep it in the back of my mind that if there were any performance issues it would be the first thing to look at.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sun, 15 Feb 2015 23:36:40 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/02/regular-expressions-fast/</guid></item><item><title>Postincrement vs. preincrement in C++</title><link>https://bastian.rieck.me/blog/2015/postincrement_vs_preincrement/</link><description>&lt;p&gt;The debate about whether to use postincrement (&lt;code&gt;i++&lt;/code&gt;) or preincrement (&lt;code&gt;++i&lt;/code&gt;) when writing a loop in
C++ has been going on for a very long time. It is probably one of the most favourite programming
interview questions ever.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take a closer look at what modern compilers have to say about it. First, this is the test code
for postincrement, which I shall refer to as &lt;code&gt;postincrement.cc&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Likewise, &lt;code&gt;preincrement.cc&lt;/code&gt; refers to the following code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the following, let us take a look at the assembly code generate by both gcc 4.9.2 and clang
3.5.1. Fortunate for me, I don&amp;rsquo;t have to actually &lt;em&gt;understand&lt;/em&gt; the assembly code. It is perfectly
sufficient to look at the &lt;em&gt;differences&lt;/em&gt; between the two codes. If there are none, the two programs
behave exactly the same.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s try it with gcc first (using &lt;code&gt;-O0&lt;/code&gt; to disable optimizations in order no to bias the results):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ g++ -O0 -S postincrement.cc
$ g++ -O0 -S preincrement.cc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The result of &lt;code&gt;diff postincrement.s preincrement.s&lt;/code&gt; is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;1c1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;&amp;lt; 	.file	"postincrement.cc"
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;&amp;gt; 	.file	"preincrement.cc"
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Thus, gcc generates the same code twice. This works of course without providing &lt;code&gt;-O0&lt;/code&gt;, as well. So,
how does clang fare?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ clang -O0 -S postincrement.cc
$ clang -O0 -S preincrement.cc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The result of &lt;code&gt;diff postincrement.s preincrement.s&lt;/code&gt; is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;2c2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;&amp;lt; 	.file	"postincrement.cc"
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;&amp;gt; 	.file	"preincrement.cc"
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;79,80c79,80
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;&amp;lt; 	.type	_GLOBAL__sub_I_postincrement.cc,@function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;&amp;lt; _GLOBAL__sub_I_postincrement.cc:        # @_GLOBAL__sub_I_postincrement.cc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;&amp;gt; 	.type	_GLOBAL__sub_I_preincrement.cc,@function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;&amp;gt; _GLOBAL__sub_I_preincrement.cc:         # @_GLOBAL__sub_I_preincrement.cc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;95c95
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;&amp;lt; 	.size	_GLOBAL__sub_I_postincrement.cc, .Ltmp11-_GLOBAL__sub_I_postincrement.cc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;&amp;gt; 	.size	_GLOBAL__sub_I_preincrement.cc, .Ltmp11-_GLOBAL__sub_I_preincrement.cc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;103c103
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;&amp;lt; 	.quad	_GLOBAL__sub_I_postincrement.cc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;&amp;gt; 	.quad	_GLOBAL__sub_I_preincrement.cc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Remember when I said to you that we did not have to understand assembly code for this experiment?
Well, I lied. A little. However, although my assembly skills are extremely rusty, you may believe
when I say that all differences depicted above merely pertain to renamed segments. There&amp;rsquo;s nothing
in there about spurious variable copies.&lt;/p&gt;
&lt;p&gt;For integral types, there is thus apparently no difference between the two variants.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s spice it up by using iterators! Here&amp;rsquo;s &lt;code&gt;postincrement-iterator.cc&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;numeric&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;iota&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And here&amp;rsquo;s &lt;code&gt;preincrement-iterator.cc&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;numeric&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;iota&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here, we experience a completely different behaviour. Both gcc and clang create an extra copy during
the iteration–however, this extra copy does not seem to be used anywhere. clang, for example,
creates the following assembly code for the postincrement operator:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.LBB1_7:                                #   in Loop: Header=BB1_3 Depth=1
        leaq	-88(%rbp), %rdi
        movl	$0, %esi
        callq	_ZN9__gnu_cxx17__normal_iteratorIPjSt6vectorIjSaIjEEEppEi
        movq	%rax, -104(%rbp)
        jmp	.LBB1_3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The mangled symbol &lt;code&gt;_ZN9__gnu_cxx17__normal_iteratorIPjSt6vectorIjSaIjEEEppEi&lt;/code&gt; refers to the
postincrement operator. There is an additional instruction, &lt;code&gt;movl $0, %esi&lt;/code&gt;, which is not required
for the preincrement operator. So, the postincrement version requires more CPU cycles than the
preincrement version.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s briefly take a look at how bad the problem is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;chrono&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;numeric&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;iota&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;iota&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;time_point&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;high_resolution_clock&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;t1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;high_resolution_clock&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;t2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;high_resolution_clock&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;t3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;high_resolution_clock&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;d1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;d2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Postincrement: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;duration_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;microseconds&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;d1&lt;/span&gt; &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"us"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;            &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Preincrement:  "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;duration_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;microseconds&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;d2&lt;/span&gt; &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"us"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This yields:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ g++ -std=c++11 increment-timing.cc; ./a.out
Postincrement: 31531us
Preincrement:  20867us
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For &amp;ldquo;real&amp;rdquo; measurements, this should of course be run numerous times. These are the results:&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://bastian.rieck.me/images/postincrement_vs_preincrement.png"&gt;&lt;img height=" alt=" src="https://bastian.rieck.me/images/postincrement_vs_preincrement.png" width="600" /&gt;&lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;Thus, preincrement is definitely faster than postincrement &lt;em&gt;for iterators&lt;/em&gt; (or, to be even more
precise, &lt;em&gt;certain kinds of iterators&lt;/em&gt;).&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 15 Feb 2015 17:17:21 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/postincrement_vs_preincrement/</guid></item><item><title>Direct-Attach SSD Storage - Performance &amp;amp; Comparisons</title><link>https://smcleod.net/2015/02/direct-attach-ssd-storage-performance-comparisons/</link><description>&lt;p&gt;Further to my earlier post on XenServer storage performance with regards to directly attaching storage from the host, I have been analysing the performance of various SSD storage options.&lt;/p&gt;
&lt;p&gt;I have attached a HP DS2220sb storage blade to an existing server blade and compared performance with 4 and 6 SSD RAID-10 to our existing iSCSI SANs.&lt;/p&gt;
&lt;p&gt;While the P420i RAID controller in the DS2220sb is clearly saturated and unable to provide throughput much over 1,100MB/s - the IOP/s available to PostgreSQL are still a very considerably performance improvement over our P4530 SAN - in fact, 6 SSD&amp;rsquo;s result in a 39.9x performance increase!&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Sun, 15 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/direct-attach-ssd-storage-performance-comparisons/</guid></item><item><title>Search - A Journey of Delivery on a Budget</title><link>https://smcleod.net/2015/02/search-a-journey-of-delivery-on-a-budget/</link><description>&lt;h3 id="heading"&gt;&lt;a href="https://smcleod.net/files/slides-Search-A-Journey-of-Delivery-on-a-Budget/"&gt;&amp;ldquo;Search - A Journey of Delivery on a Budget&amp;rdquo;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Presented a Melbourne Search - July 2014 - &lt;a href="https://smcleod.net/files/slides-Search-A-Journey-of-Delivery-on-a-Budget/"&gt;&amp;ldquo;Search - A Journey of Delivery on a Budget&amp;rdquo;&lt;/a&gt; &lt;em&gt;(Click for slides)&lt;/em&gt;&lt;/p&gt;
&lt;div style="padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
      
    &lt;/div&gt;</description><author>smcleod.net</author><pubDate>Sun, 15 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/search-a-journey-of-delivery-on-a-budget/</guid></item><item><title>Talk - 24 Months</title><link>https://smcleod.net/2015/02/talk-24-months/</link><description>&lt;p&gt;The way we work at Infoxchange has changed greatly.&lt;/p&gt;
&lt;p&gt;A retrospective journey into transforming Infoxchange&amp;rsquo;s technology and culture over the past 24 months - presented a Melbourne DevOps - December 2014&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/sammcj/smcleod_files/blob/master/slides/24_months/24_Months.pdf?raw=true"&gt;&lt;img alt="Click to Download Slides" src="https://smcleod.net//img/misc/24months.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Sun, 15 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/talk-24-months/</guid></item><item><title>The Best Of - 2014 Edition</title><link>https://smcleod.net/2015/02/the-best-of-2014-edition/</link><description>&lt;p&gt;At the end of every year I note down a summary of the best applications, hardware &amp;amp; websites I&amp;rsquo;ve enjoyed &amp;amp; depended on throughout the year (and often for some time before).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This post has long since been superseded. You can find the latest version of this post &lt;a href="https://smcleod.net/2022-10-19-apps-of-2022/"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="software--general-use"&gt;Software / General Use&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fastmail - &lt;a href="https://www.fastmail.com"&gt;https://www.fastmail.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Evernote - &lt;a href="https://evernote.com"&gt;https://evernote.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Reeder - &lt;a href="http://reederapp.com"&gt;http://reederapp.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Keynote - &lt;a href="https://www.apple.com/au/mac/keynote"&gt;https://www.apple.com/au/mac/keynote&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lastpass - &lt;a href="https://lastpass.com"&gt;https://lastpass.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plex - &lt;a href="https://plex.tv"&gt;https://plex.tv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Calibre - &lt;a href="http://calibre-ebook.com"&gt;http://calibre-ebook.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software--geek-use"&gt;Software / Geek Use&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Sublime Text - &lt;a href="http://www.sublimetext.com/3"&gt;http://www.sublimetext.com/3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Homebrew - &lt;a href="http://brew.sh"&gt;http://brew.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DropSync - &lt;a href="http://mudflatsoftware.com"&gt;http://mudflatsoftware.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Beets - &lt;a href="http://beets.radbox.org"&gt;http://beets.radbox.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Textual - &lt;a href="http://www.codeux.com/textual"&gt;http://www.codeux.com/textual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;XLD - &lt;a href="http://tmkk.undo.jp/xld/index_e.html"&gt;http://tmkk.undo.jp/xld/index_e.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code Academy - &lt;a href="http://www.codecademy.com"&gt;http://www.codecademy.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Exercism.io - &lt;a href="http://exercism.io"&gt;http://exercism.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sickbeard + Headphones + Couchpotato + Sabnzbd - &lt;a href="http://www.totalhtpc.com/ultimate-usenet-guide.html"&gt;http://www.totalhtpc.com/ultimate-usenet-guide.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software--mobile"&gt;Software / Mobile&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tweetbot - &lt;a href="http://tapbots.com/software/tweetbot"&gt;http://tapbots.com/software/tweetbot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pushover - &lt;a href="http://pushover.net"&gt;http://pushover.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lastpass - &lt;a href="https://lastpass.com"&gt;https://lastpass.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Keynote - &lt;a href="https://www.apple.com/au/ios/keynote"&gt;https://www.apple.com/au/ios/keynote&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Reeder - &lt;a href="http://reederapp.com/ios"&gt;http://reederapp.com/ios&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Evernote- &lt;a href="https://evernote.com"&gt;https://evernote.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plex - &lt;a href="https://plex.tv"&gt;https://plex.tv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Backblaze - &lt;a href="https://www.backblaze.com"&gt;https://www.backblaze.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;WTF Podcast - &lt;a href="http://www.wtfpod.com/app"&gt;http://www.wtfpod.com/app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MiniHack - &lt;a href="https://itunes.apple.com/au/app/minihack-for-hacker-news/id631108846?mt=8"&gt;https://itunes.apple.com/au/app/minihack-for-hacker-news/id631108846?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Uber - &lt;a href="https://itunes.apple.com/au/app/uber/id368677368?mt=8"&gt;https://itunes.apple.com/au/app/uber/id368677368?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Goodreads - &lt;a href="https://itunes.apple.com/au/app/goodreads-book-recommendations/id355833469?mt=8"&gt;https://itunes.apple.com/au/app/goodreads-book-recommendations/id355833469?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Notify4M - &lt;a href="https://itunes.apple.com/au/app/notify4m/id499161979?mt=8"&gt;https://itunes.apple.com/au/app/notify4m/id499161979?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bandcamp - &lt;a href="https://itunes.apple.com/au/app/bandcamp/id706408639?mt=8"&gt;https://itunes.apple.com/au/app/bandcamp/id706408639?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hype Machine - &lt;a href="https://itunes.apple.com/au/app/hype-machine/id414315986?mt=8"&gt;https://itunes.apple.com/au/app/hype-machine/id414315986?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nuzzel (Only got onto this today) - &lt;a href="https://itunes.apple.com/au/app/nuzzel-news-from-your-friends/id692285770?mt=8"&gt;https://itunes.apple.com/au/app/nuzzel-news-from-your-friends/id692285770?mt=8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Alien Blue - &lt;a href="http://www.reddit.com/r/alienblue"&gt;http://www.reddit.com/r/alienblue&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software--sysadmin-or-devops-specific"&gt;Software / SysAdmin or DevOps Specific&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gitlab - &lt;a href="http://gitlab.org"&gt;http://gitlab.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gitlab-CI - &lt;a href="https://about.gitlab.com/gitlab-ci"&gt;https://about.gitlab.com/gitlab-ci&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dash - &lt;a href="http://kapeli.com/dash"&gt;http://kapeli.com/dash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PostgreSQL (Makes my list every year &amp;amp; just keeps getting better) - &lt;a href="http://www.postgresql.org"&gt;http://www.postgresql.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PGBadger - &lt;a href="http://dalibo.github.io/pgbadger"&gt;http://dalibo.github.io/pgbadger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Docker - &lt;a href="https://www.docker.com"&gt;https://www.docker.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Consul - &lt;a href="https://consul.io"&gt;https://consul.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Puppet (I couldn&amp;rsquo;t do my job as well without it) - &lt;a href="http://puppetlabs.com"&gt;http://puppetlabs.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;iTerm - &lt;a href="http://iterm2.com"&gt;http://iterm2.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nginx - &lt;a href="http://nginx.org"&gt;http://nginx.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Htop - &lt;a href="http://hisham.hm/htop"&gt;http://hisham.hm/htop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bonnie++ - &lt;a href="http://linux.die.net/man/8/bonnie"&gt;http://linux.die.net/man/8/bonnie&lt;/a&gt;++&lt;/li&gt;
&lt;li&gt;Openfire - &lt;a href="https://www.igniterealtime.org/projects/openfire"&gt;https://www.igniterealtime.org/projects/openfire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hiera-Eyaml - &lt;a href="https://github.com/TomPoulton/hiera-eyaml"&gt;https://github.com/TomPoulton/hiera-eyaml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rubinius - &lt;a href="http://rubini.us"&gt;http://rubini.us&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Puma - &lt;a href="http://puma.io"&gt;http://puma.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;XenServer - &lt;a href="http://xenserver.org"&gt;http://xenserver.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ElasticSearch - &lt;a href="https://www.elasticsearch.org"&gt;www.elasticsearch.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Logstash - &lt;a href="http://logstash.net"&gt;http://logstash.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FPM - &lt;a href="https://github.com/jordansissel/fpm"&gt;https://github.com/jordansissel/fpm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PFsense - &lt;a href="https://www.pfsense.org"&gt;https://www.pfsense.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Debian Jessie (Not quite released but the next great version of the best linux Distro IMO) - &lt;a href="https://www.debian.org/releases/jessie"&gt;https://www.debian.org/releases/jessie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Check_MK Multisite - &lt;a href="https://mathias-kettner.de/checkmk_multisite.html"&gt;https://mathias-kettner.de/checkmk_multisite.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PWSafe - &lt;a href="https://itunes.apple.com/au/app/pwsafe-password-safe-compatible/id520993579?mt=12"&gt;https://itunes.apple.com/au/app/pwsafe-password-safe-compatible/id520993579?mt=12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Supervisord - &lt;a href="http://supervisord.org"&gt;http://supervisord.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="websites"&gt;Websites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Last.fm - &lt;a href="http://www.last.fm/user/sammcj2000"&gt;http://www.last.fm/user/sammcj2000&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Feedly - &lt;a href="https://feedly.com"&gt;https://feedly.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;HackerNews - &lt;a href="https://news.ycombinator.com/news"&gt;https://news.ycombinator.com/news&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lucidchart - &lt;a href="http://lucidchart.com/"&gt;http://lucidchart.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MondoTunes (Might be a little biased here!) - &lt;a href="http://mondotunes.org"&gt;http://mondotunes.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="hardware"&gt;Hardware&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Das Ultimate 4- &lt;a href="http://www.daskeyboard.com"&gt;http://www.daskeyboard.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Logitech Performance MX - &lt;a href="http://www.logitech.com/en-au/product/performance-mouse-mx"&gt;http://www.logitech.com/en-au/product/performance-mouse-mx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;15&amp;rsquo;&amp;rsquo; Macbook Pro Retina - &lt;a href="http://www.apple.com/au/macbook-pro"&gt;http://www.apple.com/au/macbook-pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;iPhone 6+ (because its bigger than bigger, or something) - &lt;a href="https://www.apple.com/iphone-6"&gt;https://www.apple.com/iphone-6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CuBox - &lt;a href="http://www.solid-run.com/product/cubox-i4pro"&gt;http://www.solid-run.com/product/cubox-i4pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Parani SD1000 Bluetooth Serial Adapter - &lt;a href="http://www.senaindustrial.com/products/industrial_bluetooth/sd1000.php"&gt;http://www.senaindustrial.com/products/industrial_bluetooth/sd1000.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SanDisk Extreme Pro 480GB SSD - &lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16820171999"&gt;http://www.newegg.com/Product/Product.aspx?Item=N82E16820171999&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="other--non-tech"&gt;Other / Non-tech&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;All Day Socks - &lt;a href="http://alldaysocks.com"&gt;http://alldaysocks.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sennheiser Amperior On-Ear Headphones - &lt;a href="http://www.head-fi.org/products/sennheiser-amperior-on-ear-headphones"&gt;http://www.head-fi.org/products/sennheiser-amperior-on-ear-headphones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;O2 + ODAC - &lt;a href="http://www.jdslabs.com/products/48/o2-odac-combo"&gt;http://www.jdslabs.com/products/48/o2-odac-combo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Benchmark DAC1 HDR - &lt;a href="http://benchmarkmedia.com/products/benchmark-dac1-hdr-digital-to-analog-converter"&gt;http://benchmarkmedia.com/products/benchmark-dac1-hdr-digital-to-analog-converter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bellroy Wallets - &lt;a href="http://bellroy.com"&gt;http://bellroy.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ink Shoes - &lt;a href="http://www.inkshoes.it"&gt;http://www.inkshoes.it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kindle Paperwhite - &lt;a href="http://www.amazon.com.au/gp/feature.html?docId=3077740006"&gt;http://www.amazon.com.au/gp/feature.html?docId=3077740006&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nerf Jolt - &lt;a href="http://nerf.wikia.com/wiki/Jolt_EX-1"&gt;http://nerf.wikia.com/wiki/Jolt_EX-1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="books"&gt;Books&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The Phoenix Project (Reread this year for the 3rd time) - &lt;a href="http://itrevolution.com/books/phoenix-project-DevOps-book"&gt;http://itrevolution.com/books/phoenix-project-DevOps-book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Surely You&amp;rsquo;re Joking Mr Feynman! - &lt;a href="https://www.goodreads.com/book/show/5544.Surely_You_re_Joking_Mr_Feynman_"&gt;https://www.goodreads.com/book/show/5544.Surely_You_re_Joking_Mr_Feynman_&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Dark Tower Series - &lt;a href="https://www.goodreads.com/book/show/43615.The_Gunslinger"&gt;https://www.goodreads.com/book/show/43615.The_Gunslinger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Snow Crash - &lt;a href="https://www.goodreads.com/book/show/830.Snow_Crash"&gt;https://www.goodreads.com/book/show/830.Snow_Crash&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><author>smcleod.net</author><pubDate>Sun, 15 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/the-best-of-2014-edition/</guid></item><item><title>XenServer, SSDs &amp;amp; VM Storage Performance</title><link>https://smcleod.net/2015/02/xenserver-ssds-vm-storage-performance/</link><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;At Infoxchange we use XenServer as our Virtualisation of choice.
There are many reasons for this including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open Source.&lt;/li&gt;
&lt;li&gt;Offers greater performance than VMware.&lt;/li&gt;
&lt;li&gt;Affordability (it&amp;rsquo;s free unless you purchase support).&lt;/li&gt;
&lt;li&gt;Proven backend Xen is very reliable.&lt;/li&gt;
&lt;li&gt;Reliable cross-host migrations of VMs.&lt;/li&gt;
&lt;li&gt;The XenCentre client, (although having to run in a Windows VM) is quick and simple to use.&lt;/li&gt;
&lt;li&gt;Upgrades and patches have proven to be more reliable than VMware.&lt;/li&gt;
&lt;li&gt;OpenStack while interesting, is not yet reliable or streamlined enough for our small team of 4 to implement and manage.&lt;/li&gt;
&lt;li&gt;XenServer Storage &amp;amp; Filesystems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unfortunately the downside to XenServer is that it&amp;rsquo;s underlying OS is quite old.
The latest version (6.5) about to be released is still based on Centos 5 and still lacks any form of EXT4 and BTRFS support, direct disk access is not available… without some tweaking and has no real support for TRIM unless you have direct disk access and are happy with EXT3.&lt;/p&gt;</description><author>smcleod.net</author><pubDate>Sun, 15 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://smcleod.net/2015/02/xenserver-ssds-vm-storage-performance/</guid></item><item><title>Nightcrawler</title><link>https://olshansky.info/movie/nightcrawler/</link><description>Olshansky's review of Nightcrawler</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 14 Feb 2015 09:00:13 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/nightcrawler/</guid></item><item><title>Improving DbInspector library.</title><link>https://prashamhtrivedi.in/improving-dbinspector.html</link><description>DbInspector is a useful library that helps us to view our database in the app. I have forked it and tried to add some small features to make this awesome library more awesome, and even more useful.</description><author>Prasham H Trivedi</author><pubDate>Sat, 14 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/improving-dbinspector.html</guid></item><item><title>Screenshot Saturday 211</title><link>https://etodd.io/2015/02/13/screenshot-saturday-211/</link><description>&lt;p&gt;
	Last Saturday we had the &lt;a href="http://www.shortnorth.org/popular-links/gallery-hop"&gt;Short North gallery hop&lt;/a&gt;.
	Hundreds of people came through our gallery to see art. The guys helped me set up the Oculus and a projector
	on the wall.
&lt;/p&gt;
&lt;p&gt;
	Sometimes I had to go out and pull people in, but most of the time, there was a line.
	My favorite customer by far was this kid:
&lt;/p&gt;
&lt;a href="https://etodd.io/assets/6xdPxl9.jpg"&gt;&lt;img src="https://etodd.io/assets/6xdPxl9l.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;He jumped right in and played like a pro. The mother (recording video) was super supportive and excited.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 13 Feb 2015 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/02/13/screenshot-saturday-211/</guid></item><item><title>From Amazon Web Services to Digital Ocean</title><link>https://liza.io/from-amazon-web-services-to-digital-ocean/</link><description>&lt;h2 id="amazon-i-quit"&gt;Amazon, I quit.&lt;/h2&gt;
&lt;p&gt;I tried, Amazon. I really did. For the last few months I tried to make it work with an EC2 instance for Gastropoda. I tried two main methods of deployment, both of which worked sporadically at various points:&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Fri, 13 Feb 2015 14:41:24 GMT</pubDate><guid isPermaLink="true">https://liza.io/from-amazon-web-services-to-digital-ocean/</guid></item><item><title>Multiple Importance Sampling</title><link>https://blog.yiningkarlli.com/2015/02/multiple-importance-sampling.html</link><description>&lt;p&gt;A key tool introduced by Veach as part of his bidirectional pathtracing formulation is multiple importance sampling (MIS). As discussed in my &lt;a href=""&gt;previous post&lt;/a&gt;, the entire purpose of rendering from a mathematical perspective is to solve the light transport equation, which in the case of all pathtracing type renderers means solving the path integral formulation of light transport. Since the path integral does not have a closed form solution in all but the simplest of scenes, we have to estimate the full integral using various sampling techniques in path space, hence unidirectional pathtracing and bidirectional pathtracing and metropolis based techniques, etc. As we saw with the light source in glass case and with SDS paths, often a single path sampling technique is not sufficient for capturing a good estimate of the path integral. Instead, a good estimate often requires a combination of a number of different path sampling techniques; MIS is a critical mechanism for combining multiple sampling techniques in a manner that reduces total variance. Without MIS, directly combining sampling techniques through averaging can often have the opposite effect and &lt;em&gt;increase&lt;/em&gt; total variance.&lt;/p&gt;

&lt;p&gt;The following image is a recreation of the test scene used in the Veach thesis to demonstrate MIS. The scene consists of four glossy bars going from less glossy at the top to more glossy at the bottom, and four sphere lights of increasing size. The smallest sphere light has the highest emission intensity, and the largest sphere light has the lowest emission. I modified the scene to add in a large rectangular area light off camera on each side of the scene, and I added an additional bar to the bottom of the scene with gloss driven by a texture map:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/veach.bdpt.png"&gt;&lt;img alt="Figure 1: Recreation of the Veach MIS test scene. Rendered in Takua." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/veach.bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above scene is difficult to render using any single path sampling technique because of the various combinations of surface glossiness and emitter size/intensity. For large emitter/low gloss combinations, importance sampling by the BSDF tends to result in lower variance. In the case, the reason is that a given random ray direction is more likely to hit the large light than it is to fall within a narrow BSDF lobe, so matching the sample distribution to the BSDF lobe is more efficient. However, for small emitter/high gloss combinations, the reverse is true. If we take the standard Veach scene and sample by only BSDF and then only by light source, we can see how each strategy fails in different cases. Both of these renders would eventually converge if left to render for long enough, but the rate of convergence in difficult areas would be extremely slow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/veach_bsdfsample.bdpt.png"&gt;&lt;img alt="Figure 2: BSDF sampling only, 64 iterations." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/veach_bsdfsample.bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/veach_lightsample.bdpt.png"&gt;&lt;img alt="Figure 3: Light sampling only, 64 iterations." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/veach_lightsample.bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIS allows us to combine &lt;em&gt;m&lt;/em&gt; different sampling strategies to produce a single unbiased estimator by weighting each sampling strategy by its probability distribution function (pdf). Mathematically, this is expressed as:&lt;/p&gt;

&lt;div&gt;\[ \langle I_{j} \rangle_{MIS} = \sum_{i=1}^{m} \frac{1}{n_{i}} \sum_{j=1}^{n_{i}} w_{i}(X_{i,j}) \frac{f(X_{i,j})}{p_{i}(X_{i,j})} \]&lt;/div&gt;

&lt;p&gt;where &lt;em&gt;X&lt;sub&gt;i,j&lt;/sub&gt;&lt;/em&gt; are independent random variables drawn from some distribution function &lt;em&gt;p&lt;sub&gt;i&lt;/sub&gt;&lt;/em&gt; and &lt;em&gt;w&lt;sub&gt;i&lt;/sub&gt;(X&lt;sub&gt;i,j&lt;/sub&gt;)&lt;/em&gt; is some heuristic for weighting each sampling technique with respect to pdf. The reason MIS is able to significantly lower variance is because a good MIS weighting function should dampen contributions with low pdfs. The Veach thesis presents two good weighting heuristics, the &lt;em&gt;power heuristic&lt;/em&gt; and the &lt;em&gt;balance heuristic&lt;/em&gt;. The power heuristic is defined as:&lt;/p&gt;

&lt;div&gt;\[ w_{i}(x) = \frac{[n_{i}p_{i}(x)]^{\beta}}{\sum_{n}^{k=1}[n_{k}p_{k}(x)]^{\beta}}\]&lt;/div&gt;

&lt;p&gt;The power heuristic states that the weight for a given sampling technique should be the pdf of the sampling technique raised to a power &lt;em&gt;β&lt;/em&gt; divided by the sum of the pdfs of all considered sampling techniques, with each sampling technique also raised to &lt;em&gt;β&lt;/em&gt;. For the power heuristic, &lt;em&gt;β&lt;/em&gt; is typically set to 2. The balance heuristic is simply the power heuristic for &lt;em&gt;β&lt;/em&gt;=1. In the vast majority of cases, the balance heuristic is a near optimal weighting heuristic (and the power heuristic can cover most remaining edge cases), assuming that the base sampling strategies are decent to begin with.&lt;/p&gt;

&lt;p&gt;For the standard Veach MIS demo scene, the best result is obtained by using MIS to combine BSDF and light sampling. The following image is the Veach scene again, this time rendered using MIS with 64 iterations. Note that all highlights are now roughly equally converged and the entire image matches the reference render above, apart from noise:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/veach_bothsample.bdpt.png"&gt;&lt;img alt="Figure 4: Light and BSDF sampling combined using MIS, 64 iterations." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/veach_bothsample.bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BDPT inherently does not necessarily have an improved convergence rate over vanilla unidirectional pathtracing; BDPT gains its significant edge in convergence rate only once MIS is applied since BDPT’s efficiency comes from being able to extract a large number of path sampling techniques out of a single bidirectional path. To demonstrate the impact of MIS on BDPT, I rendered the following images using BDPT with and without MIS. The scene is a standard Cornell Box, but I replaced the back wall with a more complex scratched, glossy surface. The first image is the fully converged ground truth render, followed by with and without MIS:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/gloss_groundtruth.png"&gt;&lt;img alt="Figure 5: Cornell Box with scratched glossy back wall. Rendered using BDPT with MIS." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/gloss_groundtruth.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/gloss_mis.bdpt.png"&gt;&lt;img alt="Figure 6: BDPT with MIS, 16 iterations." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/gloss_mis.bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/gloss_nomis.bdpt.png"&gt;&lt;img alt="Figure 7: BDPT without MIS, 16 iterations." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/gloss_nomis.bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As seen above, the version of BDPT without MIS is significantly less converged. BDPT without MIS will still converge to the correct solution, but in practice can often be only as good as, or worse than unidirectional pathtracing.&lt;/p&gt;

&lt;p&gt;Later on, we’ll discuss MIS beyond bidirectional pathtracing. In fact, MIS is the critical component to making VCM possible!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id="addendum-2018-01-12"&gt;Addendum 2018-01-12&lt;/h2&gt;

&lt;p&gt;A reader noticed some brightness inconsistencies in the original versions of Figures 2 and 3, which came from bugs in Takua’s light sampling code without MIS at the time.
I have replaced the original versions of Figures 1, 2, 3, and 4 with new, correct versions rendered using the current version of Takua as of the time of writing for this addendum.&lt;/p&gt;

&lt;p&gt;Because of how much noise there is in Figures 2 and 3, seeing that they converge to the reference image might be slightly harder.
To make the convergence clearer, I rendered out each sampling strategy using 1024 samples per pixel, instead of just 64:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/veach_bsdfsample.bdpt.hq.png"&gt;&lt;img alt="Figure 8: BSDF sampling only, 1024 iterations." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/veach_bsdfsample.bdpt.hq.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/veach_lightsample.bdpt.hq.png"&gt;&lt;img alt="Figure 9: Light sampling only, 1024 iterations." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/veach_lightsample.bdpt.hq.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note how Figures 8 and 9 match Figure 1 exactly, aside from noise.
In Figure 9, the reflection of the right-most sphere light on the top-most bar is still extremely noisy because of the extreme difficulty of finding a random light sample that happens to produce a valid bsdf response for the near-perfect specular lobe.&lt;/p&gt;

&lt;p&gt;One last minor note: I’m leaving the main text of this post unchanged, but the updated renders use Takua’s modern shading system instead of the old one from 2015; in the new shading system, the metal bars use roughness instead of gloss, and use GGX instead of a normalized Phong variant.&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Fri, 13 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2015/02/multiple-importance-sampling.html</guid></item><item><title>Get internal and external IP address on Mac with Bash</title><link>https://www.seanw.org/blog/mac-internal-external-ip-from-terminal-with-bash/</link><description>Frequently while coding I need to know the internal and external IP address of my development machine. For example, when your machine is serving a website from a locally running web server, the internal IP address can be used to test the site from a smartphone browser connected to the same network. Likewise, the external IP address is useful when you want to make a local web server publicly accessible or when you need to whitelist your IP address in the firewall settings of an external server.</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Fri, 13 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/mac-internal-external-ip-from-terminal-with-bash/</guid></item><item><title>Digital natives so smart that they do not need certificates</title><link>https://stop.zona-m.net/2015/02/digital-natives-so-smart-that-they-do-not-need-certificates/</link><description>&lt;figure&gt;
  &lt;img alt="Digital natives so smart that they do not need certificates /img/nothing-more-dangerous.png" src="https://stop.zona-m.net//img/nothing-more-dangerous.png" width="100%" /&gt;
&lt;/figure&gt;
&lt;p&gt;An interesting &lt;a href="https://theconversation.com/the-pen-is-mightier-than-the-sword-but-the-computer-mightier-than-both-37211"&gt;article at The Conversation&lt;/a&gt; concludes that:&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Thu, 12 Feb 2015 09:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/02/digital-natives-so-smart-that-they-do-not-need-certificates/</guid></item><item><title>Lazy Physics</title><link>https://johnj.com/posts/lazy-physics/</link><description>&lt;p&gt;
&lt;em&gt;… in which we explore lazy sequences and common functional idioms in Clojure via the example of looking for (nearly) coincident clusters of times in a series.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
A fundamental technical problem in experimental particle physics is
how to distinguish the signatures of particles from instrumental
noise.&lt;/p&gt;
&lt;p&gt;





&lt;a href="https://johnj.com/birds-on-wires.jpg"&gt;&lt;img class="resize" src="https://johnj.com/birds-on-wires_hu_16a165dde04a8c41.jpg" style="width: 700px; border: 0px solid black;" /&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
Imagine a tree full of hundreds of sparrows, each nesting on a branch,
each chirping away occasionally. Suddenly, for a brief moment, they
all start chirping vigorously (maybe a hawk flew past). A clustering
of chirps in time is the signal that &lt;em&gt;something has happened!&lt;/em&gt; The
analogous situation occurs in instruments consisting of many similar
detector elements, each generating some amount of random noise that,
on its own, is indistinguishable from any evidence left by particles,
but which, taken together, signals that, again, &lt;em&gt;something has happened&lt;/em&gt;
—a muon, an electron, a neutrino has left a sudden spume of
electronic evidence in your instrument, waiting to be read out and
distinguished from the endless noise.&lt;/p&gt;
&lt;p&gt;
This process of separating the noise from the signal is known in
physics as &lt;em&gt;triggering&lt;/em&gt; and is typically done through some combination
of spatial or time clustering; in many cases, time is the simplest to
handle and the first “line of defense” against being overrun by too
much data. (It is often impractical to consume all the data generated
by all the elements —data reduction is the name of the game at most
stages of these experiments.)&lt;/p&gt;
&lt;p&gt;
This data is typically generated continously ad infinitum, and must
therefore be processed differently than, say, a single file on
disk. Such infinite sequences of data are an excellent fit for the
functional pattern known as &lt;em&gt;laziness&lt;/em&gt;, in which, rather than chewing up
all your RAM and/or hard disk space, data is consumed and transformed
only as needed / as available. This kind of processing is baked into
Clojure at many levels and throughout its library of core functions,
dozens of which can be combined (“composed”) to serve an endless
variety of data transformations. (This style of data wrangling is also
available in Python via generators and functional libraries such as
&lt;a href="http://toolz.readthedocs.org/"&gt;Toolz&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;
Prompted by a recent question on the topic from a physicist and former
colleague, I got to thinking about the classic problem of triggering,
and realized that the time series trigger provides a nice showcase for
Clojure’s core library and for processing lazy sequences. The rest of
this post will describe a simple trigger, essentially what particle
astrophysicists I know call a “simple majority trigger”; or a “simple
multiplicity trigger” (depending on whom you talk to).&lt;/p&gt;
&lt;p&gt;
Now for some Clojure code. (A small amount of familiarity with
Clojure’s simple syntax is recommended for maximum understanding of
what follows.) We will build up our understanding through a series of
successively more complex code snippets. The exposition follows
closely what one might do in the Clojure REPL, building up
successively more complete examples. In each case, we use &lt;code class="verbatim"&gt;take&lt;/code&gt; to
limit what would otherwise be infinite sequences of data (so that our
examples can terminate without keeping us waiting forever…).&lt;/p&gt;
&lt;p&gt;
First we create a sorted, infinite series of ever-increasing times
(in, say, nsec):&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(def times (iterate #(+ % (rand-int 1000)) 0))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;; Caution: infinite sequence...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(take 30 times)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(0 955 1559 2063 2735 2858 3542 4067 4366 5246 5430 6168 7127 7932
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8268 8929 9426 9918 10436 10850 11680 12367 12569 13343 14155 14420
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 15062 15171 15663 16355)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;code class="verbatim"&gt;times&lt;/code&gt; is an infinite (but “unrealized”) series, constructed by
iterating the anonymous function &lt;code class="verbatim"&gt;#(+ % (rand-int 1000))&lt;/code&gt; which adds a
random integer from 0 to 999 to its argument (starting with zero). The
fact that it is infinite does not prevent us from defining it or
(gingerly) interrogating it via take&lt;sup class="footnote-reference"&gt;&lt;a href="#footnote-1" id="footnote-reference-1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;
Now, the way we’ll look for excesses is to look for groupings of hits
(say, eight of them) whose first and last hit times are within 1
microsecond (1000 nsec) of each other. To start, there is a handy
function called &lt;code class="verbatim"&gt;partition&lt;/code&gt; which groups a series in blocks of fixed
length:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(take 10 (partition 8 times))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;((0 955 1559 2063 2735 2858 3542 4067)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (4366 5246 5430 6168 7127 7932 8268 8929)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (9426 9918 10436 10850 11680 12367 12569 13343)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (14155 14420 15062 15171 15663 16355 16700 16947)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (17919 17949 18575 18607 18849 19597 20410 20680)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (20737 21289 21315 21323 21426 21637 22422 23000)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (23477 24351 24426 25106 25861 26568 27511 28332)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (29071 29831 29957 30761 31073 31914 32591 33187)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (33878 34739 34842 35674 36444 36960 36983 37400)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (37587 38012 38969 39131 39317 40135 40587 40759))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
We’ll rewrite this using Clojure’s thread-last macro &lt;code class="verbatim"&gt;-&amp;gt;&amp;gt;&lt;/code&gt;, which is a
very helpful tool for rewriting nested expressions as a more readable
pipeline of successive function applications:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(-&amp;gt;&amp;gt; times
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (partition 8)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (take 10))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;((0 955 1559 2063 2735 2858 3542 4067)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (4366 5246 5430 6168 7127 7932 8268 8929)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...same as above...)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
However, this isn’t quite what we want, because it won’t find clusters
of times close together who don’t happen to begin on our &lt;code class="verbatim"&gt;partition&lt;/code&gt;
boundaries. To fix this, we use the optional &lt;code class="verbatim"&gt;step&lt;/code&gt; argument to
&lt;code class="verbatim"&gt;partition&lt;/code&gt;:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(-&amp;gt;&amp;gt; times
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (partition 8 1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (take 10))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;((0 955 1559 2063 2735 2858 3542 4067)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (955 1559 2063 2735 2858 3542 4067 4366)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (1559 2063 2735 2858 3542 4067 4366 5246)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (2063 2735 2858 3542 4067 4366 5246 5430)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (2735 2858 3542 4067 4366 5246 5430 6168)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (2858 3542 4067 4366 5246 5430 6168 7127)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (3542 4067 4366 5246 5430 6168 7127 7932)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (4067 4366 5246 5430 6168 7127 7932 8268)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (4366 5246 5430 6168 7127 7932 8268 8929)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (5246 5430 6168 7127 7932 8268 8929 9426))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
This is getting closer to what we want—if you look carefully, you’ll
see that each row consists of the previous one shifted by one
element. The next step is to grab (via &lt;code class="verbatim"&gt;map&lt;/code&gt;) the first and last times
of each group, using &lt;code class="verbatim"&gt;juxt&lt;/code&gt; to apply both &lt;code class="verbatim"&gt;first&lt;/code&gt; and &lt;code class="verbatim"&gt;last&lt;/code&gt; to each
subsequence….&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(-&amp;gt;&amp;gt; times
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (partition 8 1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (map (juxt last first))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (take 10))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;([4067 0]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [4366 955]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [5246 1559]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [5430 2063]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [6168 2735]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [7127 2858]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [7932 3542]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [8268 4067]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [8929 4366]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [9426 5246])&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
… and turn these into time differences:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(-&amp;gt;&amp;gt; times
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (partition 8 1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (map (comp (partial apply -) (juxt last first)))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (take 10))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(4067 3411 3687 3367 3433 4269 4390 4201 4563 4180)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Note that so far these time differences are all &amp;gt; 1000. &lt;code class="verbatim"&gt;comp&lt;/code&gt;, above,
turns a collection of multiple functions into a new function which is
the composition of these functions, applied successively one after the
other (right-to-left). &lt;code class="verbatim"&gt;partial&lt;/code&gt; turns a function of multiple arguments
into a function of fewer arguments, by binding one or more of the
arguments in a new function. For example,&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;((partial + 2) 3)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;((comp (partial apply -) (juxt last first)) [3 10])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Recall that we only want events whose times are close to each other;
say, whose duration is under a maximum limit of 1000 nsec. In general,
to select only the elements of a sequence which satisfy a filter
function, we use &lt;code class="verbatim"&gt;filter&lt;/code&gt;:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(-&amp;gt;&amp;gt; times
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (partition 8 1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (map (comp (partial apply -) (juxt last first)))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (filter (partial &amp;gt; 1000))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (take 10))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(960 942 827 763 597 682 997 836 986 966)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
(&lt;code class="verbatim"&gt;(partial &amp;gt; 1000)&lt;/code&gt; is a function of one argument which returns true if
that argument is strictly less than 1000.)&lt;/p&gt;
&lt;p&gt;
Great! We now have total “durations”; for subsequences of 8 times, where the total durations are less than 1000 nsec.&lt;/p&gt;
&lt;p&gt;
But this is not actually that helpful. It would be better if we could get both the total durations and the actual subsequences satisfying the requirement (the analog of this in a real physics experiment would be returning the actual hit data falling inside the trigger window).&lt;/p&gt;
&lt;p&gt;
To do this, &lt;code class="verbatim"&gt;juxt&lt;/code&gt; once again comes to the rescue, by allowing us to
&lt;code class="verbatim"&gt;juxt&lt;/code&gt;-apose the original data alongside the total duration to show both
together….&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(-&amp;gt;&amp;gt; times
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (partition 8 1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (map (juxt identity (comp (partial apply -) (juxt last first))))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (take 10))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;([(0 309 410 562 979 1423 2180 3159) 3159]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [(309 410 562 979 1423 2180 3159 3585) 3276]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [(410 562 979 1423 2180 3159 3585 4325) 3915]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [(562 979 1423 2180 3159 3585 4325 4573) 4011]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [(979 1423 2180 3159 3585 4325 4573 5074) 4095]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [(1423 2180 3159 3585 4325 4573 5074 5942) 4519]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [(2180 3159 3585 4325 4573 5074 5942 6599) 4419]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [(3159 3585 4325 4573 5074 5942 6599 7458) 4299]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [(3585 4325 4573 5074 5942 6599 7458 8128) 4543]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [(4325 4573 5074 5942 6599 7458 8128 8439) 4114])&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
… and adapt our filter slightly to apply our filter only to the time
rather than the original data:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(-&amp;gt;&amp;gt; times
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (partition 8 1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (map (juxt identity (comp (partial apply -) (juxt last first))))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (filter (comp (partial &amp;gt; 1000) second))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;     (take 3))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;;;=&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;([(1577315 1577322 1577514 1577570 1577793 1577817 1577870 1578151)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  836]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [(3119967 3120203 3120416 3120469 3120471 3120620 3120715 3120937)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  970]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [(6752453 6752483 6752522 6752918 6752966 6753008 6753026 6753262)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  809])&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Finally, to turn this into a function for later use, use &lt;code class="verbatim"&gt;defn&lt;/code&gt; and
remove &lt;code class="verbatim"&gt;take&lt;/code&gt;:&lt;/p&gt;
&lt;div class="src src-text"&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(defn smt-8 [times]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;  (-&amp;gt;&amp;gt; times
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;       (partition 8 1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;       (map (juxt identity (comp (partial apply -) (juxt last first))))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;       (filter (comp (partial &amp;gt; 1000) second))))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;code class="verbatim"&gt;smt-8&lt;/code&gt; consumes one, potentially infinite sequence and outputs another,
“smaller” (but also potentially infinite) lazy sequence of
time-clusters-plus-durations, in the form shown above.&lt;/p&gt;
&lt;p&gt;
Some contemplation will suggest many variants; for example, one in
which some number of hits outside the trigger “window” are also
included in the output. This is left as an exercise for the advanced
reader.&lt;/p&gt;
&lt;p&gt;
A “real” physics trigger would have to deal with many other details:
each hit, in addition to its time, would likely have an amplitude, a
sensor ID, and other data associated with it. Also, the data may not
be perfectly sorted, some sensors may drop out of the data stream,
etc. But in some sense this prototypical time clustering algorithm is
one of the fundamental building blocks of experimental high energy
physics and astrophysics and was used (in some variant) in every
experiment I worked on over a 25+ year period. The representation
above is certainly one of the most succinct, and shows off the power
and elegance of the language, its core library, and lazy
sequences. (It is also reasonably fast for such a simple algorithm;
&lt;code class="verbatim"&gt;smt-8&lt;/code&gt; consumes input times at a rate of about 250 kHz. This is not,
however, fast enough for an instrument like IceCube, whose 5160
sensors each count at a rate of roughly 300 Hz, for a total rate of
1.5 MHz. A future post may look at ways to get better performance.)&lt;/p&gt;
&lt;div class="footnotes"&gt;
&lt;hr class="footnotes-separatator" /&gt;
&lt;div class="footnote-definitions"&gt;
&lt;div class="footnote-definition"&gt;
&lt;sup id="footnote-1"&gt;&lt;a href="#footnote-reference-1"&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;div class="footnote-body"&gt;
&lt;p&gt;To model a Poisson process — one in which any given event time is independent of the future or past times — one would normally choose an exponential rather than a uniformly flat distribution of time differences, but this is not important for our discussion, so, in the interest of simplicity, we’ll go with what we have here.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><author>John Jacobsen</author><pubDate>Thu, 12 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://johnj.com/posts/lazy-physics/</guid></item><item><title>How I found a bug in HackerEarth</title><link>https://captnemo.in/blog/2015/02/12/hackerearth-bug/</link><description>&lt;p&gt;&lt;em&gt;&lt;a href="https://www.hackerearth.com/notes/how-i-found-a-bug-in-hackerearth/" title="Permalink to How I found a bug in HackerEarth"&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I am not a competitive programmer. I love programming, but more so I love building things. As a result, I rarely participate in coding contests. Even when I do, I try to use languages like Ruby and Python just to see if I can do it &lt;em&gt;my way&lt;/em&gt;, so to speak.&lt;/p&gt;

&lt;p&gt;While trying a contest in Ruby, I realized that I could not use the ruby &lt;code class="language-plaintext highlighter-rouge"&gt;prime&lt;/code&gt; library. This is a standard library in Ruby for a long while, and HackerEarth platform runs on 2.1.1, which is quite new.&lt;/p&gt;

&lt;p&gt;I reported this as a bug to HackerEarth in September ‘14. A quick reply from HE made me realize that they weren’t understanding the issue:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Modules like mathn or erb are part of standard library. They are available.&lt;/p&gt;

  &lt;p&gt;Try using, require ‘erb’require ‘mathn’ in code editor.&lt;br /&gt;
However 3rd party libraries are not available.﻿&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I decided to do some tests and check &lt;em&gt;all standard libraries&lt;/em&gt; for their availability. For those unfamiliar with Ruby, this is how you load a standard library in ruby:&lt;/p&gt;

&lt;p&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;require 'prime'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Using the HackerEarth API, I was able to write some quick code that tested all expected libraries:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;while read lib; do
  SOURCE="require%20'$lib'"
  echo "Testing $lib"
  curl -s -d "client_secret=API_SECRET&amp;amp;lang=RUBY&amp;amp;async=0&amp;amp;source=$SOURCE" http://api.hackerearth.com/code/run/ &amp;gt; $lib.json
done &amp;lt; libs.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here &lt;code class="language-plaintext highlighter-rouge"&gt;libs.txt&lt;/code&gt; contains a list of all standard libraries. The above code is in bash, and makes use of curl. Parsing the results, I replied with the following:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Requiring the following libraries raises a missing error:&lt;/p&gt;

  &lt;p&gt;coverage - RE&lt;br /&gt;
extmk - RE&lt;br /&gt;
fiddle - RE&lt;br /&gt;
io/console - RE&lt;br /&gt;
json - RE&lt;br /&gt;
minitest - RE&lt;br /&gt;
minitest/benchmark - RE&lt;br /&gt;
minitest/spec - RE&lt;br /&gt;
mkmf - RE&lt;br /&gt;
objspace - RE&lt;br /&gt;
prime - RE&lt;br /&gt;
psych - RE&lt;br /&gt;
racc - RE&lt;br /&gt;
rake - RE&lt;br /&gt;
rdoc - RE&lt;br /&gt;
rexml - RE&lt;br /&gt;
rinda - RE&lt;br /&gt;
ripper - RE&lt;br /&gt;
rubygems - RE&lt;br /&gt;
tk - RE&lt;br /&gt;
win32ole - RE&lt;br /&gt;
xmlrpc - RE&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;HackerEarth admitted the issue (I posted code to replicate on &lt;a href="https://github.com/captn3m0/ruby-stdlib-test-hackerearth" title="HackerEarth Ruby stdlib Tests"&gt;github&lt;/a&gt;), and have since worked on it. I just ran the tests again, and only the following libraries are unavailable now:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;curses - RE&lt;br /&gt;
dbm - RE&lt;br /&gt;
debug - RE&lt;br /&gt;
extmk - RE&lt;br /&gt;
gdbm - RE&lt;br /&gt;
generator - RE&lt;br /&gt;
iconv - RE&lt;br /&gt;
racc - RE&lt;br /&gt;
readline - RE&lt;br /&gt;
rexml - RE&lt;br /&gt;
rinda - RE&lt;br /&gt;
tk - RE&lt;br /&gt;
win32ole - RE&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few of these are understandable (&lt;code class="language-plaintext highlighter-rouge"&gt;win32&lt;/code&gt; since HE platform runs on Linux, and &lt;code class="language-plaintext highlighter-rouge"&gt;tk&lt;/code&gt;, which is a graphical library). A few of these are unavailable in Ruby 2.1.1 (I copied the list of libs from the 2.1.3 docs).&lt;/p&gt;

&lt;p&gt;Kudos to HackerEarth for fixing a bug that very few of their users would have faced. All the source code for this post can be found at &lt;a href="https://github.com/captn3m0/ruby-stdlib-test-hackerearth" title="HackerEarth Ruby stdlib Tests"&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: This article was copied from HackerEarth because they are shutting down their notes platform.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Thu, 12 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/02/12/hackerearth-bug/</guid></item><item><title>March To Triumph As A Mentor</title><link>https://nicolaiarocci.com/march-triumph-mentor/</link><description>&lt;p&gt;If you have time to read just one thing today, then make sure it is &lt;a href="http://emptysqua.re/blog/mentoring/"&gt;March To Triumph As A Mentor&lt;/a&gt;, an essay on Mentoring by A. Jesse Jiryu Davis.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 11 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/march-triumph-mentor/</guid></item><item><title>Bidirectional Pathtracing Integrator</title><link>https://blog.yiningkarlli.com/2015/02/bidirectional-pathtracing-integrator.html</link><description>&lt;p&gt;As part of Takua a0.5’s complete rewrite, I implemented the &lt;a href="https://graphics.cg.uni-saarland.de/fileadmin/cguds/papers/2012/georgiev_sa2012/georgiev_sa2012.pdf"&gt;vertex connection and merging&lt;/a&gt; (VCM) light transport algorithm. Implementing VCM was one of the largest efforts of this rewrite, and is probably the single feature that I am most proud of. Since VCM subsumes bidirectional pathtracing and progressive photon mapping, I also implemented Veach-style bidirectional pathtracing (BDPT) with multiple importance sampling (MIS) and Toshiya Hachisuka’s stochastic progressive photon mapping (SPPM) algorithm. Since each one of these integrators is fairly complex and interesting by themselves, I’ll be writing a series of posts on my BDPT and SPPM implementations before writing about my full VCM implementation. My plan is for each integrator to start with a longer post discussing the algorithm itself and show some test images demonstrating interesting properties of the algorithm, and then follow up with some shorter posts detailing specific tricky or interesting pieces and also show some pretty real-world production-plausible examples of when each algorithm is particularly useful.&lt;/p&gt;

&lt;p&gt;As usual, we’ll start off with an image. Of course, all images in this post are rendered entirely using Takua a0.5. The following image is a Cornell Box lit by a textured sphere light completely encased in a glass sphere, rendered using my bidirectional pathtracer integrator. For reasons I’ll discuss a bit later in this post, this scene belongs to a whole class of scenes that unidirectional pathtracing is absolutely abysmal; these scenes require a bidirectional integrator to converge in any reasonable amount of time:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/spherelight.bdpt.png"&gt;&lt;img alt="Room lit with a textured sphere light enclosed in a glass sphere, converged result rendered using bidirectional pathtracing." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/spherelight.bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To understand why BDPT is a more robust integrator than unidirectional pathtracing, we need to start by examining the light transport equation and its path integral formulation. The light transport equation was &lt;a href="http://dl.acm.org/citation.cfm?id=15902"&gt;introduced by Kajiya&lt;/a&gt; and is typically presented using the formulation from &lt;a href="https://graphics.stanford.edu/papers/veach_thesis/"&gt;Eric Veach’s thesis&lt;/a&gt;:&lt;/p&gt;

&lt;div&gt;\[ L_{\text{o}}(\mathbf{x},\, \omega_{\text{o}}) \,=\, L_e(\mathbf{x},\, \omega_{\text{o}}) \ +\, \int_{\mathcal{S}^2} L_{\text{i}}(\mathbf{x}_\mathcal{M}(\mathbf{x},\, \omega_{i}),\, -\omega_{i}) \, f_s(\mathbf{x},\, \omega_{i} \rightarrow \omega_{\text{o}}) \, d \sigma_{\mathbf{x}}^{\perp} (\omega_{i}) \]&lt;/div&gt;

&lt;p&gt;Put into words instead of math, the light transport equation simply states that the amount of light leaving any point is equal to the amount of light emitted at that point plus the total amount of light arriving at that point from all directions, weighted by the surface reflectance and absorption at that point. Combined with later extensions to account for effects such as volume scattering and subsurface scattering and diffraction, the light transport equation serves as the basis for all of modern physically based rendering. In order to solve the light transport equation in a practical manner, Veach presents the path integral formulation of light transport:&lt;/p&gt;

&lt;div&gt;\[ I_{j} = \int_{\Omega}^{} L_{e}(\mathbf{x}_{0})G(\mathbf{x}_{0}\leftrightarrow \mathbf{x}_{1})[\prod_{i=1}^{k-1}\rho(\mathbf{x}_{i})G(\mathbf{x}_{i}\leftrightarrow \mathbf{x}_{i+1})]W_{e}(\mathbf{x}_{k}) d\mu(\bar{\mathbf{x}}) \]&lt;/div&gt;

&lt;p&gt;The path integral states that for a given pixel on an image, the amount of radiance arriving at that pixel is the integral of all radiance coming in through all paths in path space, where a path is the route taken by an individual photon from the light source through the scene to the camera/eye/sensor, and path space simply encompasses all possible paths. Since there is no closed form solution to the path integral, the goal of modern physically based ray-tracing renderers is to sample a representative subset of path space in order to produce a reasonably accurate estimate of the path integral per pixel; progressive renderers estimate the path integral piece by piece, producing a better and better estimate of the full integral with each new iteration.&lt;/p&gt;

&lt;p&gt;At this point, we should take a brief detour to discuss the terms “unbiased” versus “biased” rendering. Within the graphics world, there’s a lot of confusion and preconceptions about what each of these terms mean. In actuality, an unbiased rendering algorithm is simply one where each iteration produces an exact result for the particular piece of path space being sampled. A biased rendering algorithm is one where at each iteration, an approximate result is produced for the piece of path space being sampled. However, biased algorithms are not necessarily a bad thing; a biased algorithm can be consistent, that is, converges in the limit to the same result as an unbiased algorithm. Consistency means that an estimator arrives at the accurate result in the limit; so in practice, we should care less about whether or not an algorithm is biased or unbiased so long as it is consistent. BDPT is an unbiased, consistent integrator whereas SPPM is a biased but still consistent integrator.&lt;/p&gt;

&lt;p&gt;Going back to the path integral, we can quickly see where unidirectional pathtracing comes from once we view light transport through the path integral. The most obvious way to evaluate the path integral is to do exactly as the path integral says: trace a path starting from a light source, through the scene, and if the path eventually hits the camera, accumulate the radiance along the path. This approach is one form of unidirectional pathtracing that is typically referred to as light tracing (LT). However, since the camera is a fairly small target for paths to hit, unidirectional pathtracing is typically implemented going in reverse: start each path at the camera, and trace through the scene until each path hits a light source or goes off into empty space and is lost. This approach is called backwards pathtracing and is what people usually are referring to when they use the term pathtracing (PT).&lt;/p&gt;

&lt;p&gt;As I discussed a few years back in &lt;a href="http://blog.yiningkarlli.com/2013/04/importance-sampled-direct-lighting.html"&gt;a previous post&lt;/a&gt;, pathtracing with direct light importance sampling is pretty efficient at a wide variety of scene types. However, pathtracing with direct light importance sampling will fail for any type of path where the light source cannot be directly sampled; we can easily construct a number of plausible, common setups where this situation occurs. For example, imagine a case where a light source is completely enclosed within a glass container, such as a glowing filament within a glass light bulb. In this case, for any pair consisting of a point in space and a point on the light source, the direction vector to hit the light point from the surface point through glass is not just the light point minus the surface point normalized, but instead has to be at an angle such that the path hits the light point after refracting through glass. Without knowing the exact angle required to make this connection beforehand, the probability of a random direct light sample direction arriving at the glass interface at the correct angle is extremely small; this problem is compounded if the light source itself is very small to begin with.&lt;/p&gt;

&lt;p&gt;Taking the sphere light in a glass sphere scene from earlier, we can compare the result of pathtracing without glass around the light versus with glass around the light. The following comparison shows 16 iterations each, and we can see that the version with glass around the light is significantly less converged:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/spherelight_16_yesglass.pt.png"&gt;&lt;img alt="Pathtracing, 16 iterations, with glass sphere." src="https://blog.yiningkarlli.com/content/images/2015/Feb/spherelight_16_yesglass.pt.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/spherelight_16_noglass.pt.png"&gt;&lt;img alt="Pathtracing, 16 iterations, without glass sphere." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/spherelight_16_noglass.pt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Generally, pathtracing is terrible at resolving caustics, and the glass-in-light scenario is one where all illumination within the scene is through caustics. Conversely, light tracing is quite good at handling caustics and can be combined with direct sensor importance sampling (same idea as direct light importance sampling, just targeting the camera/eye/sensor instead of a light source). However, light tracing in turn is bad at handling certain scenarios that pathtracing can handle well, such as small distant spherical lights.&lt;/p&gt;

&lt;p&gt;The following image again shows the sphere light in a glass sphere scene, but is now rendered for 16 iterations using light tracing. Note how the render is significantly more converged, for approximately the same computational cost. The glass sphere and sphere light render as black since in light tracing, the camera cannot be directly sampled from a specular surface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/spherelight_16_yesglass.lt.png"&gt;&lt;img alt="Light tracing, 16 iterations, with glass sphere." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/spherelight_16_yesglass.lt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since bidirectional pathtracing subsumes both pathtracing and light tracing, I implemented pathtracing and light tracing simultaneously and used each integrator as a check on the other, since correct integrators should converge to the same result. Implementing light tracing requires BSDFs and emitters to be a bit more robust than in vanilla pathtracing; emitters have to support both emission and illumination, and BSDFs have to support bidirectional evaluation. Light tracing also requires the ability to directly sample the camera and intersect the camera’s image plane to figure out what pixel to contribute a path to; as such, I implemented a rasterize function for my thin-lens and fisheye camera models. My thin-lens camera’s rasterization function supports the same depth of field and bokeh shape capabilities that the thin-lens camera’s raycast function supports.&lt;/p&gt;

&lt;p&gt;The key insight behind bidirectional pathtracing is that since light tracing and vanilla pathtracing each have certain strengths and weaknesses, combining the two sampling techniques should result in a more robust path sampling technique. In BDPT, for each pixel per iteration, a path is traced starting from the camera and a second path is traced starting from a point on a light source. The two paths are then joined into a single path, conditional on an unoccluded line of sight from the end vertices of the two paths to each other. A BDPT path of length &lt;em&gt;k&lt;/em&gt; with &lt;em&gt;k+1&lt;/em&gt; vertices can then be used to generate up to &lt;em&gt;k+2&lt;/em&gt; path sampling techniques by connecting each vertex on each subpath to every other vertex on the other subpath. While BDPT per iteration is much more expensive than unidirectional pathtracing, the much larger number of sampling techniques leads to a significantly higher convergence rate that typically outweighs the higher computational cost.&lt;/p&gt;

&lt;p&gt;Below is the same scene as above rendered with 16 iterations of BDPT, and rendered with the same amount of computation time (about 5 iterations of BDPT). Note how with just 5 iterations, the BDPT result with the glass sphere has about the same level of noise as the pathtraced result for 16 iterations &lt;em&gt;without&lt;/em&gt; the glass sphere. At 16 iterations, the BDPT result with the glass sphere is noticeably more converged than the pathtraced result for 16 iterations without the glass sphere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/spherelight_16_yesglass.bdpt.png"&gt;&lt;img alt="BDPT, 16 iterations, with glass sphere." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/spherelight_16_yesglass.bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/spherelight_5_yesglass.bdpt.png"&gt;&lt;img alt="BDPT, 5 iterations (same compute time as 16 iterations pathtracing), with glass sphere." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/spherelight_5_yesglass.bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A naive implementation of BDPT would be for each pixel per iteration, trace a full light subpath, store the result, trace a full camera subpath, store the result, and then perform the connection operations between each vertex pair. However, since this approach requires storing the entirety of both subpaths for the entire iteration, there is room for some improvement. For Takua a0.5, my implementation stores only the full light subpath. At each bounce of the camera subpath, my implementation connects the current vertex to each vertex of the stored light subpath, weights and accumulates the result, and then moves onto the next bounce without having to store previous path vertices.&lt;/p&gt;

&lt;p&gt;The following image is another example of a scene that BDPT is significantly better at sampling than any unidirectional pathtracing technique. The scene consists of a number of diffuse spheres and spherical lights inside of a glass bunny. In this scene, everything outside of the bunny is being lit using only caustics, while diffuse surfaces inside of the bunny are being lit using a combination of direct lighting, indirect diffuse bounces, and caustics from outside of the bunny reflecting/refracting back &lt;em&gt;into&lt;/em&gt; the bunny. This last type of lighting belongs to a category of paths known as &lt;em&gt;specular-diffuse-specular&lt;/em&gt; (SDS) paths that are especially difficult to sample unidirectionally.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/bunnylight.bdpt.png"&gt;&lt;img alt="Various diffuse spheres and sphere lights inside of a glass bunny, rendered using BDPT." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/bunnylight.bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the same scene as above, but with the glass bunny removed just so seeing what is going on with the spheres is a bit easier:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/bunnylight_nobunny.bdpt.png"&gt;&lt;img alt="Same spheres as above, sans bunny. Rendered using BDPT." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/bunnylight_nobunny.bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comparing pathtracer versus BDPT performance for 16 interations, BDPT’s vastly better performance on this scene becomes obvious:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/bunnylight_16.pt.png"&gt;&lt;img alt="16 iterations, rendered using pathtracing." src="https://blog.yiningkarlli.com/content/images/2015/Feb/bunnylight_16.pt.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Feb/bunnylight_16.bdpt.png"&gt;&lt;img alt="16 iterations, rendered using BDPT." src="https://blog.yiningkarlli.com/content/images/2015/Feb/preview/bunnylight_16.bdpt.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the next post, I’ll write about multiple importance sampling (MIS), how it impacts BDPT, and my MIS implementation in Takua a0.5.&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Wed, 11 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2015/02/bidirectional-pathtracing-integrator.html</guid></item><item><title>VirtualBox: Internet Access With Host-Only Network</title><link>https://kyrofa.com/posts/virtualbox-internet-access-with-host-only-network/</link><description>I ran into the need to access the internet from a VirtualBox VM via host-only networking. Of course, you&amp;rsquo;re saying &amp;ldquo;There&amp;rsquo;s a better way to do that!&amp;rdquo; And of course, I agree: with no other considerations, the best way to do this is to simply add another NIC to the VM configured as NAT instead of host-only. However, I&amp;rsquo;m trying to test out some new networking ideas for my OpenStack Network node, and it doesn&amp;rsquo;t have a NIC configured with NAT.</description><author>kyrofa's blog</author><pubDate>Wed, 11 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://kyrofa.com/posts/virtualbox-internet-access-with-host-only-network/</guid></item><item><title>Fattura Elettronica Open Source</title><link>https://nicolaiarocci.com/fattura-elettronica-open-source/</link><description>&lt;p&gt;&lt;em&gt;this post is about an all-italian open source release, so it’s going to be in italian&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/FatturaElettronicaPA"&gt;FatturaElettronicaPA&lt;/a&gt; è un nuovo progetto open source che ho rilasciato qualche giorno fa assieme alla &lt;a href="http://gestionaleamica.com"&gt;mia azienda&lt;/a&gt;. Si tratta di una libreria C# che permette di leggere, scrivere e convalidare le Fatture Elettroniche aderenti alle specifiche del &lt;a href="http://www.fatturapa.gov.it/export/fatturazione/sdi/Specifiche_tecniche_del_formato_FatturaPA_V1.1.pdf"&gt;sistema di interscambio&lt;/a&gt; della Pubblica Amministrazione.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 10 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/fattura-elettronica-open-source/</guid></item><item><title>Introducing: Silent counter</title><link>https://purpleidea.com/blog/2015/02/09/introducing-silent-counter/</link><description>&lt;p&gt;You might want to write code that can tell how many iterations have passed since some action occurred. Alternatively, you might want to know if it&amp;rsquo;s the first time a machine has run &lt;a href="https://en.wikipedia.org/wiki/Puppet_%28software%29"&gt;Puppet&lt;/a&gt;. To do these types of things, you might wish to have a &lt;a href="https://en.wikipedia.org/wiki/Monotonic_function"&gt;monotonically&lt;/a&gt; increasing counter in your Puppet manifest. Since one did not exist, I set out to build one!&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;The code&lt;/span&gt;:&lt;/p&gt;
&lt;p&gt;If you just want to try the code, and skip the ramble, you can include &lt;a href="https://github.com/purpleidea/puppet-common/blob/master/manifests/counter.pp#L18"&gt;common::counter&lt;/a&gt; into your manifest. The entire class is part of my puppet-common module:&lt;/p&gt;</description><author>The Technical Blog of James on purpleidea.com</author><pubDate>Mon, 09 Feb 2015 09:31:58 GMT</pubDate><guid isPermaLink="true">https://purpleidea.com/blog/2015/02/09/introducing-silent-counter/</guid></item><item><title>Butterick's Practical Typography</title><link>https://june.kim/practical-typography/</link><author>june.kim</author><pubDate>Mon, 09 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://june.kim/practical-typography/</guid></item><item><title>Te occidere possunt by David Foster Wallace</title><link>https://ho.dges.online/words/commonplace/te-occidere-possunt-by-david-foster-wallace/</link><description>&lt;blockquote&gt;
&lt;p&gt;“Te occidere possunt sed te edere non possunt nefas est - roughly ‘they can kill you but the legalities of eating you are quite a bit dicier’. “&lt;/p&gt;
&lt;/blockquote&gt;</description><author>ho.dges.online</author><pubDate>Mon, 09 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/te-occidere-possunt-by-david-foster-wallace/</guid></item><item><title>SICB 2015 presentation slides!</title><link>https://jonathanchang.org/blog/sicb-2015-presentation-slides/</link><description>&lt;p&gt;I presented my crowdsourced morphometrics work with the Encyclopedia of Life at the Society for Integrative and Comparative Biology last month! I got some great feedback, both in person and via Twitter. Check out the slides via the link below!&lt;/p&gt;
  &lt;p&gt;Chang, Jonathan (2015): Crowdsourced morphometric data are as accurate as traditionally collected data. figshare. &lt;a href="http://dx.doi.org/10.6084/m9.figshare.1284494"&gt;http://dx.doi.org/10.6084/m9.figshare.1284494&lt;/a&gt;&lt;/p&gt;</description><author>Jonathan Chang</author><pubDate>Sun, 08 Feb 2015 02:11:07 GMT</pubDate><guid isPermaLink="true">https://jonathanchang.org/blog/sicb-2015-presentation-slides/</guid></item><item><title>Cap Watkins: VP of Design at Buzzfeed</title><link>https://solomon.io/cap-watkins-vp-of-design-at-buzzfeed/</link><description>Cap Watkins is the VP of Design at Buzzfeed. Previously he worked for Etsy, Amazon, Formspring and was the first designer at Zoosk.</description><author>Sam Solomon</author><pubDate>Sun, 08 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://solomon.io/cap-watkins-vp-of-design-at-buzzfeed/</guid></item><item><title>Please tell ALL Facebook partners what you want to keep private</title><link>https://stop.zona-m.net/2015/02/tell-facebook-partners-what-you-want-to-keep-private/</link><description>&lt;figure&gt;
  &lt;img alt="Please tell ALL Facebook partners what you want to keep private /img/deepface-bigbrother.png" src="https://stop.zona-m.net//img/deepface-bigbrother.png" width="100%" /&gt;
&lt;/figure&gt;
&lt;p&gt;Here are three critical quotes from an article about DeepFace, the Facebook automatic face recognition system, followed by my explanation of what they really mean&lt;/p&gt;</description><author>Welcome to Marco Fioretti's website! on Stop at Zona-M</author><pubDate>Sat, 07 Feb 2015 18:10:00 GMT</pubDate><guid isPermaLink="true">https://stop.zona-m.net/2015/02/tell-facebook-partners-what-you-want-to-keep-private/</guid></item><item><title>Screenshot Saturday 210</title><link>https://etodd.io/2015/02/06/screenshot-saturday-210/</link><description>&lt;p&gt;I finished last week's map. It has some spinny things.&lt;/p&gt;
&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/CompetentAgitatedIchneumonfly.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;
&lt;p&gt;Then I made this week's map.&lt;/p&gt;
&lt;a href="https://etodd.io/assets/XAfbrRd.jpg"&gt;&lt;img src="https://etodd.io/assets/XAfbrRdl.jpg" /&gt;&lt;/a&gt;
&lt;a href="https://etodd.io/assets/h1TLRq9.jpg"&gt;&lt;img src="https://etodd.io/assets/h1TLRq9l.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;Who knew purple and green could look so... not terrible?&lt;/p&gt;
&lt;p&gt;
	Anyway, this puts me ahead of schedule. There are three levels remaining.
	My goal is to for the game to be playable from start to finish by the end of February.
	It's ambitious, but I'm confident I can do it!
&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 06 Feb 2015 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/02/06/screenshot-saturday-210/</guid></item><item><title>OSX Development Setup</title><link>https://peterlyons.com/problog/2015/02/osx-development-setup/</link><description>&lt;p&gt;This post will describe my current setup for development on OS X.&lt;/p&gt;
&lt;h3 id="requirements"&gt;Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;easy to maintain&lt;/li&gt;
&lt;li&gt;easy to recreate&lt;/li&gt;
&lt;li&gt;easy to work with during development&lt;/li&gt;
&lt;li&gt;friendly to many projects/clients with highly varied software stacks&lt;/li&gt;
&lt;li&gt;don't pollute my main OSX install too much&lt;/li&gt;
&lt;li&gt;Don't interfere with my core tools: text editor, local filesystem, git, command line terminal&lt;/li&gt;
&lt;li&gt;allow offline work&lt;/li&gt;
&lt;li&gt;don't make me crazy with too many DHCP IPs, port mappings, virtual networks, etc&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tools"&gt;Tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; for running other OSes in VMs on top of OS X&lt;/li&gt;
&lt;li&gt;Ubuntu as my preferred OS for linux based servers&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; for containerized apps&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vagrantup.com/"&gt;Vagrant&lt;/a&gt; to script creation of virtualbox VMs&lt;/li&gt;
&lt;li&gt;&lt;a href="http://boot2docker.io/"&gt;boot2docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="OSX Dev Setup" src="https://peterlyons.com/problog/images/2015/osx-dev-setup.png" /&gt;&lt;/p&gt;
&lt;h3 id="my-app-stacks"&gt;My App Stacks&lt;/h3&gt;
&lt;p&gt;I generally build web applications that involve a node.js based application server, one or more database servers, and an optional front-end web server (used in stage and production but not in development).&lt;/p&gt;
&lt;h3 id="just-go-to-town-with-homebrew"&gt;Just go to town with homebrew?&lt;/h3&gt;
&lt;p&gt;The simplest thing would probably be to install all my tools and databases with homebrew straight into OS X. And I think actually that's probably fine for a lot of people. I don't do it for reasons that are admittedly a bit emotional/OCD.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I feel like getting too much stuff installed in my OS gradually pollutes it, destabilizes it, slows it down, and makes me feel doubt about it&lt;/li&gt;
&lt;li&gt;Managing background daemons on OS X is awkward&lt;/li&gt;
&lt;li&gt;Since I deploy to linux, I'd like to run and manage my DBs  on linux&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="virtualbox-for-dbs"&gt;VirtualBox for DBs&lt;/h3&gt;
&lt;p&gt;So for the above reasons, I use Vagrant to script a base Ubuntu VM I call "dbs". I give this 2 network interfaces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adapter 1 is a NAT setup with a DHCP-assigned IP that gives the VM access to the Internet via my Mac's Internet connection&lt;/li&gt;
&lt;li&gt;Adapter 2 is a host-only network with a static IP so I can always access this host&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I put the host name "dbs" with the host-only IP in my &lt;code&gt;/etc/hosts&lt;/code&gt; file on my mac and I can access it via &lt;code&gt;ssh dbs&lt;/code&gt;. I directly install via &lt;code&gt;apt-get install&lt;/code&gt; all the DBs I want to use for local development and client work: postgresql, mysql, couchdb, elasticsearch, etc. I run these on the default port for simplicity and try not to do too much configuration. I do have to configure them to bind to the host-only IP address though, which also makes sure they are not reachable from anywhere other than my mac.&lt;/p&gt;
&lt;p&gt;That gets me what I need for developing multiple client projects. After a reboot I have a shell alias to start this VM: &lt;code&gt;VBoxManage startvm dbs&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="docker-for-staging-containers"&gt;Docker for staging containers&lt;/h3&gt;
&lt;p&gt;I've started using docker a bit both for client work and one personal side project and so far I'm liking it. To allow me to do docker builds and deploy containers, I run docker inside the "dbs" VM as well.&lt;/p&gt;
&lt;p&gt;When I created this setup &lt;a href="http://boot2docker.io/"&gt;boot2docker&lt;/a&gt; was not quite ready for prime time, but if I had to start over, I might just use boot2docker and run everything as containers. But what I have is every bit as easy to manage for the moment, so I haven't bothered to rebuild it.&lt;/p&gt;
&lt;p&gt;So for docker work I just &lt;code&gt;export DOCKER_HOST=tcp://dbs:2375&lt;/code&gt; and use the docker command from homebrew on my mac to do my docker work.&lt;/p&gt;
&lt;p&gt;For my dockerized side project, I can run the full stack of docker containers exactly like I do in production all locally on my laptop, which provides an adequate staging environment such that I don't feel a dedicated staging system in the cloud is necessary. I use the same automation scripts to automate docker stuff on my staging VM and for production I just point them at the production host which is a digital ocean droplet. So far it's worked pretty well for me.&lt;/p&gt;</description><author>Pete's Points</author><pubDate>Fri, 06 Feb 2015 22:42:03 GMT</pubDate><guid isPermaLink="true">https://peterlyons.com/problog/2015/02/osx-development-setup/</guid></item><item><title>On Sustainable Open Source Management</title><link>https://nicolaiarocci.com/sustainable-open-source-management/</link><description>&lt;p&gt;Tom Christie has some very good things to say on how to successfully maintain an open source project without losing sanity.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Truth one: There are, and will always be, a non-finite number of possible valid issues to address. Your code can always be better polished, your APIs better defined, and your project more fully featured. Your documentation can always be better. The ecosystem within which your project lives is constantly evolving. You will never run out of things you could work on. Ever.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Fri, 06 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/sustainable-open-source-management/</guid></item><item><title>I am offended</title><link>https://captnemo.in/blog/2015/02/06/i-am-offended/</link><description>&lt;p&gt;To start with, here’s a piece of art that &lt;em&gt;is meant to offend you&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="/img/bharatmata.jpg"&gt;&lt;img alt="Bharat Mata, by MF Hussain" src="/img/bharatmata_thumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above is an artwork by MF Hussain. Its was sold as an untitled work by Hussain to a private collector, but was named &lt;em&gt;Bharat Mata&lt;/em&gt; later when it was sold in an auction.&lt;/p&gt;

&lt;p&gt;Were you offended by looking at it? Maybe.
Does it look vulgar and offensive to you? Perhaps.
What should you do as a result?&lt;/p&gt;

&lt;p&gt;CLOSE THE TAB!&lt;/p&gt;

&lt;p&gt;Seriously, India. The right thing to do when you are offended is not to &lt;a href="http://indianexpress.com/article/india/politics/muslim-techie-beaten-to-death-in-pune-7-men-of-hindu-outfit-held/"&gt;&lt;em&gt;lynch a person to death&lt;/em&gt;&lt;/a&gt;, or to &lt;a href="http://timesofindia.indiatimes.com/india/Fatwa-issued-against-Vande-Mataram/articleshow/5191847.cms"&gt;issue a fatwa against singing the national song&lt;/a&gt;. The right thing to do is this:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Flip the table" src="https://boardgametime.files.wordpress.com/2012/04/table_flip.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;The right to get offended in India is a result of the way our constitution curbs the freedom of speech. However, these restrictions were not in the constitution that was passed when India was made a republic (26 Jan 1950). It was added as the First Amendment (ironic, I know), which passed in June 1951.&lt;/p&gt;

&lt;p&gt;In the 18 months that passed between these two events, Indians had the right to absolute freedom of speech. I won’t go into the details of why both Nehru and Patel thought of bringing these restrictions (for the better of India), but needless to say, the reasons are no longer valid.&lt;/p&gt;

&lt;p&gt;However, I found a curious piece of irony while researching this:&lt;/p&gt;

&lt;p&gt;One of the prime opponents to the First Amendment restrictions was &lt;a href="http://www.wikiwand.com/en/Syama_Prasad_Mukherjee"&gt;Syama Prasad Mookerjee&lt;/a&gt;, a long time RSS activist, founder of the Bharatiya Jana Sangh and widely regarded as the &lt;a href="http://www.shyamaprasad.org/home.html"&gt;godfather of Hindu Nationalism&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And now today, 64 years later, these restrictions are getting enacted into even more draconian laws. One such law is Section 66A of the Information Technology Act.&lt;/p&gt;

&lt;p&gt;Kapil Sibal, former union minister &lt;a href="http://indiatoday.intoday.in/story/freedom-internet-online-charlie-hebdo-kapil-sibal/1/416011.html"&gt;writes about it&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Allowing the government to regulate the internet is a recipe for disaster. Government being what it is, it would use such power to further its own ends.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, he gives in to the diplomatic reasoning and writes further:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I know where I stand. I am for freedom of expression, but there are no absolutes in life. Limitless freedom contains within it the seeds of conflict. We must eschew conflict and embrace freedom, for peace and harmony.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Note that back in 2012, Kapil Sibbal had spoken &lt;a href="http://tech.firstpost.com/news-analysis/dear-sibal-here-is-why-section-66a-does-not-protect-women-212326.html"&gt;in favor of Section 66A&lt;/a&gt;, citing it as a tool to protect women online. He seems to have reversed his stance since.&lt;/p&gt;

&lt;p&gt;This is what Tushar Mehta, Additional Solicitor General has to say on the necessity of the act:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[…] every institution and every person right from the President can be subjected to criticism and it is people’s fundamental right to free speech and expression but such rights do not cover grossly offensive comments and posts on social networking sites.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AIB recently tested their rights by making a grossly offensive video and posting it on social networking sites. A lot of people were offended. The video was taken down as a result.&lt;/p&gt;

&lt;p&gt;Did the people who were offended see the video? Yes, probably on YouTube. But the recordings are still floating around, and are available on torrents very easily.&lt;/p&gt;

&lt;p&gt;You see, the internet is a resilient beast. You can’t control it, or bend it to your will. It does not run by your rules, and your sense of sensibility. It has no concept of right or wrong. It just is.&lt;/p&gt;

&lt;p&gt;A nation where I am afraid to post critical views of the government or discuss events that might offend someone is not a nation worth living in.&lt;/p&gt;

&lt;p&gt;The internet cannot be regulated. You might certainly think of it as possible, but &lt;a href="https://www.eff.org/" title="Electronic Frontier Foundation"&gt;we&lt;/a&gt; &lt;a href="https://wikileaks.org/" title="Wikileaks"&gt;will&lt;/a&gt; &lt;a href="https://www.torproject.org/" title="The Tor Project"&gt;always&lt;/a&gt; &lt;a href="https://thepiratebay.org/" title="The Pirate Bay"&gt;find&lt;/a&gt; a way.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If you are offended it is your problem, and frankly lots of things offend lots of people. - &lt;a href="http://www.goodreads.com/quotes/739464-nobody-has-the-right-to-not-be-offended-that-right"&gt;Salman Rushdie&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don’t think I will ever see the first amendment repealed in my lifetime. However, I’m gonna try my very best to get the Supreme Court to re-evaluate Section 66A as unconstitional and over-reaching.&lt;/p&gt;

&lt;p&gt;If you want to let the government know of your thoughts on the matter, the Assistant Solicitor General (representing the Government in the case) can be reached at &lt;a href="mailto:tusharmehta64@yahoo.com"&gt;tusharmehta64@yahoo.com&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="further-reading"&gt;Further Reading&lt;/h2&gt;

&lt;p&gt;This is a loose list of various references and readings on the topic.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://vimeo.com/92778395"&gt;A Story of Censorship: How the Right to Take Offense is Shrinking Free Speech in India&lt;/a&gt; - A video seminar on the topic by Anuradha Raman, Outlook Magazine&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/First_Amendment_of_the_Constitution_of_India"&gt;First Amendment&lt;/a&gt; of the Constitution of India&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://scroll.in/article/700020/Why-Nehru-and-Sardar-Patel-curbed-freedom-of-expression-in-India"&gt;Why Nehru and Sardar Patel curbed freedom of expression in India&lt;/a&gt; - A nice summary of the events that lead to the passing of the First Amendment&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://timesofindia.indiatimes.com/india/Bharat-Mata-a-work-of-art-SC/articleshow/3459623.cms"&gt;Bharat Mata a work of art&lt;/a&gt; - A ruling by the Supreme Court declaring the topmost image in this post as a work of art, and that &lt;em&gt;no one gets scandalized looking at art&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.wikiwand.com/en/Freedom_of_expression_in_India"&gt;Restrictions on freedom of speech in India&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.livemint.com/Opinion/hZBwopyF7MD10C8QHODZEN/Of-writers-and-poets-who-criticize-with-their-pens.html"&gt;An excellent piece on abolishing the restrictions on free speech&lt;/a&gt; titled &lt;em&gt;Of writers and poets who criticize with their pens&lt;/em&gt; (Rajeev Mantri)&lt;/li&gt;
  &lt;li&gt;A few pieces on the ongoing panel: &lt;a href="http://indiatoday.intoday.in/story/objectionable-social-media-posts-cyberspace-modi-government-supreme-court-facebook-twitter-freedom-of-expression/1/416800.html"&gt;India Today&lt;/a&gt;, &lt;a href="http://indianexpress.com/article/india/india-others/sc-on-it-act-will-examine-section-66a-as-it-stands/"&gt;Indian Express&lt;/a&gt;, &lt;a href="http://www.firstpost.com/living/who-defines-grossly-offensive-sc-raises-red-flags-over-draconian-sec-66a-of-it-act-2079081.html"&gt;Firstpost’s Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;Thanks to &lt;a href="https://shashankmehta.in/"&gt;Shashank Mehta&lt;/a&gt; and &lt;a href="https://rkravi.com/"&gt;Ravi Kishore&lt;/a&gt; for reviewing drafts of this.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Fri, 06 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/02/06/i-am-offended/</guid></item><item><title>Supercharge your Android Application-4(Threads).</title><link>https://prashamhtrivedi.in/supercharge-android-application-4.html</link><description>In the final part of the series, we will focus on how to handle your heavy operations like network calls in threads. This part is useful for those who does not rely on any libraries for that.</description><author>Prasham H Trivedi</author><pubDate>Thu, 05 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/supercharge-android-application-4.html</guid></item><item><title>How about a Sentinel for your Flask Application?</title><link>https://nicolaiarocci.com/a-sentinel-for-your-flask-applications/</link><description>&lt;p&gt;&lt;a href="https://github.com/nicolaiarocci/flask-sentinel"&gt;Flask-Sentinel&lt;/a&gt; is a OAuth2 Server implementation of the Resource Owner Password Credentials Grant pattern described in &lt;a href="http://tools.ietf.org/html/rfc6749#section-1.3.3"&gt;Section 1.3.3 of RFC 6749&lt;/a&gt;. It is powered by Flask-Oauthlib, Redis and MongoDB and is bundled as a Flask extension so it can be used to add OAuth2 capabilities to an existing application.&lt;/p&gt;
&lt;p&gt;So what is the Resource Owner Password Credentials Grant pattern? According to the official RFC:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The resource owner password credentials (i.e., username and password) can be used directly as an authorization grant to obtain an access token. The credentials should only be used when there is a high degree of trust between the resource owner and the client (e.g., the client is part of the device operating system or a highly privileged application).&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 04 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/a-sentinel-for-your-flask-applications/</guid></item><item><title>Internet Outrage Fatigue Syndrome (IOFS)</title><link>https://tiltingatwindmills.dev/internet-odrome-iofs/</link><description>The 1980s were a scary time to be a kid. At least that is if you watched the
evening news. Every night at 6 and 11 you'd be apprised of a…</description><author>Tilting at Windmills</author><pubDate>Wed, 04 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/internet-odrome-iofs/</guid></item><item><title>Had my computer lying around...</title><link>https://ericonotes.blogspot.com/2014/07/had-my-computer-lying-around.html</link><description>&lt;div id="yass_top_edge_dummy"&gt;
&lt;/div&gt;
&lt;div id="yass_top_edge"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; margin-top: 8px; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi24hiTWkBv8wl7BJh8qWLcC2oQrEhgQf8G0HeLTvgAhjYAwLBatLRWYUHCoVJR2BErPOGwqcSzGUOBGjpRX1EogOtqwb35tEWmLUi5pEwAHkug7IlMg5biaFaEcd6TeR0WoXrK_TT9Kmpk/s1600/3dcam.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi24hiTWkBv8wl7BJh8qWLcC2oQrEhgQf8G0HeLTvgAhjYAwLBatLRWYUHCoVJR2BErPOGwqcSzGUOBGjpRX1EogOtqwb35tEWmLUi5pEwAHkug7IlMg5biaFaEcd6TeR0WoXrK_TT9Kmpk/s1600/3dcam.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Been away from here for some time, basically I haven't been doing much fun stuff lately that seemed important to share here. But, last week, a friend asked me if I could help him counting people heads in a store. Basically, there is this very expensive hardware that use two cameras side by side, with an IR only filter and an IR emitter, so the idea is to find what is a head in a image and at what distance this head is from the camera pair, that's supposed to be installed on the ceiling, if the heads are in some range of height, they are probably human, so the camera counts plus one.&lt;br /&gt;
&lt;br /&gt;
Ok so he asked me: can we do it? I thought for a minute, and replied "Yes, but you will need to buy some hardware to test it, don't know if it's worth the time", because it would take some time to receive the product and only then start to prototyping... And then it hit me! My laptop has stereoscopic camera! Emailed him, "give me two hours". Short story, in two hours, knowing near nothing on video processing, I could put together this code - using also code from around the web - that could do something near what he needed.&lt;br /&gt;
&lt;br /&gt;
Ok, this codes needs to calculate the distance of something to the camera, so the idea is simple, get whatever moves more in one image, get the same for the other camera, assume that it's the same thing, and use math to calculate the distance. My equation came from this article:&amp;nbsp;&lt;a href="http://photon07.pd.infn.it:5210/users/dazzi/Thesis_doctorate/Info/Chapter_6/Stereoscopy_(Mrovlje).pdf"&gt;http://photon07.pd.infn.it:5210/users/dazzi/Thesis_doctorate/Info/Chapter_6/Stereoscopy_(Mrovlje).pdf&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Viewing angle was measured using my bedroom wall, the points at each top corners of the screen where marked on the wall, and distance between then was measured and also the distance from the wall to the computer, the angle came from the resulting triangle. Did this once for each camera.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background: rgb(240, 240, 240); border: 1px dashed rgb(204, 204, 204); height: auto; overflow: auto; padding: 0px; text-align: left; width: 99%;"&gt;&lt;code style="color: black; font-family: arial; font-size: 12px; line-height: 20px;"&gt; // First example on image processing  
 // Finds the square with bigger difference from the latter  
 // Do it for both cams  
 // Guess that it's in the same object  
 // Tell the distance from the object  
 // Prototype to be further rewritten in OpenCV  
 // This code uses snippets form this great german website:  
 // http://www.creativecoding.org/lesson/topics/video/video-in-processing  
 // Aktivität in Bildbereichen feststellen in Processing  
 import processing.video.*;  
 final int VIDEO_WIDTH = 320;  
 final int VIDEO_HEIGHT = 240;  
 final int VIDEO_COLS  = 16;  
 final int VIDEO_ROWS  = 12;  
 float[] activityR = new float[VIDEO_COLS * VIDEO_ROWS];  
 float[] buffer1R = new float[VIDEO_WIDTH * VIDEO_HEIGHT];  
 float[] buffer2R = new float[buffer1R.length];  
 float[] buffer3R = new float[buffer1R.length];  
 float[] activityL = new float[VIDEO_COLS * VIDEO_ROWS];  
 float[] buffer1L = new float[VIDEO_WIDTH * VIDEO_HEIGHT];  
 float[] buffer2L = new float[buffer1L.length];  
 float[] buffer3L = new float[buffer1L.length];  
 float Max=0;  
 int maxIndex;   
 Capture camR = null;  
 Capture camL = null;  
 int POSITIONXR = 0;  
 int POSITIONXL = 0;  
 float Distance = 0;  
 int maxIndexN(float[] array) {  
  float Max=0;  
  int maxIndex = 0;   
  for(int i = 0; i&amp;lt;array.length; i++){   
    if(array[i]&amp;gt; Max){   
     Max=array[i];   
     maxIndex = i;    
   }   
  }  
  return maxIndex;  
 }   
 void setup () {  
  size (640, 240);  
  camR = new Capture (this, VIDEO_WIDTH, VIDEO_HEIGHT,"LG 3D R Webcam", 30);  
  camL = new Capture (this, VIDEO_WIDTH, VIDEO_HEIGHT,"LG 3D L Webcam", 30);  
  frameRate (15);  
  camR.start();     
  camL.start();   
 }  
 void draw () {  
  if (camR.available ()) {  
   camR.read ();  
   int index;  
   int pxPerCol = VIDEO_WIDTH / VIDEO_COLS;  
   int pxPerRow = VIDEO_HEIGHT / VIDEO_ROWS;  
   image (camR, 0, 0);  
   for (int i=0; i &amp;lt; activityR.length; i++) {  
    activityR[i] = 0;  
   }  
   for (int i=0; i &amp;lt; camR.pixels.length; i++) {  
    //Calculates activity for the Right Camera   
    int x = (int) ((i % camR.width) / pxPerCol);  
    int y = (int) ((i / camR.width) / pxPerRow);  
    index = y * VIDEO_COLS + x;  
    color col = camR.pixels[i];  
    float sum = red (col) + green (col) + blue (col);  
    float deltaPixel = (buffer1R[i] + buffer2R[i] + buffer3R[i]) / 3 - sum;  
    if (deltaPixel &amp;lt; 0) {  
     deltaPixel *= -1;  
    }  
    activityR[index] += deltaPixel;  
    buffer3R[i] = buffer2R[i];  
    buffer2R[i] = buffer1R[i];  
    buffer1R[i] = sum;  
   }  
   int numeroQ = maxIndexN(activityR);  
   // This simply plots the X,Y position of the maxActivity index    
   textSize(32);  
   fill(255, 255, 255);  
   text(numeroQ%VIDEO_COLS, 10, 30);  
   text(",", 50, 30);  
   text(numeroQ/VIDEO_COLS, 60, 30);  
   POSITIONXR = numeroQ%VIDEO_COLS;  
   // Set activity for the right camera  
   for (int i=0; i &amp;lt; activityR.length; i++) {  
    activityR[i] /= pxPerCol* pxPerRow;  
    stroke (255, 20);  
    fill (0, 255, 230, activityR[i]);  
    rect ((i % VIDEO_COLS) * pxPerCol, (i / VIDEO_COLS) * pxPerRow, pxPerCol, pxPerRow);  
   }  
  }  
   if (camL.available ()) {  
   camL.read ();  
   int index;  
   int pxPerCol = VIDEO_WIDTH / VIDEO_COLS;  
   int pxPerRow = VIDEO_HEIGHT / VIDEO_ROWS;  
   image (camL, 320, 0);  
   for (int i=0; i &amp;lt; activityL.length; i++) {  
    activityL[i] = 0;  
   }  
   for (int i=0; i &amp;lt; camL.pixels.length; i++) {  
    // Calculate activity for the Left Camera  
    int x = (int) ((i % camL.width) / pxPerCol);  
    int y = (int) ((i / camL.width) / pxPerRow);  
    index = y * VIDEO_COLS + x;  
    color col = camL.pixels[i];  
    float sum = red (col) + green (col) + blue (col);  
    float deltaPixel = (buffer1L[i] + buffer2L[i] + buffer3L[i]) / 3 - sum;  
    if (deltaPixel &amp;lt; 0) {  
     deltaPixel *= -1;  
    }  
    activityL[index] += deltaPixel;  
    buffer3L[i] = buffer2L[i];  
    buffer2L[i] = buffer1L[i];  
    buffer1L[i] = sum;  
   }  
   int maxIndexN = maxIndexN(activityL);  
   // Just here to write the maxActivity X,Y position    
   textSize(32);  
   fill(255, 255, 255);  
   text(maxIndexN%VIDEO_COLS, 330, 30);  
   text(",", 370, 30);  
   text(maxIndexN/VIDEO_COLS, 380, 30);  
   POSITIONXL = maxIndexN%VIDEO_COLS;  
   for (int i=0; i &amp;lt; activityL.length; i++) {  
    //Just to ´rint out the activity  
    activityL[i] /= pxPerCol* pxPerRow;  
    stroke (255, 20);  
    fill (0, 255, 230, activityL[i]);  
    rect ((i % VIDEO_COLS) * pxPerCol+320, (i / VIDEO_COLS) * pxPerRow, pxPerCol, pxPerRow);  
   }  
   // Calculates distance, uses 50° as the viewing angle  
   Distance = 35*VIDEO_COLS / (2*tan(0.436)*(POSITIONXL-POSITIONXR));  
   // Prints out the calculated distance  
   textSize(32);  
   fill(255, 255, 255);  
   text(Distance, 200, 200);  
   text("DISTANCE =", 10, 200);   
  }  
 }  
 // Conclusion here is that the most hard is how to tell that whatever you select on left camera to find  
 // the distance from camera, what's the same thing on the right camera.
 //
 // Copyright 2014 Érico Porto
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
 //    http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
   &lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div id="yass_bottom_edge" style="background-position: 0px 0px; border-width: 0px; display: block; height: 0px; margin: 0px; padding: 0px; width: 100%;"&gt;
&lt;/div&gt;</description><author>Erico Notes</author><pubDate>Wed, 04 Feb 2015 01:37:51 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2014/07/had-my-computer-lying-around.html</guid></item><item><title>A Glass of Lores</title><link>https://ericonotes.blogspot.com/2015/01/hello.html</link><description>&lt;h3&gt;
Hello. This a different post… Nothing was lying around...&lt;/h3&gt;
&lt;br /&gt;
I’ve read in a book recently - &lt;a href="http://www.amazon.com/Steal-Like-Artist-Things-Creative/dp/0761169253"&gt;Steal Like an Artist&lt;/a&gt; - a phrase, that’s attributed to a cartoonist named Tom Gauld, “&lt;i&gt;that once the computer is involved, ‘things are on an inevitable path to being finished. Whereas in my sketchbook the possibilities are endless.’&lt;/i&gt;”&lt;br /&gt;
&lt;br /&gt;
Since the Moleskines brought the paper as something cool again - I use most the less expensive alternatives -, my sketches proved this to be true.&lt;br /&gt;
&lt;br /&gt;
Ok, so in the post long before I talked about how I was wanting to make a game, then came some programming stuff later. Ok, so a lot of the basic programming stuff is now finished, someone somewhere in the internet said that at the conception a game needs gameplay, and not story. So I followed this advice and worked without story and few graphics to get some gameplay. But I’m making a RPG. A RPG needs a story that connects very well to it’s gameplay.&lt;br /&gt;
&lt;br /&gt;
Ok, so, to this RPG I’m making, I needed some basic background, the story of my world, to build the player story on top. Here I’m presenting a small but significant portion of this story. There is probably a lot of spelling and semantics error, and the names are inclined to change.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
&lt;i&gt;A Glass of Lores&lt;/i&gt;&lt;/h2&gt;
&lt;i&gt;My mom told me this story when I was very little, maybe some parts I modified, hearing others in the village. We came from the Unseeable Continent, where existed three small cities, each one with different focus, so near one from the other, with a plain plaza in the heart, where people gathered to discuss their dilemmas, drinked for love, wrote poems, stories and pursued the reason of their own existence. Novatetks produced wine, Ecteletikos focused on the rice crops, and Ykiniantopi breed the Yaks. Their texts travelled the world, and their readers got interested in these small cities.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;One of this readers was an Emperor, from a far away land. That emperor was very young, and very impressed with the quality, and requested a visit to Trisan. The emperor visit was not well received by the citizens, who appreciated the isolation from the rest of the Unseeable Continent. The emperor came and went, and during his stay in the land, he noted, looking in the sand, a bright mineral, a very rare one, that he had not seen before in the vast amount as it was there available to the citizens of the three cities.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;Unfortunately, not only did the people from Trisan knew no way of how to extract that mineral from the sand, they had no army, and no way to defend themselves. The emperor sent a messenger to deliver a big floured text that read as threat, “send the mineral or I will send my troops, and I will send my troops to bring your three cities to ashes in less than ten years”.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;The people from Trisan decided they needed to be capable of defending itself, they looked the old texts on how to build weapons and started reading on how to fight a combat. A small explorer group was united to find the resources. The scouter group decided the near islands were safer places to explore, because it was known they were uninhabited.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;A big island turned out to be the perfect finding - a big mountain made almost solely of iron, so hot in places that it melted to the surface. Weapons could be forged there easily. The island had no fertile ground, and the water there only existed in small lakes that were created by rain. Since the mountain was very tall, clouds always stood over and the rain was certain even if not constant. To make use of Forge Island, the same ships that went to land to bring weapons had to keep returning providing food.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;People on Forge Island became united on the task that brought them there. A Forge is a very unsuited place to be working straight, but since work was all that was there, and small tasks, like caring for the crops were not needed anymore, and discussing politics suddenly didn’t seem to matter. But they were very aware of their importance, and they felt like a big family.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;Forge Island was unfortunately very open, had a deep sea and with no rocks to protect it from ships that could some day reach it in the imminent war. The people on Forge Island, which was by then a village already, decided to send a small group of people, in two ships, to the nearest and most rocky island, to build a fortress and a lighting post there to warn and defend the people on Forge Island.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;This was a very risky thing to do because the nearest rocky island, that was so perfect to have a fort, was so good at it because it has very hard to successfully dock in. When the ships reached this island, was already night, and rain started to pour. The ships crashed near land, and started to sunken, people fled, swimming. Most survived. At the beach they gathered, with much enthusiasm for being alive. But that enthusiasm was soon to vanish.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;You see, right after this gathering, which was at night, they turned their heads. Still a little deafed by the accident they didn’t realized that the rain in the island they now were was a storm in the island they come. Forge Island, that was mostly a volcano, erupted, and the night turned red, with white flashes from the distant lightnings.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;That eruption lasted for days, we don’t know what happened after in the Unseeable Continent or if there were any survivors in Forge Island. What I do know is the people who survived the crash were too outnumbered to care, and with their knowledge and with what was salvaged from the ships they found this village. We do know we’ve made no contact with people outside this small island. And we did learn how to sharpen our remaining blades to defend from the monsters that inhabit this island with us.&lt;/i&gt;&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;We came to the island with the task of building a fort to defend Forge Island. It seemed to matter. We started to built it because it made we feel we had a purpose. We finished it to defend ourselves.&lt;br /&gt;&lt;br /&gt;-The book of memories, Chapter 2.&lt;/span&gt;</description><author>Erico Notes</author><pubDate>Tue, 03 Feb 2015 00:36:31 GMT</pubDate><guid isPermaLink="true">https://ericonotes.blogspot.com/2015/01/hello.html</guid></item><item><title>Of Mice and Men</title><link>https://apurva-shukla.me/bookshelf/of-mice-and-men/</link><description>⭐ ⭐ ⭐ ⭐ It was quite an interesting novella, it had a profound amount of detail in the lives of itinerant workers in the Great Depression…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Mon, 02 Feb 2015 11:43:56 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/of-mice-and-men/</guid></item><item><title>Breathe new life into an old PowerBook G4 using Linux</title><link>https://jasoneckert.github.io/myblog/breathe-new-life-into-an-old-powerbook-g4-with-linux/</link><description>&lt;p&gt;&lt;img alt="PowerBook G4" src="powerbookg4.png#center" title="PowerBook G4" /&gt;&lt;/p&gt;
&lt;p&gt;So what do you do when you have an old PowerBook that still works but can’t run the latest operating system (OS) and software? Well, you could sell it - but it won&amp;rsquo;t fetch much at all (less than $50 in most cases).&lt;/p&gt;
&lt;p&gt;A better option is to install a currently-supported OS that runs really well on limited hardware&amp;hellip;&amp;hellip;.in other words, install Linux on it!&lt;/p&gt;
&lt;p&gt;I recently installed the latest version of Debian Linux on my PowerBook G4 to make it useful again.  With only 1.25 GB of RAM and a 1.5 GHz PowerPC CPU, it could only run Mac OS 10.5 (very old), and nearly all Mac software programs, including Web browsers, have discontinued support for PowerPC-based Macs.  In other words, you won’t get new versions of software if you have an old PowerPC-based Mac running Mac OS 10.5&amp;hellip;.&lt;/p&gt;</description><author>Jason Eckert's Website and Blog</author><pubDate>Mon, 02 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://jasoneckert.github.io/myblog/breathe-new-life-into-an-old-powerbook-g4-with-linux/</guid></item><item><title>The End Games</title><link>https://apurva-shukla.me/bookshelf/the-end-games/</link><description>⭐ ⭐ ⭐ ⭐ I must say this book exceeded my expectations. I only read it because I found it at this bookstore at a place I was visiting, and it…</description><author>Apurva Shukla's RSS Feed</author><pubDate>Sun, 01 Feb 2015 07:46:39 GMT</pubDate><guid isPermaLink="true">https://apurva-shukla.me/bookshelf/the-end-games/</guid></item><item><title>Envy by David Foster Wallace</title><link>https://ho.dges.online/words/commonplace/envy-by-david-foster-wallace/</link><description>&lt;blockquote&gt;
&lt;p&gt;You have been snared by the delusion that envy has a reciprocal&amp;hellip; you burn with hunger for food that does not exist.&lt;/p&gt;
&lt;/blockquote&gt;</description><author>ho.dges.online</author><pubDate>Sun, 01 Feb 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/envy-by-david-foster-wallace/</guid></item><item><title>exec(3) in Go</title><link>https://caiustheory.com/exec-3-in-go/</link><description>&lt;p&gt;Using &lt;a href="http://man7.org/linux/man-pages/man3/exec.3.html"&gt;exec(3)&lt;/a&gt; from Go is simple enough, once you figure out to look in the &lt;a href="http://golang.org/pkg/syscall/"&gt;syscall&lt;/a&gt; package and how to pass arguments to the new command.&lt;/p&gt;
&lt;p&gt;As a simple example, I&amp;rsquo;m going to exec &lt;code&gt;/bin/echo&lt;/code&gt; with a hardcoded string from the go binary. &lt;em&gt;The program built here is in the &lt;a href="https://github.com/caius/gecho"&gt;gecho&lt;/a&gt; (Gecko, geddit?) git repo, which each stage as a commit.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In our main function lets setup some variables we&amp;rsquo;re going to need for arguments to &lt;code&gt;syscall.Exec&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;cmdPath&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"/bin/echo"&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;cmdArgs&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"World"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;cmdEnv&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;(We could use &lt;code&gt;os.Environ()&lt;/code&gt; for &lt;code&gt;cmdEnv&lt;/code&gt; to take the ENV from the go binary, but we don&amp;rsquo;t require anything from the environmnt here so it doesn&amp;rsquo;t matter that we aren&amp;rsquo;t.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now we have the arguments for &lt;code&gt;syscall.Exec&lt;/code&gt;, lets add that in and see what happens:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cmdPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cmdArgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cmdEnv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And running the file (&lt;code&gt;go run gecho.go&lt;/code&gt; compiles &amp;amp; runs for us) gives the following output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;World
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Err, say what now? Where&amp;rsquo;s &amp;ldquo;Hello&amp;rdquo; gone?!&lt;/p&gt;
&lt;p&gt;Took me a while to figure this out when I originally ran into this. The answer is staring us right in the face if we go look at the &lt;a href="http://golang.org/pkg/syscall/#Exec"&gt;syscall.Exec docs&lt;/a&gt;. Lets have a look at the function signature, argument names and all:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;Exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;argv0&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;argv&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;envv&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hmm. The first argument is &lt;code&gt;argv0&lt;/code&gt; (and a string), rather than &lt;code&gt;binaryPath&lt;/code&gt; or something similar. The second argument is then &lt;code&gt;argv&lt;/code&gt; and an array of strings.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;At this point I remember that the first element of &lt;code&gt;argv&lt;/code&gt; in other runtimes is the name of the binary or command invoked - &lt;code&gt;$0&lt;/code&gt; in a bash script is the name of the script for example.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The answer is simple. &lt;code&gt;cmdArgs&lt;/code&gt; in our script should have &lt;code&gt;/bin/echo&lt;/code&gt; as the first element, and then we pass &lt;code&gt;cmdArgs[0], cmdArgs&lt;/code&gt; as the first two arguments to &lt;code&gt;syscall.Exec&lt;/code&gt;. Lets give that a go:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;cmdArgs&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"/bin/echo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"World"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;cmdEnv&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cmdArgs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;cmdArgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cmdEnv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And running it (&lt;code&gt;go run gecho.go&lt;/code&gt; remember) gives the expected output:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Hello World
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Excellent. Now I just need to remember &lt;code&gt;argv&lt;/code&gt; contains the command name as &lt;code&gt;argv[0]&lt;/code&gt; and we&amp;rsquo;re golden.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;There is also the &lt;a href="http://golang.org/pkg/os/exec/"&gt;os/exec&lt;/a&gt; package in the stdlib, which is intended for executing other binaries as child processes from what I can tell. Tellingly, when you create a &lt;code&gt;exec.Cmd&lt;/code&gt; struct with &lt;code&gt;exec.Command()&lt;/code&gt; you give it the name as first argument, and args as following arguments. Then it has the following snippet in the documentation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The returned Cmd&amp;rsquo;s Args field is constructed from the command name followed by the elements of arg, so arg should not include the command name itself. For example, &lt;code&gt;Command(&amp;quot;echo&amp;quot;, &amp;quot;hello&amp;quot;)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So &lt;code&gt;cmd := exec.Command(&amp;quot;echo&amp;quot;, &amp;quot;hello&amp;quot;); cmd.Args&lt;/code&gt; would return &lt;code&gt;[]string{&amp;quot;echo&amp;quot;, &amp;quot;hello&amp;quot;}&lt;/code&gt; - which is recognisable as what we have to pass to &lt;code&gt;syscall.Exec&lt;/code&gt;!&lt;/p&gt;</description><author>Caius Theory</author><pubDate>Sat, 31 Jan 2015 11:37:37 GMT</pubDate><guid isPermaLink="true">https://caiustheory.com/exec-3-in-go/</guid></item><item><title>Rebound Project</title><link>https://boyter.org/2015/01/rebound-project/</link><description>&lt;p&gt;As I mentioned in the previous entry I had started work on a new project I called portfold. Built and released without fanfare I have quietly killed it before even the month is out. Why? I realise now that it was a rebound project similar to a rebound relationship. I had been getting a little down on searchcode.com and wanted to branch out to some new technology. Once done though the itch was scratched and now I am back to working on searchcode again.&lt;/p&gt;</description><author>Ben E. C. Boyter</author><pubDate>Sat, 31 Jan 2015 00:49:55 GMT</pubDate><guid isPermaLink="true">https://boyter.org/2015/01/rebound-project/</guid></item><item><title>Screenshot Saturday 209</title><link>https://etodd.io/2015/01/30/screenshot-saturday-209/</link><description>&lt;p&gt;This week was crazy productive. I finished last week's level, finished another level, which looks like this:&lt;/p&gt;
&lt;a href="https://etodd.io/assets/9xCowOA.jpg"&gt;&lt;img src="https://etodd.io/assets/9xCowOAl.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;...which also included some story-related writing and scripting, and actually started working on NEXT week's level, which looks like this:&lt;/p&gt;
&lt;a href="https://etodd.io/assets/mPXRXev.jpg"&gt;&lt;img src="https://etodd.io/assets/mPXRXevl.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;I seem to be on a purple streak lately. Actually, purple may rise unintentionally to be the most prominent color in the game. Also, this last level is apparently a subconscious ode to Monument Valley.&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 30 Jan 2015 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/01/30/screenshot-saturday-209/</guid></item><item><title>True Story</title><link>https://olshansky.info/movie/true_story/</link><description>Olshansky's review of True Story</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 30 Jan 2015 16:46:00 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/true_story/</guid></item><item><title>Whiplash</title><link>https://olshansky.info/movie/whiplash/</link><description>Olshansky's review of Whiplash</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 30 Jan 2015 16:45:51 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/whiplash/</guid></item><item><title>Consistent Normal Interpolation</title><link>https://blog.yiningkarlli.com/2015/01/consistent-normal-interpolation.html</link><description>&lt;p&gt;I recently ran into a problem with interpolated normals. Instead of supporting sphere primitives directly, Takua Rev 5 generates polygon mesh spheres and handles them the same way as any other polygon mesh is handled. However, when I ran a test using a glass sphere, a lot of fireflies appeared:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Jan/badnormals.0.png"&gt;&lt;img alt="Polygon mesh sphere with heavy firefly artifacts." src="https://blog.yiningkarlli.com/content/images/2015/Jan/badnormals.0.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The fireflies are an artifact arising from how normal interpolation interacts with specular materials. Since the sphere is a polygonal mesh, normal interpolation is required to give the sphere a smooth appearance instead of a faceted one. The interpolation scheme I was using vanilla Phong normal interpolation: store a smoothed normal at each vertex, and then calculate the smooth shading normal at each point as the barycentric-coordinate-weighted sum of the smooth normals at each vertex of the current triangle. This works well for most cases, but a problem arises at grazing angles: since the smooth shading normal corresponds not to the actual geometry but to a “virtual” smoothed version of the geometry, sometimes outgoing specular rays will end up going below the tangent plane of the current hit point. Because of this, rays hitting a glass sphere with Phone normal interpolation at a grazing angle can sometimes go the wrong way, hence the artifacts in the above image.&lt;/p&gt;

&lt;p&gt;Of course, the closer the actual geometry lines up to the virtual smoothed geometry, the less this grazing angle problem occurs. However, in order to completely eliminate artifacting, the polygon geometry needs to approach the limit of the virtual smoothed geometry. In this render, I regenerated the sphere with two more levels of subdivision. As a result, there are fewer fireflies, but fireflies are still present:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Jan/badnormals.1.png"&gt;&lt;img alt="More heavily subdivided polygon mesh sphere. Fewer but still present firefly artifacts." src="https://blog.yiningkarlli.com/content/images/2015/Jan/badnormals.1.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Initially I thought about just getting rid of the fireflies by checking pixel intensities and clamping intensities that were significantly brighter than their immediate neighbors, which is a fairly basic/standard firefly reduction strategy. However, since in this case the fireflies occur mostly at grazing angles and therefore on silhouettes, intensity clamping can lead to some unpleasant aliasing on silhouettes.&lt;/p&gt;

&lt;p&gt;Fortunately, there was a paper by Alexander Reshetov, Alexei Soupikov, and William R. Mark at SIGGRAPH Asia 2010 about dealing with this exact problem. The paper, &lt;a href="http://dl.acm.org/citation.cfm?id=1866168"&gt;“Consistent Normal Interpolation”&lt;/a&gt;, presents a simple method for tweaking Phong normal interpolation to guarantee that reflected rays never go below the tangent plane. The method is based on incoming ray direction and the angle between the smooth interpolated normal and true face normal. The actual method presented in the paper is very straightforward to implement, but the derivation of the algorithm is fairly interesting and involves solving a nontrivial optimization problem to find a scaling term.&lt;/p&gt;

&lt;p&gt;I implemented a slightly modified version of the algorithm presented on page 5 of the paper. The modification I made is simply to account for rays hitting polygons from below the tangent plane, as in the case of internal refraction. Now interpolated normals at grazing angles no longer produce firefly artifacts:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.yiningkarlli.com/content/images/2015/Jan/consistentnormals.png"&gt;&lt;img alt="Polygon sphere with consistent normal interpolation. Note the lack of firefly artifacts." src="https://blog.yiningkarlli.com/content/images/2015/Jan/consistentnormals.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m working on writing up a lot of stuff, so more soon! Stay tuned!&lt;/p&gt;</description><author>Code &amp;amp; Visuals</author><pubDate>Fri, 30 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.yiningkarlli.com/2015/01/consistent-normal-interpolation.html</guid></item><item><title>Distributed search for Beal's Conjecture counterexamples</title><link>https://makedist.com/posts/2015/01/30/distributed-search-for-beals-conjecture-counterexamples/</link><description>Speeding up a brute force search in an enormous state space.</description><author>Noah Watkins</author><pubDate>Fri, 30 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2015/01/30/distributed-search-for-beals-conjecture-counterexamples/</guid></item><item><title>Download a Git subdirectory from GitHub</title><link>https://www.seanw.org/blog/download-git-repo-subdirectory/</link><description>Have you ever needed to download only a subdirectory from a GitHub project without downloading the entire repository? Surprisingly, there doesn&amp;rsquo;t seem to be a way of doing this easily using Git. A somewhat unexpected solution is to use SVN.
First get the URL of the subfolder. GitHub URLs have the form:
https://github.com/author/repo-name/tree/master/subdirectory Then replace /tree/master/ with /trunk/ to get:
https://github.com/author/repo/trunk/subdirectory You can now download the subdirectory you&amp;rsquo;re interested in using SVN&amp;rsquo;s export command:</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Fri, 30 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/download-git-repo-subdirectory/</guid></item><item><title>Pretty and Broken trumps Ugly and Working</title><link>https://blog.samuellevy.com/post/50-pretty-and-broken-trumps-ugly-and-working.html</link><description>&lt;p&gt;There, I've said it. Programming is a beauty contest, and if your software ain't pretty, it will lose out to something with half the function. This is a really difficult thing to admit as I'm not a designer, but the user interface is more important than the functionality.&lt;/p&gt;&lt;p&gt;Of course this isn't &lt;em&gt;always&lt;/em&gt; true - quite often banks and other large businesses use software that was written 20 years ago (and still looks the part), but for the majority of businesses (especially in the web sector), it's just a home truth that design is more important. &lt;/p&gt;&lt;p&gt;So let's explore why.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Trust&lt;/strong&gt;&lt;br /&gt;Reason number one why the UI …&lt;/p&gt;</description><author>Sam says you should read this</author><pubDate>Wed, 28 Jan 2015 15:39:25 GMT</pubDate><guid isPermaLink="true">https://blog.samuellevy.com/post/50-pretty-and-broken-trumps-ugly-and-working.html</guid></item><item><title>Are you a fighter pilot?</title><link>https://captnemo.in/blog/2015/01/28/are-you-a-fighter-pilot/</link><description>&lt;p&gt;As part of a pre job interview for a position as a security consultant, I was asked this question. The interviewer expanded the question further as :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Given the choice between a luxurious journey in a passenger jetliner (flying business class) and a thrilling trip as a fighter pilot, which one would you choose?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My immediate reply was (without a single doubt): “I’ll take the fighter jet, thanks.”&lt;/p&gt;

&lt;p&gt;Then the interviewer tried to dissuade me from my choice: “Its not as glamorous as it sounds. Its a terrible job flying a jet plane. There are lots of complications, you are literally defying death, and even the pay isn’t that good.”. He then spent quite some time explaining the luxuries and comforts that we take for granted in a passenger jet, and those that aren’t available in a fighter jet. “You can’t even piss properly”, he told me. “And there’s free booze on the Boeing.”&lt;/p&gt;

&lt;p&gt;Me (after some deliberation and moment of self-doubt): I’d ultimately like to have my own private jet, but I’m willing to strap myself to a 300 million dollar plane just trying to get there. I’d take that over a passenger jet any day.&lt;/p&gt;

&lt;p&gt;For those who didn’t get the analogy: He was trying to convince me to join a high risk job, where I’d be working late nights doing what I love. But it also means giving up tons of luxuries and comforts that I could get at other companies.&lt;/p&gt;

&lt;p&gt;I’m sure that I’m the fighter jet kind of person, I’m just having difficulty deciding what jet I wanna fly. If you have an opening for a Full Stack Developer/Security Consultant, shoot me a mail.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Wed, 28 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/01/28/are-you-a-fighter-pilot/</guid></item><item><title>Fix: WPML for WordPress causes theme to show multiple languages at the same time</title><link>https://www.seanw.org/blog/themes-and-widgets-showing-multiple-languages-wpml/</link><description>The WordPress Multilingual (WPML) plugin offers a comprehensive solution for transitioning from a single language WordPress website to one that supports multiple languages. Once installed, you can add several translations of individual posts and custom posts from within the WordPress admin interface. When viewing a page for a specific language on your site, page content is then generated by pulling in posts for the current language.
Problem: Theme and widgets showing multiple languages Many themes and plugins will work out of the box with WPML but a common problem is themes and plugins will display content for all languages instead of only the current one.</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Tue, 27 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/themes-and-widgets-showing-multiple-languages-wpml/</guid></item><item><title>Bépo-android</title><link>https://anisse.astier.eu/bepo-android.html</link><description>&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=fr.bepo.clavierexterne"&gt;This&lt;/a&gt; is a small project I recently &lt;a href="https://github.com/anisse/bepo-android/"&gt;released on github&lt;/a&gt; and &lt;a href="https://play.google.com/store/apps/details?id=fr.bepo.clavierexterne"&gt;Google Play&lt;/a&gt;. It aims at catering to the needs of people using the bépo layout, and wanting to use it for &lt;a href="http://bepo.fr/wiki/BepoAndroid"&gt;physical keyboards on Android&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bepo.fr"&gt;Bépo&lt;/a&gt; is a french dvorak-like keyboard layout; it was designed by a community of …&lt;/p&gt;</description><author>Linux Engineer's random thoughts</author><pubDate>Tue, 27 Jan 2015 01:00:00 GMT</pubDate><guid isPermaLink="true">https://anisse.astier.eu/bepo-android.html</guid></item><item><title>Little brother, a script for analysing who accesses your website</title><link>https://bastian.rieck.me/blog/2015/little_brother_website_analysis/</link><description>&lt;p&gt;The German &lt;a href="http://www.uberwach.de"&gt;Überwach project&lt;/a&gt; aims at logging the access of certain
governmental institutions, such as the German intelligence service. In an attempt to answer the
question &lt;em&gt;Quis custodiet ipsos custodes?&lt;/em&gt; with &lt;em&gt;Me, of course&lt;/em&gt;, I desired to roll out a log file
analysis tool—I wanted to find out if there are any computers of interested that access my
web server. Starting with &lt;a href="http://en.wikipedia.org/wiki/Wikipedia:Blocking_IP_addresses#Sensitive_IP_addresses"&gt;Wikipedia&amp;rsquo;s list of sensitive IP
addresses&lt;/a&gt;, I
quickly obtained a nice collection of candidates. The result is &lt;a href="http://github.com/Pseudomanifold/LittleBrother"&gt;Little
Brother&lt;/a&gt;, a small Python script for checking if an Apache log
file contains IP addresses from a predefined list of networks.&lt;/p&gt;
&lt;h1 id="usage"&gt;Usage&lt;/h1&gt;
&lt;p&gt;The data format is straightforward: Each non-empty line shall contain an IPv4 address or an IPv4
network specification and a description. These two fields shall be separated by at least one
whitespace character. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;156.33.0.0/16       United States Senate
138.162.0.0/16      United States Department of the Navy and United States Marine Corps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The script is able to scan an Apache log file, or any log file that &lt;em&gt;starts&lt;/em&gt; with a valid IPv4
address. The following lines will be parsed correctly, for example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;192.0.2.0.42 - - [01/Jan/2015:04:04:04 +0200] &amp;quot;GET / HTTP/1.1&amp;quot; 200 3834347 &amp;quot;-&amp;quot; &amp;quot;Foo&amp;quot;
192.0.2.0.23 - - [01/Jan/2015:05:05:05 +0200] &amp;quot;GET / HTTP/1.1&amp;quot; 200 3834347 &amp;quot;-&amp;quot; &amp;quot;Bar&amp;quot;
192.0.2.0.5  Random information that is going to be ignored anway 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A full analysis session works like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./lb.py test.log IP_networks.txt
Counted 1 visits from 192.0.2.0.1 (TEST-NET-1)
Counted 2 visits from 198.51.100.2 (TEST-NET-2)
Counted 3 visits from 203.0.113.3 (TEST-NET-3)
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="real-example"&gt;Real example&lt;/h1&gt;
&lt;p&gt;As it turns out, there are indeed some interesting IP addresses in the server logs for my personal
website. Here is an excerpt of some real data from the last month:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Counted 17 visits from 131.136.242.1 (Canadian Department of National Defence)
Counted 11 visits from 138.162.0.41 (United States Department of the Navy and United States Marine Corps)
Counted 13 visits from 216.81.81.84 (United States Department of Homeland Security)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Apparently, I have some sort of following in the military and the DHS. I feel strangely honoured and
promise that I will remain as &lt;a href="http://www.urbandictionary.com/define.php?term=moto"&gt;&lt;em&gt;moto&lt;/em&gt;&lt;/a&gt; as
possible.&lt;/p&gt;
&lt;h1 id="code"&gt;Code&lt;/h1&gt;
&lt;p&gt;The code is released under the &lt;a href="https://en.wikipedia.org/wiki/MIT_License"&gt;&amp;ldquo;MIT Licence&amp;rdquo;&lt;/a&gt;. You may download
&lt;em&gt;Little Brother&lt;/em&gt; &lt;a href="http://github.com/Pseudomanifold/LittleBrother"&gt;from its git repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Seeing that the &lt;a href="https://en.wikipedia.org/wiki/United_States_Marine_Corps"&gt;&amp;ldquo;USMC&amp;rdquo;&lt;/a&gt; is indeed visiting my website,
I feel that there is only one way to end the post:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://terminallance.com"&gt;&lt;em&gt;Oorah!&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sun, 25 Jan 2015 19:24:07 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/little_brother_website_analysis/</guid></item><item><title>Creating heat maps of git commits</title><link>https://bastian.rieck.me/blog/2015/heat_maps_git/</link><description>&lt;p&gt;As a parting graduation gift, friends and I recently decided that we wanted to create a &lt;a href="https://en.wikipedia.org/wiki/Heat_map"&gt;&amp;ldquo;heat map&amp;rdquo;&lt;/a&gt; of the git commits of one of our mutual friends. Since this was a rather
fun hack, I decided to share the script I wrote for this purpose (thanks to Jan for providing the
initial script which kicked this off):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;argparse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Create heatmaps of git commits"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"--author"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Author whose git commits are to be counted"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"directory"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git directory to use"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metavar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"DIR"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;arguments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;".git"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;author&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;commits&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"--git-dir=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                                             &lt;span class="s2"&gt;"log"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                                             &lt;span class="s2"&gt;"--pretty=format:&lt;/span&gt;&lt;span class="si"&gt;%c&lt;/span&gt;&lt;span class="s2"&gt;t"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;                                             &lt;span class="s2"&gt;"--author=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;commit&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;commits&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;d&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromtimestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'set size ratio 7.0/24.0&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s1"&gt;'set xrange [-0.5:23.5]&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s1"&gt;'set yrange [-0.5: 6.5]&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s1"&gt;'set xtics 0,1&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s1"&gt;'set ytics 0,1&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s1"&gt;'set xtics offset -0.5,0.0&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s1"&gt;'set tics scale 0,0.001&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s1"&gt;'set mxtics 2&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s1"&gt;'set mytics 2&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s1"&gt;'set grid front mxtics mytics linetype -1 linecolor rgb &lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s1"&gt;black&lt;/span&gt;&lt;span class="se"&gt;\'\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;      &lt;span class="s1"&gt;'plot "-" matrix with image notitle'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; "&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"e"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note that the numerical values on the y-axis of the heat map refer to the weekdays. I have not
provided a mapping to their names. The x-axis refers to the hour in which a commit was made.&lt;/p&gt;
&lt;p&gt;The usage is very simple: Point the script towards a directory that contains a git repository, use
the optional &lt;code&gt;--author&lt;/code&gt; parameter to filter commits, and pipe the output into a file. The script
will generate code for further processing with &lt;a href="http://gnuplot.info"&gt;gnuplot&lt;/a&gt;. A basic session might
look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./git-heatmap.py ~/Projects/Skynet &amp;gt; skynet.dat
$ gnuplot
gnuplot &amp;gt; set terminal png
gnuplot &amp;gt; set output &amp;quot;skynet.png&amp;quot;
gnuplot &amp;gt; load &amp;quot;skynet.dat&amp;quot;
gnuplot &amp;gt; set output
$ # Post skynet.png on all the media to get spared when the
$ # inevitable robot uprising starts...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For further customizations, I recommend &lt;a href="https://github.com/aschn/gnuplot-colorbrewer"&gt;Anna Schneider&amp;rsquo;s ColorBrewer colour palette for
gnuplot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a heat map of the commits for &lt;a href="http://scifer.info"&gt;Scifer&lt;/a&gt;, our research group&amp;rsquo;s visualization
framework:&lt;/p&gt;
&lt;figure&gt;&lt;a href="https://bastian.rieck.me/images/scifer_commit_heat_map.png"&gt;&lt;img alt="You can see that people check in stuff at all hours. The largest amount of commits still happens during regular business hours, though. Note that the scale is logarithmic to ensure that the few commits during irregular hours are not overshadowed." src="https://bastian.rieck.me/images/scifer_commit_heat_map.png" width="600" /&gt;&lt;/a&gt;&lt;figcaption&gt;
			&lt;p&gt;You can see that people check in stuff at all hours. The largest amount of commits still happens during regular business hours, though. Note that the scale is logarithmic to ensure that the few commits during irregular hours are not overshadowed.&lt;/p&gt;
		&lt;/figcaption&gt;
&lt;/figure&gt;</description><author>Ecce Homology on Bastian Grossenbacher Rieck's personal homepage</author><pubDate>Sat, 24 Jan 2015 21:28:33 GMT</pubDate><guid isPermaLink="true">https://bastian.rieck.me/blog/2015/heat_maps_git/</guid></item><item><title>Track Concatenator</title><link>https://www.davidschlachter.com/misc/trackconcat</link><description>Join together iTunes tracks. Uses ffmpeg, mp4v2, and others to interact with iTunes using AppleScript.</description><author>David Schlachter</author><pubDate>Sat, 24 Jan 2015 19:00:00 GMT</pubDate><guid isPermaLink="true">https://www.davidschlachter.com/misc/trackconcat</guid></item><item><title>The Perfect Pot</title><link>https://daniellittle.dev/the-perfect-pot</link><description>Whether it's building software, a business, or some other project, chances are you'll almost never get it right the first time. Years ago, I…</description><author>Daniel Little Dev</author><pubDate>Sat, 24 Jan 2015 08:25:49 GMT</pubDate><guid isPermaLink="true">https://daniellittle.dev/the-perfect-pot</guid></item><item><title>Screenshot Saturday 208</title><link>https://etodd.io/2015/01/23/screenshot-saturday-208/</link><description>&lt;p&gt;This week's level is not quite done yet, but I have an excuse! Power was out at the incubator for two days, and the internet didn't come up fully until just yesterday.&lt;/p&gt;
&lt;p&gt;Still, the level should be done some time this weekend and is already looking pretty good.&lt;/p&gt;
&lt;a href="https://etodd.io/assets/a1orQJ0.jpg"&gt;&lt;img src="https://etodd.io/assets/a1orQJ0l.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;I finalized the promotional graphics and &lt;a href="http://store.steampowered.com/app/300340"&gt;published the game to Steam in "coming soon" mode&lt;/a&gt;. I'm incredibly grateful to &lt;a href="http://samgebhardt.com"&gt;Sam Gebhardt&lt;/a&gt; for contributing his Hollywood artistic talent!&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 23 Jan 2015 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/01/23/screenshot-saturday-208/</guid></item><item><title>It's not so bad. We have snail babies, after all</title><link>https://liza.io/its-not-so-bad.-we-have-snail-babies-after-all/</link><description>&lt;p&gt;Sometimes I think about what I&amp;rsquo;ve been working on in my spare time since the beginning of last year and I&amp;rsquo;m like &amp;ldquo;What the crap, Liza. You&amp;rsquo;re spending your time trying to make toy slugs. Go learn a useful skill or something.&amp;rdquo;&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Fri, 23 Jan 2015 20:19:40 GMT</pubDate><guid isPermaLink="true">https://liza.io/its-not-so-bad.-we-have-snail-babies-after-all/</guid></item><item><title>Remove an application from the cmd-tab switcher on macOS</title><link>https://cmetcalfe.ca/blog/remove-app-from-cmd-tab-switcher.html</link><description>&lt;p&gt;At work, I use &lt;a href="http://iterm2.com"&gt;iTerm2&lt;/a&gt; as my main terminal emulator. For quick access, I have
it configured to drop down from the top of the screen when &lt;code&gt;F12&lt;/code&gt; is pressed.&lt;/p&gt;
&lt;p&gt;Unfortunately, it also shows up in the application switcher, bumping up into
the 'last used' position whenever it's activated and getting in the way. Since
I already have access to the terminal via &lt;code&gt;F12&lt;/code&gt;, there's no need for it to be
shown in the application switcher as well.&lt;/p&gt;
&lt;p&gt;Changing how an application behaves can be done by editing its &lt;code&gt;Info.plist&lt;/code&gt;
file. The key &lt;code&gt;LSUIElement&lt;/code&gt; (&lt;a href="https://developer.apple.com/library/mac/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/20001431-108256"&gt;according to the Apple documentation&lt;/a&gt;)
"Specifies whether the app is an agent app, that is, an app that should not
appear in the Dock or Force Quit window."&lt;/p&gt;
&lt;p&gt;To set this key, open the application's &lt;code&gt;Info.plist&lt;/code&gt; at
&lt;code&gt;/Applications/[application name].app/Contents/Info.plist&lt;/code&gt; and add
&lt;code&gt;&amp;lt;key&amp;gt;LSUIElement&amp;lt;/key&amp;gt;&amp;lt;true/&amp;gt;&lt;/code&gt; after the first &lt;code&gt;&amp;lt;dict&amp;gt;&lt;/code&gt; tag. The result should
look something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;
&lt;span class="normal"&gt;3&lt;/span&gt;
&lt;span class="normal"&gt;4&lt;/span&gt;
&lt;span class="normal"&gt;5&lt;/span&gt;
&lt;span class="normal"&gt;6&lt;/span&gt;
&lt;span class="normal"&gt;7&lt;/span&gt;
&lt;span class="normal"&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;plist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
&lt;span class="hll"&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;LSUIElement&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&amp;lt;true/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;&amp;lt;!-- The rest of the plist data --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Once the &lt;code&gt;LSUIElement&lt;/code&gt; key is set to &lt;code&gt;true&lt;/code&gt;, relaunch the application to see the
changes.&lt;/p&gt;
&lt;p&gt;Be warned that not only does this remove the application from the
application switcher, it also removes it from the dock and stops it from showing
the menu bar on the top of the screen.&lt;/p&gt;</description><author>Carey Metcalfe</author><pubDate>Fri, 23 Jan 2015 06:30:00 GMT</pubDate><guid isPermaLink="true">https://cmetcalfe.ca/blog/remove-app-from-cmd-tab-switcher.html</guid></item><item><title>Achilles</title><link>https://etodd.io/2015/01/22/achilles/</link><description>&lt;p&gt;
	This past weekend I participated in the &lt;a href="http://civichacks.org"&gt;CivicHacks&lt;/a&gt; "Game Jam for Good".
	The goal was to raise awareness of the global water crisis and ultimately promote
	&lt;a href="http://www.packh2o.com/"&gt;PackH2O&lt;/a&gt;, a Columbus-based startup that designs water backpacks
	for developing water-stressed regions.
&lt;/p&gt;
&lt;p&gt;The jam lasted 48 hours. My entry is called "Achilles".&lt;/p&gt;
&lt;a href="https://etodd.io/assets/3XsRRVV.png"&gt;&lt;img src="https://etodd.io/assets/3XsRRVV.png" /&gt;&lt;/a&gt;
&lt;p&gt;
	Achilles is a multiplayer text-based simulation. You the player must manage a village in a
	third-world country experiencing a water crisis. You can play it here
	(&lt;a href="http://bit.ly/waterjamachilles"&gt;bit.ly/waterjamachilles&lt;/a&gt;) assuming I haven't stopped
	paying for the cloud server.
&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Thu, 22 Jan 2015 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/01/22/achilles/</guid></item><item><title>Anvil: the story of automatic rendering</title><link>https://zserge.com/posts/anvil-1/</link><description>Reading my previous blog post some people asking why I&amp;rsquo;m so strongly against XMLs if they are really good? I think I shall clarify that I&amp;rsquo;m not against XMLs per se, I&amp;rsquo;m against the way many developers organize their apps. Let&amp;rsquo;s look at a simple example - a button and a textview showing how many times the button was pressed.
Here&amp;rsquo;s a typical implementation in Java+XML:
&amp;lt;LinearLayout ....&amp;gt; &amp;lt;TextView android:id=&amp;quot;@+id/text&amp;quot; .</description><author>zserge's blog</author><pubDate>Thu, 22 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/anvil-1/</guid></item><item><title>Make Big Bets</title><link>https://www.danstroot.com/posts/2015-01-22-make-big-bets</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/african_children.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;The Bill and Melinda Gates Foundation just released it's annual letter.  I have come to look forward to these letters because I find them incredibly inspiring. This year instead of an annual update they are re-baselining and taking a fifteen year view of the future. As I read this year's letter I was simultaneously moved, inspired and awed by the scope their mission.&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2015-01-22-make-big-bets"&gt;Make Big Bets&lt;/a&gt; first appeared on &lt;a href="https://www.danstroot.com"&gt;Dan Stroot's Blog&lt;/a&gt;</description><author>Dan Stroot</author><pubDate>Thu, 22 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2015-01-22-make-big-bets</guid></item><item><title>Hiding visits to your own site in Google Analytics</title><link>https://www.seanw.org/blog/hide-own-traffic-in-google-analytics/</link><description>When working on a site, it&amp;rsquo;s common to browse it yourself from multiple browsers, multiple devices and multiple locations for testing purposes. For analytics about your user behaviour to be useful, we need a way to exclude this internal traffic from Google Analytics reports. In this post I explain a method I found useful for hiding visits to your own site when you want to be able to test your site from any browser or any location.</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Thu, 22 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/hide-own-traffic-in-google-analytics/</guid></item><item><title>Why Microservices Matter</title><link>https://nicolaiarocci.com/microservices-matter/</link><description>&lt;p&gt;In spite of being a marketing spin and link bait, Heroku &lt;a href="https://blog.heroku.com/archives/2015/1/20/why_microservices_matter"&gt;article on microservices&lt;/a&gt; does a pretty good job at explaining why microservices matter and, at a very high level, what challenges they pose.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;However, microservices aren’t a silver bullet, and they won’t make a sluggish IT organization fast. While individual services become more robust and less complex, the overall system takes on the many challenges of distributed systems at the network level. Despite their challenges, they’re here to stay because they map better than anything else to the software landscape of the future: parallel development, platform-as-a-service deployment, and ubiquitous use.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 21 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/microservices-matter/</guid></item><item><title>FOMO is visibility bias</title><link>http://dimitarsimeonov.com/2015/01/21/fomo-is-visibility-bias</link><description>&lt;p&gt;Few days ago, I landed in Paris. My original flight was delayed, and I missed my connecting flight. The next flight was in 12 hours, so I had to figure out what to do in the mean time. I could stay at the airport during the whole day. But that would have been lame, I would have missed out on exploring Paris. I am lucky to not need visa for France, and I had no real excuse not to go out. Yet, several times I gave up on going out and several times I convinced myself again to un-give-up.&lt;/p&gt;

&lt;p&gt;First, I had to find the transfer desk. Paris’s airport Charles de Gaul isn’t optimized at all for the case of missing a connecting flight. I had to navigate to the a separate terminal that had transit desk not by following signs, but by following conflicting instructions from the various people I asked, who worked at the airport. Eventually, I found it and I got my new boarding pass, then I needed to find my bearings. I just found a comfy spot to try to get online and figure out if the weather outside is bad, what transportation options are there, etc. I kept hitting hurdles such as being confused about which ticket to buy, being confused about whether I’ll be able to see good stuff, being cautious about my luggage and documents, not having much euro exchanged due to bad rate, considering to stay inside and to work on a few personal errands, etc. These weren’t major hurdles, but they were giving me excuses not to go out in the city.&lt;/p&gt;

&lt;p&gt;On the other hand, for positive motivation, I didn’t have much of a specific reason to go out except “to explore Paris”, possibly seeing the Eiffel Tower and the Louvre and trying the French cuisine locally. These were remote possibilities, not very tangible a priori, so their fun-ness was underestimated by me. I knew that it would be fun to see the Eiffel tower, or climb its stairs, or stroll around the Louvre, but I there was a lot of uncertainty about how exactly would it feel.  I imagine this is similar to the “unknown unknowns” problem where we don’t know some of the things that we don’t know. We don’t know what we would have been missing out until we don’t miss it.&lt;/p&gt;

&lt;p&gt;There I was, in Paris’s airport, wondering whether to go out or not. That was the question.&lt;/p&gt;

&lt;p&gt;Every day, I tell myself to enhance my positive expectations and to bound the negative consequences. To be anti-fragile, and take advantage of new opportunities, seeking positive surprise. It is great when I have a positive surprise, but if I avoid taking decisions that are exposing me to the chance of a positive surprise, then I am way less likely to encounter such serendipities. Going into an unknown place, or trying a new game or a new challenge is always at least a little bit scary because I don’t really know how it would feel. This is especially true when I am doing something completely new, where the goal is to have a new feeling. Beforehand, I have nothing to compare the feeling to, so I will most certainly be completely wrong in my estimate of how I would feel when doing it. I wouldn’t know if it is just “meh” or if it is truly life-chantingly amazing. So if I am too conservative in my expectations, I might decide to miss out on an experience that can be life changing.&lt;/p&gt;

&lt;p&gt;While there are a lot of things that slowly and gradually improve life, I firmly believe that there are experiences, knowledges skills and mindset that are way out on positive side. Having such outstanding experience, or skill would improve the life in qualitatively new way by a lot. For example, just to illustrate these life-changing skills, lets consider learning a new language. Learning a new language might allow you to immerse yourself into a completely new country and environment, with different culture and outlook to life. The positive implications of it are too large to accurately know and estimate beforehand. While learning a new language can often significantly affect one’s life in a very positive matter, and there is not much risk in learning a language, the question of &lt;em&gt;which&lt;/em&gt; language to learn is more complicated as learning the different languages would expose that person to different culture and would affect the life differently. For example, if I French I might also learn a lot about art, or cuisine or whatever the French culture is, but if I learn Japanese, I might learn about attention to detail, about being respectful and strong, about raw fish and whatever else the Japanese culture brings.&lt;/p&gt;

&lt;p&gt;Which one is better? I believe neither one is better in the abstract, yet each of them is better depending on the person. Figuring out which of these to explore is a very personal question.&lt;/p&gt;

&lt;p&gt;So, assuming that there are many amazing things to do, see, or experience in life, how do I decide what to miss out and what not to miss out? Coming back to the Paris airport example, I had a few options. Going out to explore Paris is an obvious option, yet there are other options that aren’t obvious and require me to ask myself “Why don’t I do X?” Some other interesting options would be to read a book for most of the day, or to learn something about programming, or to prepare for my upcoming vacation by researching the things I could do, or to use the 12 hours to catch up on administrative errands thus freeing time in the future, to spend the time online talking to friends and reconnecting.&lt;/p&gt;

&lt;p&gt;I didn’t ask myself about all of these options. I got so distracted by the idea that exploring Paris is an “exploding offer” that I mostly thought whether to do it or not. I evaluated it in the absolute sense and not in the relative. I took my decision to go out by deciding that overall, it is nice and fun to go out and explore. I didn’t really fully ask myself - is this the best I could do with my time. I bet there are other options that would have been even better. For example, I could have tried to book a sightseeing tour - this could have given me a larger coverage of the city, and I could have learned more. I could have spent more time asking my good friends who had lived in Paris about recommendations and or connections - I didn’t think of that.&lt;/p&gt;

&lt;p&gt;I didn’t optimize for getting the most out my time in Paris. Instead, I wanted to go wandering, and it seemed like a nice thing to do, so I roamed the streets of Paris for a few hours. I followed the path of least resistance that day when I was deciding which street in Paris to walk, but also when deciding what to do that day. I don’t regret it because I think it is often necessary to just relax and do whatever I feel like in the moment. But I also think that if occasionally I ideate better about what options I have and ask myself “Why don’t I do X? Or Y? Or Z?” I would make my life much more interesting, because I would have a higher chance of stumbling on a serendipitous life-changing experiences.&lt;/p&gt;

&lt;p&gt;Taking decisions solely based on FOMO, the fear of missing out, is how we get stuck in a situation, profession, relationship or obligation that isn’t the best for us. We think that if we don’t strive for this promotion, or don’t develop our hobby or don’t go snowboarding &lt;em&gt;this weekend&lt;/em&gt; we will be missing out on something fun. And we are correct. We will be missing out on something fun, but just because this fun activity is made visible to us doesn’t mean we should prefer it. This is &lt;em&gt;visibility bias&lt;/em&gt;, that given everything else equal about two alternatives, we tend to prefer the one we have seen more often.&lt;/p&gt;

&lt;p&gt;FOMO is just visibility bias. Suppose we are given an option, asking us if we want to do activity X, such as going out for a walk in Paris. This option could be given to us by somebody else such as marketer or campaigner trying to promote X as the best option, but could also be given to us by our own brains, if it is the most obvious option. If I am climbing a staircase, the most obvious option for me is to climb the next step, and I do it even without thinking. But there are other options - see if there is an elevator, or maybe just decide to stay at the bottom or go to a different staircase, that goes down. Why do I have to climb the stupid staircase? I climbed a couple of steps and it felt good, so I just kept doing it, but is this really the place I want to reach, the top of this staircase? Maybe I should be climbing the staircase in a different building, or go to the escalator. Or even better, the elevator. Or maybe even better, I can get lifter by a balloon, or an airplane.&lt;/p&gt;

&lt;p&gt;If I have a fear of missing out on climbing onto the next step, then I have bullshit. I should really be thinking about how do I get in an airplane, not how do I push myself up with my muscles. Similarly, in the other aspects of life, I shouldn’t only think about what I have immediately in front of me and how to best achieve it. I should occasionally think about what is the best thing I could be doing. Keep asking myself “Why don’t I do X?”, “Why I do Y?”, “Why don’t I do Z?”.&lt;/p&gt;

&lt;p&gt;Really, I’m not asking myself enough, why ain’t I? Because it takes effort, and is often hard to remember. Even knowing how beneficial it is I still forget to ask myself “What else could I do?” I still don’t know how to solve this problem, but at least I am aware of it now.&lt;/p&gt;</description><author>D13V</author><pubDate>Wed, 21 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">http://dimitarsimeonov.com/2015/01/21/fomo-is-visibility-bias</guid></item><item><title>A Beautiful Inheritance</title><link>http://evantravers.com/articles/2015/01/21/a-beautiful-inheritance/</link><description>&lt;p&gt;&lt;img alt="sunset" src="https://images.evantravers.com/articles/2015/01/sunset.jpg" /&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;The Lord is my chosen portion and my cup; you hold my lot. The lines have
fallen for me in pleasant places; indeed, I have a beautiful inheritance.
(‭Psalm‬ ‭16‬:‭5-6‬ ESV)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thank you Lord for the joy I have felt over the past few weeks... Rarely have I
felt so energized and full of gratefulness as I have recently. Lord, in this
high water time of my life, protect me from idolatry. I don't want to come to
desire this feeling of fulfillment over you. I don't want to desire the
conduits of your joy, I long to long after you.&lt;/p&gt;
&lt;p&gt;Thank you for all the fine weather, wonderful friends, and golden opportunities
that you send. Thank you also for the gloomy days, strained conversations, and
bleak schedules that you use to shape me into the image of Jesus. I here and
now recognize and praise you for both, but I fear that as soon as my heart
seizes upon the good with jealous greed or the bad with bitter discontentment I
will have to repeat this prayer and surrender once more. Enable me to always
turn to you, in good or bad.&lt;/p&gt;
&lt;p&gt;You are my inheritance, my chosen portion. I am grateful, and content.  Help me
to rest in you, not because of your gifts, but because of the everlasting love
and faithfulness of the Giver. In Jesus' name, amen.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Wed, 21 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2015/01/21/a-beautiful-inheritance/</guid></item><item><title>submit-sitemap: Node.js module to submit sitemaps to search engines</title><link>https://www.seanw.org/blog/submit-sitemap-with-node-js/</link><description>I&amp;rsquo;ve just uploaded a small Node.js module for submitting/pinging sitemaps to search engines called submit-sitemap. This is meant to be used after you&amp;rsquo;ve made updates to your site to encourage crawlers to reindex your pages.
The module currently submits your sitemap to Google and Bing. This saves you from having to use Google&amp;rsquo;s webmaster tools and Bing&amp;rsquo;s webmaster tools to submit your sitemap manually.
For example, I&amp;rsquo;ve used this in the last stage of Gulp build scripts that generate and deploy static sites in the following way:</description><author>Sean Wilson, Web app designer &amp;amp; developer, Edinburgh, UK on Sean Wilson's homepage</author><pubDate>Wed, 21 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.seanw.org/blog/submit-sitemap-with-node-js/</guid></item><item><title>Things you should not read, Vol. 2</title><link>https://manuel.kiessling.net/2015/01/20/things-you-should-not-read-vol-2/</link><description>Please do not read this, this, this, this, and this.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Tue, 20 Jan 2015 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2015/01/20/things-you-should-not-read-vol-2/</guid></item><item><title>Curious case of Generics Specialization with Swift</title><link>https://whackylabs.com/swift/2015/01/20/curious-case-of-generics-specialization-with-swift/</link><description>&lt;p&gt;Today, I want to talk about a curious case I discovered while playing
with generic programming with Swift.&lt;/p&gt;

&lt;p&gt;To illustrate, let’s start by writing a simple function.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="kt"&gt;Min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Using Min&amp;lt;Int&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Using Min&amp;lt;Int&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And now let’s make it generic.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="kt"&gt;Min&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Comparable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Using Min&amp;lt;T&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Using Min&amp;lt;T&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What if we’ve both the implementations? The compiler automatically picks
the specialized version.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="kt"&gt;Min&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Comparable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Using Min&amp;lt;T&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="kt"&gt;Min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Using Min&amp;lt;Int&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Using Min&amp;lt;Int&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The swift standard library already provides a min and max functions.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Comparable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Suppose we use that as the generic version and override our specialized
one for Int? The compiler still picks the specialized one.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Using Min&amp;lt;Int&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Using min&amp;lt;Int&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is really convenient, isn’t it? Let’s expand our example to
something you might face in real life. Let’s work with a Vector2 type.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;How about making use of standard min and max functions with Vector2?&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;lowerBound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;upperBound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is going to throw an error, as the standard min and max functions
need the type to conform to the comparable protocol. So let’s do that
first.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nf"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;extension&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Comparable&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;lowerBound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;upperBound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This works as expected. This is a great feature, in my opinion, one of
the best things to switch from Objective-C to Swift. Moving forward,
let’s write a generic clamp function.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;
&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Comparable&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// prints 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is awesome! Let’s try our clamp function with Vector2.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;lowerBound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;upperBound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;test1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// {x:100, y:100}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;test2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// {x:-100, y:-100}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;test3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// {x:-10, y:-134}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;test4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// {x:10, y:134}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;At first this might look bad, because the test3 and test4 are not
correct. But, this is not the compiler’s fault. The standard min and max
use the overloaded comparison operators and they are not correct. We can
test this with&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;test5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// {x:-10, y:-134}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;test6&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// {x:10, y:134}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Let’s fix them by providing our own specialized versions.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;test5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// {x:-100, y:-134}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;test6&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// {x:100, y:134}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This looks better in the sense that the min and max is calculated per
component. But, something is still wrong with our clamp tests, as they
still print the same old value. Turns out the min and max within clamp
function still use the standard generic function, rather than our
provided specialized version.&lt;/p&gt;

&lt;p&gt;The only way to make this work is if I provide a specialized clamp
function for Vector2.&lt;/p&gt;

&lt;div class="language-swift highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Vector2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;test1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// {x:100, y:100}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;test2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// {x:-100, y:-100}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;test3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// {x:-10, y:-100}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;test4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// {x:10, y:100}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that the specialized clamp implementation for Vector2 is exactly
the same as the generic one. And this is not good, as now if we want the
compiler to automatically pick the right version, we have to implement
the entire chain down to every function. So, it comes down to either
using the generic functions all the way up or implementing the entire
chain.&lt;/p&gt;

&lt;p&gt;To compare, here’s a C++ version of the same functionality that works
great with a single clamp generic implementation.&lt;/p&gt;

&lt;div class="language-cpp highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Vector2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Vector2&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector2&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Vector2&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Vector2&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector2&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Vector2&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ostream&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ostream&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Vector2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;os&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;", "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Vector2&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Vector2&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;  &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;  &lt;span class="n"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;  &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lowerBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;  &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;upperBound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In conclusion, generic programming with Swift is great and definitely a
step forward than Objective-C, but somebody coming from C++ would be a
little disappointed. The bright side is that the Swift language is
rapidly evolving and maybe this would get improved in the future
version.&lt;/p&gt;

&lt;p&gt;The entire code for this rant is available at
&lt;a href="https://gist.github.com/chunkyguy/5c11fbe4b52b634dade7"&gt;C++&lt;/a&gt; and
&lt;a href="https://gist.github.com/chunkyguy/d3aa8b27ace2abd44f4b"&gt;Swift&lt;/a&gt;.&lt;/p&gt;</description><author>Whacky Labs</author><pubDate>Tue, 20 Jan 2015 08:24:54 GMT</pubDate><guid isPermaLink="true">https://whackylabs.com/swift/2015/01/20/curious-case-of-generics-specialization-with-swift/</guid></item><item><title>Good Advice</title><link>https://www.craigpardey.com/post/2015-01-20-good-advice/</link><description>&lt;p&gt;A thread appeared on Hacker News recently about how successful people operate.  &lt;a href="https://news.ycombinator.com/item?id=8917667"&gt;The comment&lt;/a&gt; below really struck a chord with me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Don&amp;rsquo;t waste time.&lt;/li&gt;
&lt;li&gt;Be mission/vision focused.&lt;/li&gt;
&lt;li&gt;Be polite to everyone always.&lt;/li&gt;
&lt;li&gt;Be helpful whenever possible.&lt;/li&gt;
&lt;li&gt;Be insanely organized.&lt;/li&gt;
&lt;li&gt;Seek and respond to constructive feedback on your work.&lt;/li&gt;
&lt;li&gt;Do the shit work without whining.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this will build human capital with other people in the organization, which will both practically give you more resources of
help from others to draw on in your work requirements, but also increases your visibility with people who aren&amp;rsquo;t on the front lines
doing the work (e.g. Management). That visibility gives you the means to move in whatever direction you might desire. It also (for
want of a better way to put it) usually tends to help make you layoff-proof because people know you are competent, professional,
and have some flexibility to work as part of a team.&lt;/p&gt;</description><author>Craig Pardey</author><pubDate>Tue, 20 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.craigpardey.com/post/2015-01-20-good-advice/</guid></item><item><title>Setting up a Scala sbt multi-project with Cassandra connectivity and migrations</title><link>https://manuel.kiessling.net/2015/01/19/setting-up-a-scala-sbt-multi-project-with-cassandra-connectivity-and-migrations/</link><description>This is a cross-post from the official Galeria Kaufhof Technology Blog
I have learned the following through the great support and advice of my coworkers Jens Müller and Martin Grotzke.
About I have recently joined the new multi-channel retail eCommerce project at Galeria Kaufhof in Cologne. This meant diving head-first into a large-scale Scala/Play/Akka/Ruby software ecosystem, and as a consequence, a lot of learning (and unlearning, and disorientation, and some first small successes), as I’m still quite new to Scala.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Mon, 19 Jan 2015 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2015/01/19/setting-up-a-scala-sbt-multi-project-with-cassandra-connectivity-and-migrations/</guid></item><item><title>Primal Fear</title><link>https://olshansky.info/movie/primal_fear/</link><description>Olshansky's review of Primal Fear</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 19 Jan 2015 08:48:11 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/primal_fear/</guid></item><item><title>The Judge</title><link>https://olshansky.info/movie/the_judge/</link><description>Olshansky's review of The Judge</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 19 Jan 2015 07:56:39 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_judge/</guid></item><item><title>Never Buy Retail</title><link>https://tiltingatwindmills.dev/never-buy-retail/</link><description>In light of a particularly aggressive savings plan this year, I've been thinking
hard about every purchase I make. In doing so I think I've…</description><author>Tilting at Windmills</author><pubDate>Sun, 18 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/never-buy-retail/</guid></item><item><title>Preventing Bash Pranks</title><link>https://bfontaine.net/2015/01/17/preventing-bash-pranks/</link><description>&lt;p&gt;The easiest and most popular Bash pranks involve someone messing up with your
&lt;code class="language-plaintext highlighter-rouge"&gt;~/.bashrc&lt;/code&gt;. For example, here is a real-life example:&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="c"&gt;#! /bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$b&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"echo sleep 1 &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you execute this script, it’ll add a newline in your &lt;code class="language-plaintext highlighter-rouge"&gt;~/.bashrc&lt;/code&gt; just in
case it doesn’t end with a newline, then add this line:&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo sleep &lt;/span&gt;1 &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The effect of this isn’t immediately visible to the pranked user. When they’ll
start a new Bash session, e.g. by opening a new terminal window, the code in
&lt;code class="language-plaintext highlighter-rouge"&gt;~/.bashrc&lt;/code&gt; will be executed, and the previous line will add &lt;code class="language-plaintext highlighter-rouge"&gt;sleep 1&lt;/code&gt; at the
end of it, which means it’ll be executed and the user will have to wait one
more second before having their prompt. The next time they’ll open a session,
it’ll add one more line and thus will wait 2 seconds, and so forth.&lt;/p&gt;

&lt;p&gt;In this post, I’ll give you an overview of the existing solutions to prevent
these pranks.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Note that I’m referring to &lt;code class="language-plaintext highlighter-rouge"&gt;~/.bashrc&lt;/code&gt; as your startup Bash file because it’s
commonly used, but some people directly use &lt;code class="language-plaintext highlighter-rouge"&gt;~/.bash_profile&lt;/code&gt; instead, or
another one. When you start a session, Bash reads &lt;code class="language-plaintext highlighter-rouge"&gt;/etc/profile&lt;/code&gt;, then tries
&lt;code class="language-plaintext highlighter-rouge"&gt;~/.bash_profile&lt;/code&gt;, &lt;code class="language-plaintext highlighter-rouge"&gt;~/.bash_login&lt;/code&gt;, and &lt;code class="language-plaintext highlighter-rouge"&gt;~/.profile&lt;/code&gt;, (in that order). In most
environments the default &lt;code class="language-plaintext highlighter-rouge"&gt;~/.bash_profile&lt;/code&gt; file sources &lt;code class="language-plaintext highlighter-rouge"&gt;~/.bashrc&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id="user-rights"&gt;User Rights&lt;/h2&gt;

&lt;p&gt;The first solution is to protect your &lt;code class="language-plaintext highlighter-rouge"&gt;~/.bashrc&lt;/code&gt; by restraining the access.
Nobody should be able to edit your file except &lt;em&gt;you&lt;/em&gt; (and &lt;code class="language-plaintext highlighter-rouge"&gt;root&lt;/code&gt;). It should be
the default, but if you messed up with user rights, here is how to reset the
file to a safe state (read and write for you, and that’s &lt;em&gt;all&lt;/em&gt;):&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ chmod 600 ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Most attacks thus involve you executing a script, which allows them to bypass
the rights because the script is executed by &lt;em&gt;you&lt;/em&gt; with &lt;em&gt;your&lt;/em&gt; editing rights.&lt;/p&gt;

&lt;p&gt;One solution would be to remove your own writing right and adding it only when
you need it:&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="c"&gt;# add this in your ~/.bashrc&lt;/span&gt;
secure-edit&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;chmod &lt;/span&gt;u+w &lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EDITOR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;vi&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;chmod &lt;/span&gt;u-w &lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then remove your writing right:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ chmod 400 ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can’t edit your file anymore, but you can use your new &lt;code class="language-plaintext highlighter-rouge"&gt;secure-edit&lt;/code&gt;
command:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;$ secure-edit ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It temporarily allows you to modify the file, open your editor, then put the
restricted rights back.&lt;/p&gt;

&lt;h2 id="the-last-line-protection"&gt;The “last line protection”&lt;/h2&gt;

&lt;p&gt;This one is easy to use but easy to circumvent. The goal is to prevent one-line
insertions, such as:&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"alias ls=cd"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and the solution is as simple as:&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="c"&gt;#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Yes, that’s just an hash symbol. If you ends your &lt;code class="language-plaintext highlighter-rouge"&gt;~/.bashrc&lt;/code&gt; with it, the
first inserted line will be commented out:&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="c"&gt;#alias ls=cd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It doesn’t work if the prankster adds multiple lines, or adds a newline before
the prank.&lt;/p&gt;

&lt;h2 id="return"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;return&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;You can exit from a Bash script with &lt;code class="language-plaintext highlighter-rouge"&gt;exit&lt;/code&gt;. Your &lt;code class="language-plaintext highlighter-rouge"&gt;~/.bashrc&lt;/code&gt; is not executed
like a script, it’s &lt;em&gt;sourced&lt;/em&gt;. This means Bash doesn’t start a subshell for it
and execute all its content in the current shell. This also means if you write
&lt;code class="language-plaintext highlighter-rouge"&gt;exit&lt;/code&gt; it’ll exit your current shell.&lt;/p&gt;

&lt;p&gt;The solution here is to use &lt;code class="language-plaintext highlighter-rouge"&gt;return&lt;/code&gt; at the end of your file:&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Any line added after this one won’t be executed because Bash will stop the
evaluation. Note that while it’s better than the previous solution, it can be
nullified by a &lt;code class="language-plaintext highlighter-rouge"&gt;sed&lt;/code&gt; call (e.g. &lt;code class="language-plaintext highlighter-rouge"&gt;sed 's/return//'&lt;/code&gt;).&lt;/p&gt;

&lt;h2 id="the-disguised-return"&gt;The disguised &lt;code class="language-plaintext highlighter-rouge"&gt;return&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;This one is the same as the previous one, but prevents pranksters from removing
it with calls to &lt;code class="language-plaintext highlighter-rouge"&gt;sed&lt;/code&gt; or similar search &amp;amp; replace techniques. It uses the fact
than in Bash you can execute a command contained in a variable by using it at
the proper place:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;print_something=echo
$print_something hello
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;These lines are equivalent to &lt;code class="language-plaintext highlighter-rouge"&gt;echo hello&lt;/code&gt;. We use the same thing here with
&lt;code class="language-plaintext highlighter-rouge"&gt;return&lt;/code&gt;. The idea is to execute an obfuscated version of return, e.g.:&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tu
&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;re
&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rn

&lt;span class="nv"&gt;$a$b$c&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And &lt;em&gt;voilà!&lt;/em&gt; It’s now nearly impossible to detect the &lt;code class="language-plaintext highlighter-rouge"&gt;return&lt;/code&gt; execution
without manually editing the &lt;code class="language-plaintext highlighter-rouge"&gt;~/.bashrc&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;This is still vulnerable to file replacement, e.g.:&lt;/p&gt;

&lt;div class="language-bash highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'echo "sorry, no."'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This wipes the existing &lt;code class="language-plaintext highlighter-rouge"&gt;~/.bashrc&lt;/code&gt; file and replace it with another one.&lt;/p&gt;</description><author>Baptiste Fontaine’s Blog</author><pubDate>Sat, 17 Jan 2015 18:30:00 GMT</pubDate><guid isPermaLink="true">https://bfontaine.net/2015/01/17/preventing-bash-pranks/</guid></item><item><title>Graphics design tools bookmarks</title><link>https://xenodium.com/graphics-design-tools-bookmarks</link><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/nixcraft/status/1413395599534088194"&gt;Alternatives to Adobe products on Linux, macOS and Windows&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.aseprite.org/"&gt;Aseprite&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/LisaDziuba/Awesome-Design-Tools/"&gt;Awesome-Design-Tools: The best design tools for everything&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://leaverou.github.io/contrast-ratio"&gt;Contrast ratio&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://designcode.io"&gt;Design+code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.animatron.com/"&gt;HTML5 animations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.mengto.com/quick-ios-prototyping-flinto/"&gt;Ios prototyping with flinto&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://krita.org/"&gt;Krita&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.getleonardo.com/"&gt;Leonardo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://makeappicon.com/"&gt;MakeAppIcon - Generate app icons of all sizes with a click!&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.madewithmischief.com/"&gt;Mischief&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mypaint.intilinux.com/"&gt;Mypaint&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://natron.inria.fr/"&gt;Natron&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.getormr.com/features/"&gt;Ormr&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://screen.guru"&gt;Screen Guru - Take clean screenshot of any websites&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bohemiancoding.com/sketch/"&gt;Sketch for Mac&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sketchup.com/"&gt;Sketchup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tvpaint.com"&gt;TVPaint&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><author>xenodium.com @alvaro</author><pubDate>Sat, 17 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://xenodium.com/graphics-design-tools-bookmarks</guid></item><item><title>Screenshot Saturday 207</title><link>https://etodd.io/2015/01/16/screenshot-saturday-207/</link><description>&lt;p&gt;Records continue to be broken. This week's map was actually done on Wednesday!&lt;/p&gt;
&lt;p&gt;
	Although most of Lemma is a strange hybrid of natural and alien-looking architecture, my design calls for a few "industrial / man-made" themed maps.
	For story reasons, and also because I just want to parkour through a skyscraper.
&lt;/p&gt;
&lt;p&gt;So on Monday I asked Twitter this question:&lt;/p&gt;
&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;Would people be upset if I do a few levels in the visual style of Mirror's Edge? Would that be tribute or rip-off?&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 16 Jan 2015 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/01/16/screenshot-saturday-207/</guid></item><item><title>Better Pull Requests</title><link>https://nicolaiarocci.com/better-pull-requests/</link><description>&lt;p&gt;I am not a big fan of top tens but &lt;a href="http://blog.ploeh.dk/2015/01/15/10-tips-for-better-pull-requests/"&gt;10 Tips for Better Pull Requests&lt;/a&gt; is well worth reading.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A good Pull Request involves more than just some code. In most cases, there’s one or more reviewer(s) involved, who will have to review your Pull Request in order to evaluate whether it’s a good fit for inclusion in the code base. Not only must you produce good code, but you must also cater to the person(s) doing the review.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Fri, 16 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/better-pull-requests/</guid></item><item><title>Eve 0.5.1 Released</title><link>https://nicolaiarocci.com/eve-0-5-1-released/</link><description>&lt;p&gt;&lt;a href="https://pypi.python.org/pypi/Eve"&gt;Eve 0.5.1&lt;/a&gt; was just released with a &lt;a href="http://python-eve.org/changelog#version-0-5-1"&gt;couple fixes&lt;/a&gt; to 0.5 (which was released earlier this week.) Don’t be surprised. Going forward I’m striving for a much faster release cycle, especially so when it comes to fixes.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Fri, 16 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/eve-0-5-1-released/</guid></item><item><title>Finding Fullness of Joy</title><link>http://evantravers.com/articles/2015/01/16/fullness-of-joy/</link><description>&lt;p&gt;&lt;img alt="morning" src="https://images.evantravers.com/articles/2015/01/psalm16.jpg" /&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;You make known to me the path of life; in your presence there is fullness of
joy; at your right hand are pleasures forevermore. (‭Psalm‬
‭16‬:‭11‬ ESV)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Lord, I am still seeking to learn about joy... and the phrase &amp;quot;fullness of joy”
sounds &lt;em&gt;wonderful&lt;/em&gt;. I can recall times when I've felt a true fullness of joy...
I can even see some fullness on the horizon as I become an uncle in just a few
weeks!  However, I must confess that I don't always feel a fullness of joy in
your presence, so I'm going to need to drink in this psalm over the coming
weeks.&lt;/p&gt;
&lt;p&gt;It seems to me that previous verses express the foundation of this joy as
welling up from David's gratitude for your protection, provision, and in Jesus'
resurrection (&amp;quot;you will not let your holy one see corruption&amp;quot;) leading to our
eternal salvation. How neat it is to read David's words pointing to Christ, so
many years ago! The cities and empires that thrived then are dust now, but your
word abides forever. I believe that I will have to reread some old journal
entries, and muse on all the trials you have delivered me through. I need to
laugh and cry over the beautiful moments you have graciously orchestrated.
Still more precious, I reflect on the &lt;em&gt;vastness&lt;/em&gt; of the mercy and grace I have
been granted in salvation!&lt;/p&gt;
&lt;p&gt;Thank you Lord for your love that endures my sin so vile, and spans eons of
time to rescue and adopt me as a son and heir. I am truly unworthy, and full of
joy. Continue to work in my heart, and enable me to meditate on these glorious
truths this weekend. In your name I pray, amen.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Fri, 16 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2015/01/16/fullness-of-joy/</guid></item><item><title>Installing Jekyll on fedora</title><link>https://shyamjos.com/installing-jekyll-on-fedora/</link><description>&lt;p&gt;






 
 
&lt;figure&gt;&lt;img alt="jekyll logo linux" class="mx-auto my-0 rounded-md" src="https://shyamjos.com/assets/img/misc/jekyll-logo-linux.png" /&gt;
&lt;/figure&gt;

Follow below steps to install jekyll on fedora&lt;/p&gt;
&lt;h2 class="relative group" id="install-jekyll"&gt;Install jekyll &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" href="#install-jekyll"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;sudo dnf install ruby-devel redhat-rpm-config jekyll
&lt;/code&gt;&lt;/pre&gt;&lt;h2 class="relative group" id="optional-packages"&gt;Optional packages &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" href="#optional-packages"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;sudo dnf group install "C Development Tools and Libraries"
sudo dnf install rubygems-devel nodejs bundler
&lt;/code&gt;&lt;/pre&gt;</description><author>Shyam Jos</author><pubDate>Fri, 16 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://shyamjos.com/installing-jekyll-on-fedora/</guid></item><item><title>Snail gym vs training jar</title><link>https://liza.io/snail-gym-vs-training-jar/</link><description>&lt;p&gt;I&amp;rsquo;ve tried implementing a gym for Gastropoda a couple of times now. Both times I put the feature on hold not because I got stuck, but because I realized that I may not really even &lt;em&gt;need&lt;/em&gt; a gym.&lt;/p&gt;</description><author>Liza Shulyayeva</author><pubDate>Thu, 15 Jan 2015 22:16:19 GMT</pubDate><guid isPermaLink="true">https://liza.io/snail-gym-vs-training-jar/</guid></item><item><title>Adding Xbox 360 controller support to a Nexus 5</title><link>https://cmetcalfe.ca/blog/adding-xbox360-controller-support-to-a-nexus5.html</link><description>&lt;div class="admonition update"&gt;
&lt;p class="admonition-title"&gt;Update&lt;/p&gt;
&lt;p&gt;CyanogenMod has effectively been replaced by &lt;a href="https://lineageos.org/"&gt;LineageOS&lt;/a&gt;. The links in this article originally
all pointed to CyanogenMod but since it no longer exists, I've updated them to use the LineageOS
equivilents where possible. The instructions will also need to be slightly modified for use with
LineageOS builds.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I finally just bought a new phone (a &lt;a href="http://en.wikipedia.org/wiki/Nexus_5"&gt;Nexus 5&lt;/a&gt;), and after flashing &lt;a href="https://en.wikipedia.org/wiki/CyanogenMod"&gt;CyanogenMod&lt;/a&gt; onto it, I've
been messing around with its &lt;a href="http://en.wikipedia.org/wiki/USB_On-The-Go"&gt;OTG&lt;/a&gt; support. My old phone (a &lt;a href="http://en.wikipedia.org/wiki/Nexus_4"&gt;Nexus 4&lt;/a&gt;) &lt;a href="http://blog.gsmarena.com/nexus-4-does-not-support-usb-otg-despite-google-saying-otherwise/"&gt;didn't have the
capability&lt;/a&gt; so being able to plug in keyboards, mice, external hard drives, and various other
peripherals was (embarrassingly enough) a thrill.&lt;/p&gt;
&lt;p&gt;Keyboards worked, mice worked, but when an Xbox 360 controller was plugged in, nothing happened.
Turns out that while the kernel didn't have support for it enabled out of the box, getting it
enabled and pushing the change upstream into the CyanogenMod project was easier than I thought.&lt;/p&gt;
&lt;p&gt;Beware that this post is going to be more of a record of what I did so that I can do it again and
less of a coherent tutorial.&lt;/p&gt;
&lt;h2&gt;Building CyanogenMod&lt;/h2&gt;
&lt;p&gt;First step was to download and compile CyanogenMod for my phone. I'm not going to go into this in
any detail on this because there's already a &lt;a href="https://web.archive.org/web/20161224200646/https://wiki.cyanogenmod.org/w/Development"&gt;good overview&lt;/a&gt; on the CyanogenMod wiki that covers
the entire process, as well as a &lt;a href="https://wiki.lineageos.org/devices/hammerhead/build"&gt;customized guide for the Nexus 5&lt;/a&gt;. If those articles are
followed correctly, you should be able to build a fresh CyanogenMod image with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;brunch&lt;span class="w"&gt; &lt;/span&gt;hammerhead
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;Enabling the kernel module&lt;/h2&gt;
&lt;p&gt;Once the image was flashed to the phone and verified to be working, the next step was to enable the
&lt;a href="https://www.kernel.org/doc/html/v4.16/input/devices/xpad.html"&gt;xpad kernel module&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Copy current kernel config to the kernel directory for editing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;build&lt;span class="w"&gt; &lt;/span&gt;dir&amp;gt;/kernel/lge/hammerhead/
cp&lt;span class="w"&gt; &lt;/span&gt;arch/arm/configs/cyanogenmod_hammerhead_defconfig&lt;span class="w"&gt; &lt;/span&gt;.config
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Edit the config:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;make&lt;span class="w"&gt; &lt;/span&gt;menuconfig&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;arm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At this point, a menu will come up. Search for &lt;code&gt;xpad&lt;/code&gt; (type &lt;code&gt;/xpad&lt;/code&gt;), and take note of the paths.
&lt;code&gt;ESC&lt;/code&gt; out of the search, navigate the tree and enable the modules found with the search. Save and
exit.&lt;/p&gt;
&lt;p&gt;Copy the config back and clean up any stray &lt;code&gt;*.o&lt;/code&gt; files:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt;1&lt;/span&gt;
&lt;span class="normal"&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cp&lt;span class="w"&gt; &lt;/span&gt;.config&lt;span class="w"&gt; &lt;/span&gt;arch/arm/configs/cyanogenmod_hammerhead_defconfig
make&lt;span class="w"&gt; &lt;/span&gt;mrproper
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After enabling the module, rebuild CyanogenMod using the normal &lt;code&gt;brunch hammerhead&lt;/code&gt; and flash it to
the phone.&lt;/p&gt;
&lt;h2&gt;Submitting the change upstream&lt;/h2&gt;
&lt;p&gt;Since Xbox controller support had already been requested in &lt;del&gt;&lt;a href="https://jira.cyanogenmod.org/browse/CYAN-4469"&gt;a JIRA ticket&lt;/a&gt;&lt;/del&gt;(dead link), I went
through the process to submit &lt;a href="https://review.lineageos.org/#/c/LineageOS/android_kernel_lge_hammerhead/+/87409/"&gt;the change&lt;/a&gt; on the CyanogenMod Gerrit instance for inclusion in the
next release. There's a guide for this &lt;a href="https://wiki.lineageos.org/submitting-patch-howto.html"&gt;here&lt;/a&gt;. As well as the guide, I found the people in
&lt;a href="https://webchat.freenode.net/?channels=#cyanogenmod-dev"&gt;#cyanogenmod-dev on Freenode&lt;/a&gt; to be very helpful.&lt;/p&gt;
&lt;p&gt;A short while after submitting &lt;a href="https://review.lineageos.org/#/c/LineageOS/android_kernel_lge_hammerhead/+/87409/"&gt;the change&lt;/a&gt; to Gerrit, it was merged into the &lt;code&gt;cm-11.0&lt;/code&gt; branch as
commit &lt;a href="https://github.com/LineageOS/android_kernel_lge_hammerhead/commit/7ef4f6a87cc114b5010b623d72840b1d38ea01ed"&gt;&lt;code&gt;i7ef4f6a&lt;/code&gt;&lt;/a&gt; and pushed out in the next nightly build (&lt;a href="https://cmetcalfe.ca/images/cyanogenmod-changelog-xbox-support.png"&gt;changelog screenshot&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;Wrap-up&lt;/h2&gt;
&lt;p&gt;It feels great to be able to contribute to an amazing open source project that had &lt;a href="https://twitter.com/CyanogenMod/status/157378138802888704"&gt;at least a
million people&lt;/a&gt; using it at one point or another. I recognize that the change by itself was just
changing a config file to enable functionality that already existed, but it's helped me get through
some of the non-coding hurdles of contributing to an Android fork like CyanogenMod (adb, fastboot,
unlocking and rooting phones, compiling AOSP, flashing images, the contribution process, etc). This
time the actual contribution itself was minor, but it's gotten me more familier with the process,
hopefully making it easier to contribute something more substantial in the future.&lt;/p&gt;
&lt;p&gt;In the end, I learned a lot about Android development and how all the different pieces that I had
read about at one point or another actually fit together. During the whole process I also lost a lot
of the fear I had about messing with phones and other more expensive locked down devices. Going
forward, I'm going to attempt to compile and flash open source operating systems like CyanogenMod
onto more devices that I own. I like being able to tweak things and feel like I really own them,
hardware and software.&lt;/p&gt;</description><author>Carey Metcalfe</author><pubDate>Thu, 15 Jan 2015 03:26:00 GMT</pubDate><guid isPermaLink="true">https://cmetcalfe.ca/blog/adding-xbox360-controller-support-to-a-nexus5.html</guid></item><item><title>Flat UI Color Palette for Sketch</title><link>https://huphtur.nl/flat-ui-color-palette-for-sketch/</link><description>&lt;p&gt;&lt;a href="https://github.com/huphtur/Sketch-Flat-UI-Color-Palette/archive/master.zip"&gt;Download the palette&lt;/a&gt;. Unzip, open in &lt;a href="http://bohemiancoding.com/sketch/"&gt;Sketch&lt;/a&gt; and copy the palette into your own document. Use &lt;code&gt;Control + C&lt;/code&gt; to quickly pick a color.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/huphtur/Sketch-Flat-UI-Color-Palette/archive/master.zip"&gt;&lt;img alt="Flat UI Color Palette." src="https://huphtur.nl/images/flat-ui-color-palette-for-sketch.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Based on &lt;a href="http://flatuicolors.co/"&gt;these&lt;/a&gt; &lt;a href="http://flatuicolors.com/"&gt;things&lt;/a&gt;, originated by Designmodo’s &lt;a href="http://designmodo.com/flat/"&gt;Flat UI&lt;/a&gt;.&lt;/p&gt;</description><author>huphtur</author><pubDate>Thu, 15 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://huphtur.nl/flat-ui-color-palette-for-sketch/</guid></item><item><title>Monitoring a Synology Diskstation with Munin</title><link>https://blog.tafkas.net/2015/01/15/monitoring-a-synology-diskstation-with-munin/</link><description>I have been using Munin to monitor the health of my Raspberry Pi for while now. As I have more devices installed in my network I was looking for a way to monitor these devices as well. As Munin uses a client-server model you are required to install the Munin node on the device to be monitored. Every five minutes the Munin server polls its clients for the values and creates charts using RRDTool.</description><author>Tafkas Blog</author><pubDate>Thu, 15 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.tafkas.net/2015/01/15/monitoring-a-synology-diskstation-with-munin/</guid></item><item><title>The Internet’s Own Boy</title><link>https://nicolaiarocci.com/internet-own-boy-aaron-swartz/</link><description>&lt;p&gt;I wasn’t aware that &lt;a href="https://www.youtube.com/watch?v=vXr-2hwTk58"&gt;The Internet’s Own Boy: The Story of Aaron Swartz&lt;/a&gt; is now available with a Creative Common license, free for everyone to enjoy.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Wed, 14 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/internet-own-boy-aaron-swartz/</guid></item><item><title>android UI development made easy</title><link>https://zserge.com/posts/android-mvx/</link><description>TL;DR: I offer declarative strongly typed layouts with data bindings in pure Java.
Android UI development is broken. It normally ends up with lots of boilerplate code and poor architecture. Here are some (very subjective) issues:
There is no MVC (or M-V-Whatever). XMLs always contain lots of copy-pasted code, very poor code reuse. XMLs are very fragile, so you can type &amp;ldquo;TextVeiw&amp;rdquo; and it will not warn you during the compilation but will throw an InflateException in runtime.</description><author>zserge's blog</author><pubDate>Wed, 14 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://zserge.com/posts/android-mvx/</guid></item><item><title>Announcing Eve-SQLAlchemy the official SQL extension for the Eve REST Framework</title><link>https://nicolaiarocci.com/announcing-eve-sqlalchemy-the-official-sql-extension-for-the-eve-rest-framework/</link><description>&lt;p&gt;Powered by SQLAlchemy and good intentions, &lt;a href="https://github.com/RedTurtle/eve-sqlalchemy"&gt;Eve-SQLAlchemy&lt;/a&gt; is an official &lt;a href="http://python-eve.org"&gt;Eve&lt;/a&gt; extension which allows to effortlessly build and deploy highly customizable, fully featured RESTful Web Services with SQL backends.&lt;/p&gt;
&lt;p&gt;As with all Eve extensions, once installed with&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ pip install eve-sqlalchemy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;using Eve-SQLAlchemy is very simple:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from eve import Eve
from eve_sqlalchemy import SQL

app = Eve(data=SQL)
app.run()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On a fresh virtualenv (of course you are using virtualenvs, right?) the install will also setup Eve and all its dependencies for you. For a complete tutorial you can visit the Eve-SQLAlchemy &lt;a href="http://eve-sqlalchemy.readthedocs.org/"&gt;Support Website&lt;/a&gt;.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Tue, 13 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/announcing-eve-sqlalchemy-the-official-sql-extension-for-the-eve-rest-framework/</guid></item><item><title>No Road by Philip Larkin</title><link>https://ho.dges.online/words/commonplace/no-road-by-philip-larkin/</link><description>&lt;p&gt;Since we agreed to let the road between us&lt;br /&gt;
Fall to disuse,&lt;br /&gt;
And bricked our gates up, planted trees to screen us,&lt;br /&gt;
And turned all time&amp;rsquo;s eroding agents loose,&lt;br /&gt;
Silence, and space, and strangers - our neglect&lt;br /&gt;
Has not had much effect.&lt;/p&gt;
&lt;p&gt;Leaves drift unswept, perhaps; grass creeps unmown;&lt;br /&gt;
No other change.&lt;br /&gt;
So clear it stands, so little overgrown,&lt;br /&gt;
Walking that way tonight would not seem strange,&lt;br /&gt;
And still would be allowed. A little longer,&lt;br /&gt;
And time would be the stronger,&lt;/p&gt;</description><author>ho.dges.online</author><pubDate>Tue, 13 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/words/commonplace/no-road-by-philip-larkin/</guid></item><item><title>Yu were mislead</title><link>https://captnemo.in/blog/2015/01/13/yu-yureka/</link><description>&lt;p&gt;I was eagerly awaiting the release of Yu Yureka, which has been widely hailed as a great budget phone by most reviews. I won’t go into the details of the phone, but rather the flash sale that took place on 13th Jan ‘15 (on amazon.in). Far from being a well-managed affair, the website was plagued with issues, and went down for everyone a couple of minutes before the sale.&lt;/p&gt;

&lt;p&gt;Still, a few lucky people were able to buy the phone (sadly, I wasn’t one of them). Micromax said that they had to close registrations for the sale early and had around 3 lakh people lined up for the sale.&lt;/p&gt;

&lt;p&gt;This is how the &lt;a href="https://web.archive.org/web/20150122020319/http://yuplaygod.com/"&gt;yuplaygod.com&lt;/a&gt; homepage looks right now:&lt;/p&gt;

&lt;p&gt;&lt;img alt="YuPlayGod.com Home Page" src="/img/yuplaygod.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;Clearly, they had 10k units for sale, and one in every 300 people should have bought it, right? Wrong!&lt;/p&gt;

&lt;p&gt;It seems Yu (the brand new subsidiary of Micromax) is not above lying. There were &lt;em&gt;only 3000 devices on sale today, out of which only 2657 were claimed&lt;/em&gt;, after which the sale was shut down.&lt;/p&gt;

&lt;p&gt;How do I know this? The way deals work on amazon is once you are on a deal page, the client keeps checking the deal status every few seconds so as to let you know as soon as its status changes. This deal status response does not only include the deal status code (say EXPIRED/SOLDOUT/AVAILABLE), but also includes the deal’s nitty details.&lt;/p&gt;

&lt;p&gt;These details include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;totalCouponCount: &lt;strong&gt;3000&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;claimedCouponCount: &lt;strong&gt;2657&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;percentClaimed: &lt;strong&gt;88&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;type: &lt;code class="language-plaintext highlighter-rouge"&gt;LIGHTNING_DEAL&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;title: Yureka&lt;/li&gt;
  &lt;li&gt;dealPrice: 8999&lt;/li&gt;
  &lt;li&gt;currentPrice: 12999&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m not sure why Yu would try such a tactic (hype the device at low cost, overstate sales figures and then switch to a higher price), but it sure does not sound nice if you are one of the 3 lakh people who lined up to buy the device.&lt;/p&gt;

&lt;h2 id="references"&gt;References&lt;/h2&gt;

&lt;p&gt;Since its my word against amazon, here’s a simple way to confirm the deal details for yourself:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Visit &lt;a href="http://hurl.it/"&gt;http://hurl.it/&lt;/a&gt; (I don’t own this site)&lt;/li&gt;
  &lt;li&gt;Change the request method to “POST” from “GET”&lt;/li&gt;
  &lt;li&gt;Enter &lt;code class="language-plaintext highlighter-rouge"&gt;http://www.amazon.in/xa/dealcontent/v2/GetDealStatus&lt;/code&gt; where it says &lt;code class="language-plaintext highlighter-rouge"&gt;yourapihere.com&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Click on “+ Add Body Button”&lt;/li&gt;
  &lt;li&gt;Paste &lt;code class="language-plaintext highlighter-rouge"&gt;{"requestMetadata":{"marketplaceID":"A21TJRUUN4KGV","clientID":"goldbox"},"dealTargets":[{"dealID":"ea9fef51","itemIDs":null}]}&lt;/code&gt; into the box that appears&lt;/li&gt;
  &lt;li&gt;Click on “Launch Request”&lt;/li&gt;
  &lt;li&gt;Scroll to the bottom to see the dealStatus&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As an alternative, &lt;a href="https://gist.github.com/captn3m0/52fca6662e453c60a6b9"&gt;here is a permalink&lt;/a&gt; to the request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: If you try to replicate the above steps, you will notice that the deal response is now blank. My guess is that the deal was deleted from the servers. However, the permalinks above should still work. I’m still waiting for any official word from either Yu/Amazon.&lt;/p&gt;

&lt;p&gt;Here’s a better (edited) photo that Yu might wanna use:&lt;/p&gt;

&lt;p&gt;&lt;img alt="Yu don't play God" src="/img/yuplaygod_edited.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="http://shashankmehta.in/"&gt;Shashank Mehta&lt;/a&gt; for the title suggestion.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Tue, 13 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/01/13/yu-yureka/</guid></item><item><title>Keep it Simple... UX Design</title><link>https://www.danstroot.com/posts/2015-01-13-kiss-my-ux</link><description>&lt;img alt="post image" src="https://danstroot.imgix.net/assets/blog/img/iron_man.png" /&gt;&lt;br /&gt;&lt;br /&gt;Having done some user interface work over the break I discovered that my design approach was...&lt;br /&gt;&lt;br /&gt;This post &lt;a href="https://www.danstroot.com/posts/2015-01-13-kiss-my-ux"&gt;Keep it Simple... UX Design&lt;/a&gt; first appeared on &lt;a href="https://www.danstroot.com"&gt;Dan Stroot's Blog&lt;/a&gt;</description><author>Dan Stroot</author><pubDate>Tue, 13 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.danstroot.com/posts/2015-01-13-kiss-my-ux</guid></item><item><title>Eve 0.5 released today</title><link>https://nicolaiarocci.com/eve-0-5-released-today/</link><description>&lt;p&gt;&lt;a href="http://python-eve.org"&gt;Eve&lt;/a&gt; v0.5 was released today. &lt;a href="https://github.com/nicolaiarocci/cerberus"&gt;Cerberus&lt;/a&gt; v0.8 only a few days ago. A whole lot of new features, changes and fixes are coming with these releases so make sure to check the &lt;a href="http://blog.python-eve.org/eve-05-released"&gt;official release post&lt;/a&gt; to gather all the news.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 12 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/eve-0-5-released-today/</guid></item><item><title>How to: Add custom JeSuisCharlie header to API responses</title><link>https://nicolaiarocci.com/how-to-add-a-je-suis-charlie-header-to-api-responses/</link><description>&lt;p&gt;A lot of servers have been including a &lt;code&gt;JeSuisCharlie&lt;/code&gt; header with their responses. If you haven’t already, try with Charlie Hebdo site itself:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl -I charliehebdo.fr
Date: Mon, 12 Jan 2015 15:56:13 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 221
Connection: keep-alive
Location: http://www.charliehebdo.fr/index.html
Vary: Accept-Encoding
X-Charlie-fr: Je suis toujours Charlie.
X-Charlie-en: I am still Charlie.
X-Charlie-es: Todavia soy Charlie.
X-Charlie-de: Ich bin immer Charlie.
X-Charlie-ro: Inca sunt Charlie.
X-Charlie-cz: Jsem stale Charlie.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I find this to be a great way for us techies to somehow contribute and show support for the ongoing anti-terrorism campaign. So if you feel like doing it here is a quick rundown on how to serve custom headers with your Eve-powered REST API. It is actually a very easy task to accomplish.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 12 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/how-to-add-a-je-suis-charlie-header-to-api-responses/</guid></item><item><title>Julia First Impressions</title><link>https://bastibe.de/2015-01-12-julia.html</link><description>&lt;blockquote&gt;
&lt;p&gt;Julia is a high-level dynamic programming language designed to address the requirements of high-performance numerical and scientific computing while also being effective for general purpose programming. —&lt;a href="https://en.wikipedia.org/wiki/Julia_%28programming_language%29"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In other words, it is supposed to be as fast as C, as practical as Python, and as scientific as Matlab. The next step in mainstream scientific computing.&lt;/p&gt;
&lt;p&gt;However, Julia is still very young, and still evolving rapidly. But if any of the above is true, I am &lt;em&gt;very&lt;/em&gt; interested!&lt;/p&gt;
&lt;p&gt;So, over the last few days, I re-implemented an algorithm in Julia. The previous version of the algorithm was written in Python. The algorithm spends most of it's time in FFTs, thus I didn't expect big performance gains.&lt;/p&gt;
&lt;p&gt;It is actually nice to have a language that is built for scientific computation. Coming from Python, it is refreshing to have &lt;a href="http://docs.julialang.org/en/release-0.3/manual/arrays/"&gt;array literals&lt;/a&gt;, ranges and &lt;a href="http://docs.julialang.org/en/release-0.3/stdlib/math/"&gt;mathematics&lt;/a&gt; available without importing anything. Much like Python, Julia also has a proper &lt;a href="http://docs.julialang.org/en/release-0.3/manual/modules/"&gt;module system&lt;/a&gt;, comprehensions, and more than one function per file.&lt;/p&gt;
&lt;p&gt;On the other hand, there are a few questionable design decisions as well. Julia uses 1-based, inclusive indexing (&lt;code&gt;range[1:3] = [1 2 3]&lt;/code&gt; as opposed to Python's &lt;code&gt;range[:3] = [0, 1, 2]&lt;/code&gt;). In practice, my experience is that I rarely need to add ±1 when indexing in Python, but I frequently need it in Julia/Matlab.&lt;/p&gt;
&lt;p&gt;Also, Julia has no docstrings, which makes me sad. The whole documentation story is sad, really: Documentation is often incomplete, or missing altogether. Unit testing is not widespread at all, and still crude. 0.4 will apparently add docstrings &lt;a href="https://github.com/MichaelHatherly/Docile.jl"&gt;using macros&lt;/a&gt;. This is ugly and doesn't work for one's own code, but it's certainly a step in the right direction. Those error messages would need some work, too.&lt;/p&gt;
&lt;p&gt;All of that is hopefully just a symptom of Julia being young, and will improve over time. Similarly, signal processing functions are missing entirely, and I had to re-implement some. The community is growing rapidly, though, and a lot of missing functionality can be installed through the &lt;a href="http://docs.julialang.org/en/release-0.3/manual/packages/"&gt;package manager&lt;/a&gt; already.&lt;/p&gt;
&lt;p&gt;When it comes to writing code, there is a lot to like about Julia. Julia's type system does impose a bit of overhead, but it also grants immediate benefits: Many of Python's runtime errors happen at evaluation time and functions can easily document their arguments' types. Also, thinking strictly about types actually improved performance by a good 20% in my algorithm.&lt;/p&gt;
&lt;p&gt;And finally, Performance is surprisingly good! Although my algorithm spends almost all of its time doing FFTs, Julia performed about twice as fast as Python. This is pretty much exactly twice as much as I had expected! It also exposed more of the &lt;a href="http://docs.julialang.org/en/release-0.3/stdlib/math/?highlight=plan_fft#Base.plan_fft"&gt;features&lt;/a&gt; of the underlying libraries, which could be used for another speed-up of some 10%.&lt;/p&gt;
&lt;p&gt;At the end of the day, Julia clearly isn't mature yet, but very promising. Documentation and libraries will no doubt grow, and performance is already excellent. I'll definitely keep an eye on it, and will experiment further when the opportunity presents itself.&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Mon, 12 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2015-01-12-julia.html</guid></item><item><title>The Logstash Config Guide</title><link>http://jrgns.net/blog/2015/01/12/logstash-config-guide.html</link><description>&lt;p&gt;The ELK stack has been becoming more and more popular, specifically &lt;a href="http://www.elasticsearch.org/"&gt;Elasticsearch&lt;/a&gt;. The &lt;a href="http://www.google.com/trends/explore#q=elasticsearch"&gt;search volume&lt;/a&gt; for it has been growing constantly since 2010. It’s faithful sidekick, &lt;a href="http://logstash.net/"&gt;Logstash&lt;/a&gt;, has been growing along with it, and ever since I’ve started looking at it, I’m just loving it more and more.&lt;/p&gt;

&lt;p&gt;The fact that you can string together totally disparate systems, from XMPP to Redmine and files on S3 to Nagios, with a simple config makes it a wonderful plaything and very useful utility. The rub, though, is in the config: Even though a great effort is made to write proper docs, I’ve found the documentation to be unclear, incomplete and sometimes confusing. So I’ve decided to do something about it:&lt;/p&gt;

&lt;p style="text-align: center;"&gt;Pain Free Logstash Configuration&lt;/p&gt;

&lt;p style="text-align: center;"&gt;
&lt;a href="https://leanpub.com/logstashconfigguide"&gt;
&lt;img src="https://s3.amazonaws.com/titlepages.leanpub.com/logstashconfigguide/medium?1421001125" /&gt;
&lt;/a&gt;
&lt;/p&gt;

&lt;p style="text-align: center;"&gt;
Buy it now on &lt;a href="https://leanpub.com/logstashconfigguide"&gt;Leanpub&lt;/a&gt;
&lt;/p&gt;

&lt;!--break--&gt;

&lt;p&gt;The plan is to write focused guides on some of the more popular Logstash plugins in the hopes of making it easier for people to set up and configure them. Each chapter will point out the bare minimum required to get you up and running and also highlight some of the more interesting, but not necessarily necessary settings for a plugin. You’ll also find a complete reference of all the available settings, with working examples for each of them.&lt;/p&gt;

&lt;p&gt;It’s still early days, but I’ll be publishing a number of preliminary posts on [EagerELK][5] to get things going. Subscribe there, or just buy the book on &lt;a href="https://leanpub.com/logstashconfigguide"&gt;Leanpub&lt;/a&gt;, to stay up to date.&lt;/p&gt;

&lt;p&gt;The book will be focusing on version 1.4.2 of Logstash (since 1.5 is still in beta), but I’ll update it once 1.5 is stable and being adopted. If you sign up for the 1.4.2 version, you’ll receive a free upgrade to the 1.5 version. Two books for the price of one!&lt;/p&gt;

&lt;p&gt;Any questions or comments are welcome, let me know below!&lt;/p&gt;</description><author>Jurgens du Toit</author><pubDate>Mon, 12 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">http://jrgns.net/blog/2015/01/12/logstash-config-guide.html</guid></item><item><title>Setting up iSER-enabled TGT RAM disk</title><link>https://makedist.com/posts/2015/01/12/setting-up-iser-enabled-tgt-ram-disk/</link><description>Bigger and faster networked RAM disks with RDMA and RAID.</description><author>Noah Watkins</author><pubDate>Mon, 12 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2015/01/12/setting-up-iser-enabled-tgt-ram-disk/</guid></item><item><title>Interfaces out of Laziness</title><link>https://nicolaiarocci.com/interfaces-laziness/</link><description>&lt;p&gt;Robert C. Martin is at it &lt;a href="http://blog.cleancoder.com/uncle-bob/2015/01/08/InterfaceConsideredHarmful.html"&gt;again&lt;/a&gt; this time targeting the (infamous?) &lt;code&gt;Interface&lt;/code&gt; construct in a funny way. As both a C# and Python coder I couldn’t agree more. Also, let me quote my fellow polyglot developer &lt;a href="http://wthwdik.wordpress.com/"&gt;Nicola Musatti&lt;/a&gt; who went all out on the topic:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some of us have known that for the best part of the last 20 years 😉&lt;/p&gt;&lt;/blockquote&gt;</description><author>Nicola Iarocci</author><pubDate>Sat, 10 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/interfaces-laziness/</guid></item><item><title>Screenshot Saturday 206</title><link>https://etodd.io/2015/01/09/screenshot-saturday-206/</link><description>&lt;p&gt;I moved my office into an incubator / art gallery this week.&lt;/p&gt;
&lt;a href="https://etodd.io/assets/S43weET.jpg"&gt;&lt;img src="https://etodd.io/assets/S43weETl.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;
	The move is mostly for my own sanity.
	Turns out, working alone in your apartment for 9 months isn't the most fun in the world.
	It's a Herculean effort just to stay motivated.
	I also lost all semblance of a disciplined sleep schedule.
&lt;/p&gt;
&lt;p&gt;
	Productivity has been great since the move, and I'm back on a normal sleep schedule.
	Having people around is great, even if I mostly tune them out to focus on work (sorry guys).
&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 09 Jan 2015 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/01/09/screenshot-saturday-206/</guid></item><item><title>Things you should not read, Vol. 1</title><link>https://manuel.kiessling.net/2015/01/09/things-you-should-not-read-vol-1/</link><description>Please do not read this, this, this, this, and this.</description><author>Home on The Log Book of Manuel Kießling</author><pubDate>Fri, 09 Jan 2015 17:13:00 GMT</pubDate><guid isPermaLink="true">https://manuel.kiessling.net/2015/01/09/things-you-should-not-read-vol-1/</guid></item><item><title>The Drop</title><link>https://olshansky.info/movie/the_drop/</link><description>Olshansky's review of The Drop</description><author>🦉 olshansky 🦁</author><pubDate>Fri, 09 Jan 2015 16:43:32 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/the_drop/</guid></item><item><title>On Reusable Software</title><link>https://nicolaiarocci.com/on-reusable-software/</link><description>&lt;p&gt;Jos de Jong has a &lt;a href="http://josdejong.com/blog/2015/01/06/code-reuse/"&gt;great concise write-up&lt;/a&gt; on pitfalls and excesses in building reusable software.&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Thu, 08 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/on-reusable-software/</guid></item><item><title>The Content Singularity</title><link>https://tiltingatwindmills.dev/the-conteningularity/</link><description>Think back to the time before the Internet, if you're old enough. How did you
get entertainment? Typically, you had to drive to a store pay…</description><author>Tilting at Windmills</author><pubDate>Thu, 08 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/the-conteningularity/</guid></item><item><title>Remote RAM disk with RDMA</title><link>https://makedist.com/posts/2015/01/08/remote-ram-disk-with-rdma/</link><description>Piecing together iSER, iSCSI, and LIO to build a networked RAM disk.</description><author>Noah Watkins</author><pubDate>Thu, 08 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2015/01/08/remote-ram-disk-with-rdma/</guid></item><item><title>Business and Work 2014</title><link>https://www.databasesandlife.com/business-and-work-2014/</link><description>&lt;p&gt;I went to a lecture recently and the CEO of Runtastic spoke. He said: &lt;strong&gt;you don’t “win or &lt;em&gt;lose”&lt;/em&gt;, you “win or &lt;em&gt;learn”&lt;/em&gt;.&lt;/strong&gt; 2014 was a year of learning for me. Some of it was good, but some of it was definitely in the “you win or learn” sense of learning.&lt;/p&gt;
&lt;h2 id="collecting-on-debts"&gt;Collecting on debts&lt;/h2&gt;
&lt;p&gt;Many customers thought they would just order software from me and worry about paying it later. (The word “later” in the sense of tomorrow in “Alice in Wonderland”, i.e. not that indistinguishable from “never”.)&lt;/p&gt;</description><author>Databases &amp;amp; Life</author><pubDate>Wed, 07 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://www.databasesandlife.com/business-and-work-2014/</guid></item><item><title>2015-01-07</title><link>https://ho.dges.online/pictures/2015-01-07/</link><description/><author>ho.dges.online</author><pubDate>Wed, 07 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://ho.dges.online/pictures/2015-01-07/</guid></item><item><title>Similar CSS Color Finder</title><link>https://donatstudios.com/CSS-Alike-Color-Finder</link><description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: CIEDE2000 support added to the existing CIE94 support.&lt;/p&gt;
&lt;p&gt;It would seem that &lt;strong&gt;&lt;em&gt;very similar&lt;/em&gt;&lt;/strong&gt; but &lt;em&gt;non&lt;/em&gt;-identical colors seem to pop up often in CSS files of any reasonable age, and I became &lt;strong&gt;sick&lt;/strong&gt; of them. This started as a little script to help me find them in a stylesheet, and grew into this full-fledged tool.&lt;/p&gt;
&lt;p&gt;This tool will scan CSS and CSS-like files like Sass, Less, etc and find colors similar to each other within a set tolerance. &lt;/p&gt;
&lt;p&gt;This handles &lt;code&gt;#hex&lt;/code&gt;, &lt;code&gt;rgb&lt;/code&gt;, &lt;code&gt;rgba&lt;/code&gt;, &lt;code&gt;hsl&lt;/code&gt;, and &lt;code&gt;hsla&lt;/code&gt; colors.&lt;/p&gt;
&lt;p&gt;There is a command line version of this with Continuous Integration support available on &lt;a href="https://github.com/donatj/AlikeColorFinder/"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</description><author>Donat Studios</author><pubDate>Tue, 06 Jan 2015 11:41:33 GMT</pubDate><guid isPermaLink="true">https://donatstudios.com/CSS-Alike-Color-Finder</guid></item><item><title>Luminosity Masks in Darktable</title><link>https://blog.nawaz.org/posts/2015/Jan/luminosity-masks-in-darktable/</link><description>&lt;p&gt;When I first got into photoediting, I started off with the free software
&lt;a class="reference external" href="http://www.gimp.org/"&gt;&lt;span class="caps"&gt;GIMP&lt;/span&gt;&lt;/a&gt;. I was a student and couldn&amp;#8217;t afford Adobe Photoshop. While &lt;span class="caps"&gt;GIMP&lt;/span&gt;
had/has shortcomings, and as much as people like to denigrate it, it was
(and likely still is), the best general purpose photoediting tool …&lt;/p&gt;</description><author>Beetle Space</author><pubDate>Tue, 06 Jan 2015 10:00:00 GMT</pubDate><guid isPermaLink="true">https://blog.nawaz.org/posts/2015/Jan/luminosity-masks-in-darktable/</guid></item><item><title>Enabling Autostart of VirtualBox-VMs on FreeNAS</title><link>https://www.zufallsheld.de/2015/01/06/enabling-autostart-of-virtualbox-vms-on-freenas/</link><description>&lt;p&gt;There&amp;#8217;s the great FreeNAS &lt;a href="http://doc.freenas.org/9.3/freenas_jails.html#"&gt;jail&lt;/a&gt; &lt;a href="http://doc.freenas.org/9.3/freenas_jails.html#using-the-phpvirtualbox-template"&gt;phpVirtualBox&lt;/a&gt;. It lets you run headless VirtualBox-machines on your FreeNAS server, in case you need a different operating system than FreeBSD. I&amp;#8217;m using it to run Icinga and &lt;a href="https://www.zufallsheld.de/2014/09/15/install-headphones-and-a-musicbrainz-server-in-your-freenas/"&gt;Musicbrainz&lt;/a&gt;. There&amp;#8217;s only one problem: After a server reboot (yes, that happens) the VMs …&lt;/p&gt;</description><author>zufallsheld</author><pubDate>Tue, 06 Jan 2015 01:00:00 GMT</pubDate><guid isPermaLink="true">https://www.zufallsheld.de/2015/01/06/enabling-autostart-of-virtualbox-vms-on-freenas/</guid></item><item><title>Finding Neverland</title><link>https://olshansky.info/movie/finding_neverland/</link><description>Olshansky's review of Finding Neverland</description><author>🦉 olshansky 🦁</author><pubDate>Mon, 05 Jan 2015 03:02:13 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/movie/finding_neverland/</guid></item><item><title>Validating user objects with Cerberus</title><link>https://nicolaiarocci.com/validating-user-objects-cerberus/</link><description>&lt;p&gt;People keep telling me that they want to validate class and instance attributes (object properties) with &lt;a href="https://github.com/nicolaiarocci/cerberus"&gt;Cerberus&lt;/a&gt;. While it certainly wasn’t conceived with that goal in mind, it is actually very possible to leverage both the Python &lt;a href="https://docs.python.org/2/reference/datamodel.html"&gt;data model&lt;/a&gt; and Cerberus &lt;a href="http://cerberus.readthedocs.org/en/latest/#custom-validators"&gt;extensibility&lt;/a&gt; to achieve object validation.&lt;/p&gt;
&lt;h2 id="nuts--bolts"&gt;Nuts &amp;amp; Bolts&lt;/h2&gt;
&lt;p&gt;Let’s say that we have a simple class:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; class Person(object):
...     pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We create a &lt;code&gt;Person&lt;/code&gt; instance and add a few properties and values:&lt;/p&gt;</description><author>Nicola Iarocci</author><pubDate>Mon, 05 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://nicolaiarocci.com/validating-user-objects-cerberus/</guid></item><item><title>A New Year's Prayer</title><link>http://evantravers.com/articles/2015/01/05/a-new-years-prayer/</link><description>&lt;p&gt;&lt;img alt="Happy" src="https://images.evantravers.com/articles/2015/01/newyear.jpg" /&gt;&lt;/p&gt;&lt;p&gt;Jesus, thank you for another new year... it's been a wild season, and I am
grateful as I reflect upon what you have accomplished in my life and in my
family's lives this year. Thank you for grace and mercy seen and unseen.&lt;/p&gt;
&lt;p&gt;Lord, the joy of New Year's Day is quickly invaded by the worries of this life,
decisions to be made and lived with, calamities I can't control but fear that
I've caused, reputations, relationships, jagged emotions tied to barely
remembered mistakes that tear at my heart and demand I surrender myself to
their hate.&lt;/p&gt;
&lt;p&gt;I honestly don't know fully how to deal with such a thing. I &lt;em&gt;do&lt;/em&gt; know for
certain that the Lord of all creation is in charge of my life, that You come
running to meet me, and that when you look at me you see the righteousness of
Christ instead of my sin. I stare up at a bleak sky and instead of an endless
unknown void I know that your glory fills all infinity.&lt;/p&gt;
&lt;p&gt;Help my heart to know fully that you uphold, propel, restrain all things. My
mind gratefully accepts this fact, but my emotions still rage. Teach me how to
quiet my heart, to relinquish control, to accept my gentle shepherd's lead
rather than constantly surging towards what I think I need. I want to rest
beside the still waters this year. Help me to hear your voice and know that you
will never leave me nor forsake. Calm my willful soul. In the name of the
Prince of Peace, amen.&lt;/p&gt;</description><author>trv.rs</author><pubDate>Mon, 05 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">http://evantravers.com/articles/2015/01/05/a-new-years-prayer/</guid></item><item><title>Setting up RoCE on aarch64 Ubuntu</title><link>https://makedist.com/posts/2015/01/05/setting-up-roce-on-aarch64-ubuntu/</link><description>Resolving kernel module dependency issues with RoCE.</description><author>Noah Watkins</author><pubDate>Mon, 05 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://makedist.com/posts/2015/01/05/setting-up-roce-on-aarch64-ubuntu/</guid></item><item><title>Indie Web</title><link>https://blog.separateconcerns.com/2015-01-04-indie-web.html</link><description>&lt;p&gt;It is not a secret that I don’t like Web technology. I prefer XHTML to HTML5, I think JavaScript is a terrible language, and don’t get me started on microformats (let’s just say that SoC &amp;gt; DRY…). I’d rather see this mess replaced by something much simpler that &lt;strong&gt;only&lt;/strong&gt; deals with linked documents and feeds, and maybe a separate platform for portable applications.&lt;/p&gt;
&lt;p&gt;However, the Web is here to last, and given its importance, its centralization is concerning. This is why I am interested in the &lt;a href="http://indiewebcamp.com/"&gt;Indie Web&lt;/a&gt; movement, which I see as part of the larger effort to decentralize Internet. By the way, if you are into this and live in Paris, check out &lt;a href="http://www.meetup.com/Paris-Meetup-pour-la-decentralisation-dInternet/"&gt;this meetup&lt;/a&gt; which is held every six weeks at Mozilla’s office. I have been there every time since its inception and it is well worth it.&lt;/p&gt;
&lt;p&gt;Anyway, I have seen today via my feed reader that &lt;a href="http://tantek.com/2014/357/b1/2015-indieweb-site-launch-commitment"&gt;some people had made commitments for 2015-01-01&lt;/a&gt;. I am a bit late, but I decided to follow suit by adding &lt;a href="http://indiewebcamp.com/Why_web_sign-in"&gt;Web sign-in&lt;/a&gt; and &lt;a href="http://indiewebcamp.com/h-card"&gt;a h-card&lt;/a&gt; to &lt;a href="https://catwell.info"&gt;my home page&lt;/a&gt;. I will probably add &lt;a href="http://indiewebcamp.com/h-entry"&gt;h-entry&lt;/a&gt; markup to this blog later this week, too.&lt;/p&gt;
&lt;p&gt;If you want to do the same, you can use &lt;a href="http://indiewebify.me/"&gt;this handy tool&lt;/a&gt; to check everything is working.&lt;/p&gt;</description><author>Separate Concerns</author><pubDate>Sun, 04 Jan 2015 21:10:00 GMT</pubDate><guid isPermaLink="true">https://blog.separateconcerns.com/2015-01-04-indie-web.html</guid></item><item><title>The 100: Season 1</title><link>https://olshansky.info/tv/the_100_season_1/</link><description>Olshansky's review of The 100: Season 1</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 03 Jan 2015 05:15:14 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_100_season_1/</guid></item><item><title>The 100: Season 2</title><link>https://olshansky.info/tv/the_100_season_2/</link><description>Olshansky's review of The 100: Season 2</description><author>🦉 olshansky 🦁</author><pubDate>Sat, 03 Jan 2015 05:13:19 GMT</pubDate><guid isPermaLink="true">https://olshansky.info/tv/the_100_season_2/</guid></item><item><title>Supercharge your Android Application-3(Data).</title><link>https://prashamhtrivedi.in/supercharge-android-application-3.html</link><description>In the third part of the series, we will focus on how to download, save and preserve your data.</description><author>Prasham H Trivedi</author><pubDate>Sat, 03 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://prashamhtrivedi.in/supercharge-android-application-3.html</guid></item><item><title>Thank You Pat</title><link>https://captnemo.in/blog/2015/01/03/thank-you-pat/</link><description>&lt;p&gt;I’m a lazy reader. I’ll often start books and leave them halfway, often juggling 3-4 books at the same time. I read in sprints, often spending a few days just finishing lots of books followed by reading nothing for the next few weeks, perhaps. But that doesn’t mean I don’t appreciate good books. This is the story of how I found my favorite writer, and how I discovered the wonderful books that I enjoy so deeply.&lt;/p&gt;

&lt;p&gt;I don’t write a journal regularly, but if I did, one of my favorite things to do with it is to figure out the little things that matter; to separate out the strands and understand the connections and the motivations behind where I am today&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;It is our choices…that show what we truly are, far more than our abilities.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Albus Dumbledore&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;What I love to do is figure out those tiny choices, and the &lt;em&gt;reasoning&lt;/em&gt; behind them that led me to today.&lt;/p&gt;

&lt;p&gt;I read Patrick Rothfuss’s &lt;a href="https://www.goodreads.com/book/show/186074.The_Name_of_the_Wind" title="The Name of the Wind, by Patrick Rothfuss"&gt;“Name of the Wind”&lt;/a&gt; a long time back. It was an amazing book, which I found on a site called &lt;a href="http://bestfantasybooks.com/"&gt;bestfantasybooks.com&lt;/a&gt;. In my defense, I was an avid Harry Potter fan at the time, looking for similar books, and I’d decided that reading the best fantasy would be good preparation before I could write my own.&lt;/p&gt;

&lt;p&gt;As it so happens, “Name of the Wind” was a superb book. The kind that made me squirm in delight when I saw that the sequel was already out. So I did what any self-respecting book-lover would do: read it in a single stretch, screwing up my exams in the process. I didn’t sleep much for those few days (its a pretty long book), but I enjoyed every bit of it.&lt;/p&gt;

&lt;p&gt;I started following Pat’s (hilarious) &lt;a href="http://blog.patrickrothfuss.com/" title="Pat's blog"&gt;blog&lt;/a&gt;, where he often posted tidbits of his life, and came across &lt;a href="https://www.goodreads.com/review/show/315662446" title="Patrick's review of The Alloy of Law"&gt;his review&lt;/a&gt; of “The Alloy of Law” by Brandon Sanderson:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;…&lt;br /&gt;
My last point is that Sanderson has now been added to a very short list of authors. Specifically, the list authors whom I wish to kill so that I might eat their livers and thereby gain their power.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Any author that Patrick wanted to kill sounded like a great one to read, so I started “The Alloy of Law”. I finished the book in a few short hours. Its paced excellently, and the action keeps on coming. I’d never really read much urban fantasy before, and despite me never having read Mistborn (Alloy is a sequel to the Mistborn trilogy) I was sucked in.&lt;/p&gt;

&lt;p&gt;And here I am, counting down the next few days, waiting for the release of &lt;a href="https://www.goodreads.com/book/show/15704459.Firefight" title="Firefight, by Brandon Sanderson"&gt;Firefight&lt;/a&gt;, Sanderson’s next book.&lt;/p&gt;

&lt;p&gt;So, thank you Pat. Thanks for introducing me to my favorite writer. Thank you for writing those wonderful books, and keep on reviewing all that you love (I’m reading &lt;a href="https://www.goodreads.com/book/show/18659623-through-the-woods" title="Through the Woods, by Emily Carroll"&gt;“Through the Woods”&lt;/a&gt; next).&lt;/p&gt;

&lt;p&gt;If you are looking for a nice fat book to read next, I heartily recommend &lt;a href="https://www.goodreads.com/book/show/186074.The_Name_of_the_Wind" title="The Name of the Wind, by Patrick Rothfuss"&gt;“The Name of the Wind”&lt;/a&gt; and &lt;a href="https://www.goodreads.com/book/show/7235533-the-way-of-kings" title="Way of Kings, by Brandon Sanderson"&gt;“The Way of Kings”&lt;/a&gt;.&lt;/p&gt;</description><author>Nemo's Home</author><pubDate>Sat, 03 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://captnemo.in/blog/2015/01/03/thank-you-pat/</guid></item><item><title>Your API is not RESTful</title><link>https://3059274a.danpalmer-me.pages.dev/2015-01-03-your-api-is-not-restful/</link><description>RESTful APIs are a popular thing, but is anyone really doing it properly? This post highlights some common flaws in RESTful APIs, and explains why it&amp;rsquo;s important that we improve them beyond the current standard.</description><author>Dan Palmer</author><pubDate>Sat, 03 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://3059274a.danpalmer-me.pages.dev/2015-01-03-your-api-is-not-restful/</guid></item><item><title>Run a full Wikipedia copy from any computers</title><link>https://blog.nobugware.com/post/2015/01/02/run-a-full-wikipedia-copy-from-any-computers/</link><description>Today I&amp;rsquo;m releasing Gozim a side project written in Go.
It&amp;rsquo;s a set of tools to serve ZIM files, (compressed copy of Wiki articles), use it to run your full copy of Wikipedia off the grid.
It runs great on a small computer as the Raspberry Pi or your own laptop.
It could be a solution to give access to knowledge in countries without stable internet connections.</description><author>Fabrice Aneche</author><pubDate>Fri, 02 Jan 2015 23:50:45 GMT</pubDate><guid isPermaLink="true">https://blog.nobugware.com/post/2015/01/02/run-a-full-wikipedia-copy-from-any-computers/</guid></item><item><title>Screenshot Saturday 205</title><link>https://etodd.io/2015/01/02/screenshot-saturday-205/</link><description>&lt;p&gt;For the first time in the history of Lemma, I'm actually keeping up with my self-assigned pace of one new level per week.&lt;/p&gt;
&lt;p&gt;These past two weeks I made two more frost levels. The plan calls for one more frost level, then it's on to the other two biomes.&lt;/p&gt;
&lt;div class="video"&gt;&lt;video loop="loop"&gt;&lt;source src="https://etodd.io/assets/LastTangibleAustralianfurseal.mp4" /&gt;&lt;/video&gt;&lt;/div&gt;
&lt;a href="https://etodd.io/assets/fST31FI.jpg"&gt;&lt;img src="https://etodd.io/assets/fST31FIl.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;
	Both of these levels have interesting quirks and unique features.
	They're probably too tough right now, but I'm scheduling plenty of time to playtest and sand down the sharp edges.
&lt;/p&gt;</description><author>Evan Todd</author><pubDate>Fri, 02 Jan 2015 23:00:00 GMT</pubDate><guid isPermaLink="true">https://etodd.io/2015/01/02/screenshot-saturday-205/</guid></item><item><title>New Beginnings</title><link>https://tiltingatwindmills.dev/new-beginnings/</link><description>It's been a long time coming, but I think it's finally time for me
to shutter GreaterDebater. Suffice it to say, the site never
really…</description><author>Tilting at Windmills</author><pubDate>Fri, 02 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://tiltingatwindmills.dev/new-beginnings/</guid></item><item><title>The 31. Chaos Communication Congress</title><link>https://bastibe.de/2015-01-01-31c3.html</link><description>&lt;p&gt;Every year, between Christmas and New Year's Eve, a very special convention is held: The Chaos Computer Club hosts the Chaos Communication Congress. Among my peers, this is just &amp;quot;The Congress&amp;quot;, the real highlight at the end of our year.&lt;/p&gt;
&lt;p&gt;Don't be fooled by the name though, The Congress is not just some conference, with talks and meetings and business cards. The Congress is where every internet citizen, technologist, hacker, DIYer, net-politician, programmer, computer scientist, or geek convenes to exchange ideas. It is a place of levity, amazement and enlightening.&lt;/p&gt;
&lt;p&gt;&lt;img alt="CCH" src="http://bastibe.de/static/2014-12/CCH.thumb.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;The Congress lasts four days, and every day is packed full of exciting talks. My favorites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://31c3.mirror.speedpartner.de/congress/2014/h264-hd/31c3-6450-de-en-Ich_sehe_also_bin_ich_Du_hd.mp4"&gt;Ich sehe, also bin ich … Du&lt;/a&gt; (German)
As it turns out, you don't need special hardware to defeat defeat biometric scanners or passwords. A digital camera and some ingenuity is often enough.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://31c3.mirror.speedpartner.de/congress/2014/h264-hd/31c3-6573-en-de-From_Computation_to_Consciousness_hd.mp4"&gt;From Computation to Consciousness&lt;/a&gt; (English)
This really resonated with me: What is consciousness? (Why) are animals or computers conscious or not? What does it all mean? Really, this is a computationally motivated introduction to constructivism. Highly recommended.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://31c3.mirror.speedpartner.de/congress/2014/h264-hd/31c3-6558-de-en-Traue_keinem_Scan_den_du_nicht_selbst_gefaelscht_hast_hd.mp4"&gt;Traue keinem Scan, den du nicht selbst gefälscht hast&lt;/a&gt; (German)
The story of an entertaining person discovering that a scanned PDF does not necessarily contain the same text that was scanned if your scanner was built by Xerox.
All of these talks and &lt;em&gt;many&lt;/em&gt; more are also &lt;a href="http://31c3.mirror.speedpartner.de/congress/2014/h264-hd/"&gt;available online&lt;/a&gt;, and I highly recommend you watch some of them. But The Congress is not just talks; this is where all the German hackspaces and user groups meet and present their projects. Walking through the halls, there are laser shows, quadrocopters, 3D printers, stitching machines, automatic cocktail mixers, mechanical and human musicians, and so much more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="hand" src="http://bastibe.de/static/2014-12/hand.thumb.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;At its core though, this is a place where a bunch of like-minded people meet and take over a convention center. The Congress happens in the CCH, the Hamburg Convention Center. Over the course of the four days of The Congress, this building transforms from a sterile business location to a colorful geek-party. Within a day, all the lights in the building are somehow turned colorful, a pneumatic tube network sends messages across the building, there are lounges and coffee rooms, and strange and beautiful sculptures of light and electronics show up all over the place. Just walking across this cornucopia of light and sound is a treat for the senses.&lt;/p&gt;
&lt;p&gt;And this is just the natural thing that happens if you let a bunch of creative people do their thing. It is really a crowd like no other: Nowhere else have I seen such an open-minded and approachable crowd. There are no unpleasant drunk people, no fights, no harassment. All over the place, people talk to strangers, adults and children build things together, and men and women interact as equals.&lt;/p&gt;
&lt;p&gt;The Congress is really unique. I can't recommend it enough. If you can free up those four days between Christmas and New Year's Eve at all, go there. You won't regret it!&lt;/p&gt;</description><author>bastibe.de</author><pubDate>Thu, 01 Jan 2015 02:00:00 GMT</pubDate><guid isPermaLink="true">https://bastibe.de/2015-01-01-31c3.html</guid></item></channel></rss>